通过smtplib库使用ssl安全连接发送邮件
需求 - 发送ssl安全邮件
使用126邮箱服务器通过ssl安全连接发送邮件。邮件内容为html格式,多个收件人。后续功能待补充。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import logging
import os
import smtplib
from email.header import Header
from email.mime.text import MIMEText
file_dir = os.path.dirname(__file__) # 被执行脚本目录
log_path = os.path.join(file_dir, 'test_mail.log') # 脚本同目录下运行日志
def create_logger(file, encoding='UTF-8'):
"""
创建logger对象,记录日志
:param file:
:param encoding:
:return:
"""
handler = logging.FileHandler(file, encoding=encoding)
logging_format = logging.Formatter(
'%(asctime)s - %(levelname)s -%(filename)s - %(funcName)s - %(lineno)s - %(message)s')
handler.setLevel(logging.INFO)
handler.setFormatter(logging_format)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(handler)
return logger
def generate_mail_msg(user, receivers, subject, content, content_type="plain"):
"""
生成邮件内容对象
msg["To"]不能是Header对象,如果是多个可以用","来连接传入字符串,使用逗号连接
:param user: 发件人
:param receivers: 收件人
:param subject: 邮件主题
:param content: 邮件内容
:param content_type: 邮件类型。分为html与plain
:return: MIMEText邮件内容对象
"""
msg = MIMEText(content, content_type, 'utf-8')
msg['From'] = Header("测试<{}>".format(user), 'utf-8')
msg['To'] = ",".join(["<{}>".format(r) for r in receivers])
msg['Subject'] = subject
return msg
def send_safe_mail(host, user, pwd, receivers, msg, port=465):
"""
使用ssl安全链接发送邮件:ssl(port: 465 & 994),创建SMTP_SSL对象,实现ssl安全连接
:param host: 126邮件服务器地址
:param user: 发件人
:param pwd: 授权码
:param receivers: 收件人
:param msg: 邮件内容对象
:param port: 126邮件服务器端口
:return:
"""
smtp_obj = None
try:
smtp_obj = smtplib.SMTP_SSL(host, port)
smtp_obj.login(user, pwd)
smtp_obj.sendmail(user, receivers, msg.as_string())
logging.info("{} send mail, subject {}".format(user, msg["Subject"]))
except Exception as e:
logging.error("fail to send mail {}, msg {}".format(e, msg.as_string))
finally:
smtp_obj.close()
def main():
mail_conf = {
"user": "***@126.com", # 发件人邮箱
"pwd": "***", # 邮箱授权码
"host": "smtp.126.com", # 126邮件服务器主机
"port": 465, # 126邮件服务器端口
"receivers": ["***@qq.com", "***@163.com"], # 收件人邮箱
}
msg_html = '<h3>hello</h3>'
subject = Header("结果", "utf-8")
msg = generate_mail_msg(mail_conf["user"], mail_conf["receivers"], subject, msg_html, content_type="html")
send_safe_mail(mail_conf["host"], mail_conf["user"], mail_conf["pwd"], mail_conf["receivers"], msg,
mail_conf['port'])
if __name__ == '__main__':
logger = create_logger(log_path)
main()
问题 - 邮件发生554退信
- 错误:554 DT:SPM,官方文档说明
554退信原因:发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件。
解决方法:邮件主题不包含test、测试等文字;生成MIMEText对象时,“from"参数不使用header对象
- 调整后代码
def generate_mail_msg(user, receivers, subject, content, content_type="plain"):
"""
生成邮件内容对象
msg["To"]不能是Header对象,如果是多个可以用","来连接传入字符串,使用逗号连接
:param user: 发件人
:param receivers: 收件人
:param subject: 邮件主题
:param content: 邮件内容
:param content_type: 邮件类型。分为html与plain
:return: MIMEText邮件内容对象
"""
# subject邮件主题不包含test、测试等文字。
msg = MIMEText(content, content_type, 'utf-8')
# msg['From'] = Header("RPA<{}>".format(user), 'utf-8')
msg['From'] = user # 不使用header对象
msg['To'] = ",".join(["<{}>".format(r) for r in receivers])
msg['Subject'] = subject
return msg