使用:https://www.yuque.com/u1046159/erg6ec/crqnud#VvPYQ
    SendEmail.py

    1. """
    2. 邮件发送工具
    3. Python对SMTP支持有smtplib和email两个模块:
    4. 1. email负责构造邮件
    5. 2. smtplib负责发送邮件。
    6. """
    7. import smtplib
    8. import ssl
    9. from email.header import Header
    10. from email.mime.multipart import MIMEMultipart
    11. from email.mime.text import MIMEText
    12. import attach as attach
    13. from loguru import logger
    14. from utils.ReadConfig import ReadConfig
    15. class SendMail:
    16. def __init__(self):
    17. """
    18. 初始化smtp服务器连接
    19. smtp 服务器端口,仅能使用25、465和587
    20. 25端口(明文传输)465端口(SSL 加密) 587端口(STARTTLS 加密)
    21. """
    22. self.cf = ReadConfig()
    23. # qq邮箱服务器地址
    24. self.mail_host = self.cf.get_email('mail_host')
    25. # 端口
    26. self.mail_port = self.cf.get_email('mail_port')
    27. # 用户名
    28. self.mail_user = self.cf.get_email('mail_user')
    29. # 密码(部分邮箱为授权码)
    30. self.mail_pass = self.cf.get_email('mail_pass')
    31. self.mail_sender = self.cf.get_email('mail_sender')
    32. # 根据不同的端口,用不同的方式连接
    33. if self.mail_port == "587":
    34. ctx = ssl.SSLContext(ssl.PROTOCOL_TLS)
    35. self.smtpObj = smtplib.SMTP(self.mail_host, self.mail_port)
    36. self.smtpObj.ehlo()
    37. self.smtpObj.starttls(context=ctx)
    38. elif self.mail_port == "25":
    39. self.smtpObj = smtplib.SMTP(self.mail_host, self.mail_port)
    40. elif self.mail_port == "465":
    41. self.smtpObj = smtplib.SMTP_SSL(self.mail_host, self.mail_port)
    42. # 连接
    43. self.smtpObj.connect(self.mail_host, self.mail_port)
    44. # 登录
    45. self.smtpObj.login(self.mail_user, self.mail_pass)
    46. def send_text_mail(self, subject, content, receivers):
    47. """
    48. 发送文本邮件
    49. :param subject: 邮件主题
    50. :param message: 邮件内容
    51. :param receivers: 邮件接受者
    52. :return:
    53. """
    54. # 邮件内容
    55. message = MIMEText(content, 'plain', 'utf-8')
    56. # 邮件主题
    57. message['Subject'] = Header(subject, 'UTF-8')
    58. # 发送方信息
    59. message['From'] = Header(self.mail_sender, 'utf-8')
    60. message['To'] = ','.join(receivers)
    61. try:
    62. # 发送
    63. self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())
    64. logger.info("mail has been send successfully. send to {} ".format(receivers))
    65. except smtplib.SMTPException as e:
    66. logger.error('error', e)
    67. def send_html_mail(self,subject, content, receivers):
    68. """
    69. 发送HTML格式邮件
    70. :param subject: 邮件主题
    71. :param message: 邮件内容
    72. :param receivers: 邮件接受者
    73. :return:
    74. """
    75. # 邮件内容
    76. message = MIMEText(content, 'html', 'utf-8')
    77. # 邮件主题
    78. message['Subject'] = Header(subject, 'UTF-8')
    79. # 发送方信息
    80. message['From'] = Header(self.mail_sender, 'utf-8')
    81. message['To'] = ','.join(receivers)
    82. try:
    83. # 发送
    84. self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())
    85. logger.info("mail has been send successfully. send to {} ".format(receivers))
    86. except smtplib.SMTPException as e:
    87. logger.error('error', e)
    88. def send_appendix_mail(self,subject, content, receivers):
    89. """
    90. 发送带附件的邮件
    91. """
    92. # 创建一个带附件的实例
    93. message = MIMEMultipart()
    94. message['From'] = Header(self.mail_sender, 'utf-8')
    95. message['To'] = ','.join(receivers)
    96. # 邮件主题
    97. message['Subject'] = Header(subject, 'UTF-8')
    98. # 邮件正文内容
    99. message.attach(MIMEText(content, 'plain', 'utf-8'))
    100. # 构造附件,传送当前目录下的 extract.py
    101. att = MIMEText(open('extract.py','rb').read(),'base64', 'utf-8')
    102. # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
    103. att["Content-Disposition"] = 'attachment; filename="extract.py"'
    104. message.attach(att)
    105. try:
    106. # 发送
    107. self.smtpObj.sendmail(self.mail_sender, receivers, message.as_string())
    108. logger.info("mail has been send successfully. send to {} ".format(receivers))
    109. except smtplib.SMTPException as e:
    110. logger.error('error', e)
    111. def exit(self):
    112. # 关闭会话
    113. self.smtpObj.quit()

    邮件配置通过读取配置文件实现的

    调用:

    1. if __name__ == '__main__':
    2. mail = SendMail()
    3. subject = "邮件工具类测试"
    4. message = "这是一个test"
    5. receivers = ['zhengxianyi@touch-spring.com']
    6. mail.send_appendix_mail(subject, message, receivers)