通过smtplib库使用ssl安全连接发送邮件

通过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退信原因:发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件。
解决方法:邮件主题不包含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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值