工作中总有一些发送邮件的需求,虽然python提供了很好用的内置库,但是每次都写一遍很难受。通过总结经验,写了下面这个小工具,支持发送文本邮件、html邮件、还有可以添加附件。再用到的时候只需要加到项目中,引用即可,或者可以直接当一个脚本使用。
1 # -*- coding:utf-8 -*-
2 """
3 邮件发送小工具 4 """ 5 __author__ = "shu2015626" 6 7 import os 8 import smtplib 9 import logging 10 import datetime 11 import traceback 12 from typing import Dict, List, Sequence 13 from collections.abc import Iterable 14 from email.header import Header 15 from email.mime.text import MIMEText 16 from email.utils import formataddr, parseaddr 17 from email.mime.multipart import MIMEMultipart 18 from email.mime.application import MIMEApplication 19 20 import jinja2 21 22 logger = logging.getLogger('proj') 23 24 25 class EmailOper(object): 26 def __init__(self, email_host: str, email_port: int, email_sender: str, sender_pass: str, sender_alias: str = None): 27 """ 28 配置邮件发送服务 29 :param email_host: 发送邮件的主机 30 :param email_port: 邮件发送端口 31 :param email_sender: 发件人 32 :param sender_pass: 发件人密码 33 :param sender_alias: 发件人别称 34 """ 35 self.__email_host = email_host 36 self.__email_port = email_port 37 self.__email_sender = email_sender 38 self.__sender_pass = sender_pass 39 self.__sender_alias = sender_alias or self.__email_sender.split("@", 1)[0] 40 41 @property 42 def email_host(self): 43 return self.__email_host 44 45 @email_host.setter 46 def email_host(self, value: str): 47 self.__email_host = value 48 49 @property 50 def email_port(self): 51 return self.__email_port 52 53 @email_port.setter 54 def email_port(self, value: int): 55 self.__email_port = value 56 57 @property 58 def email_sender(self): 59 return self.__email_sender 60 61 @email_sender.setter 62 def email_sender(self, value: str): 63 self.__email_sender = value 64 65 @property 66 def sender_pass(self): 67 return self.__sender_pass 68 69 @sender_pass.setter 70 def sender_pass(self, value: str): 71 self.__sender_pass = value 72 73 @property 74 def sender_alias(self): 75 return self.__sender_alias 76 77 @sender_alias.setter 78 def sender_alias(self, value: str): 79 self.__sender_alias = value 80 81 def build_html_email(self, package_name: str, template_name: str, **context) -> str: 82 """ 83 用法同 flask.render_template: 84 85 build_html_email('package', 'template.html', var1='foo', var2='bar') 86 :param package_name: 87 :param template_name: 88 :param context: 89 :return: 90 """ 91 env = jinja2.Environment( 92 loader=jinja2.PackageLoader(package_name, 'templates') 93 ) 94 template = env.get_template(template_name) 95 96 return template.render(**context) 97 98 def __format_receivers(self, receivers: Sequence): 99