python发送邮件注意事项及源码,找错3小时含泪总结!!!

想使用python发送邮件这个功能实现自动化测试报告发送到邮箱,结果处处碰壁。废话不多说。

最帮助到我的两篇文章分别是:

Python实现邮件发送踩过的坑(535, b'Error: authentication failed'+554, b'DT:SPM 163 smtp13)_python发送邮件添加邮件跟踪不生效-CSDN博客

在这篇文章中我知道了一个惊天大新闻,okey,也许只是我不知道,在填写配置第三方服务的密码时,需要写的是授权码,而不是账户的密码,这困扰了我很久,如果已经知道了,可以跳过。

接下来,是这篇

这两篇解决了

ValueError: server_hostname cannot be an empty string or start with a leading dot.

&&

smtplib.SMTPServerDisconnected: Connection unexpectedly closed

两个报错,很神奇,竟然报错不一样,也许我不懂更深层的逻辑,但确实我修改了这个地方就不报错了。

我的源码:smtplib.SMTP()

正确/不报错用法:server=smtplib.SMTP_SSL('smtp.qq.com')

ValueError: server_hostname cannot be an empty string or start with a leading dot.icon-default.png?t=N7T8https://blog.csdn.net/Nurbiya_K/article/details/104572568smtplib.SMTPServerDisconnected: Connection unexpectedly closed解决方法-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/zin521/article/details/102571935?spm=1001.2014.3001.5502下面是我写了可以通过的源码(仅供参考):

这里需要注意一下163给163发可以发,163给qq发就会被退回,目前还没找到解决原因,如果有人解决可以呼我,另外源代码也是在csdn某个大佬处爬的,忘了是哪个了。

class SendEmail:
    def __init__(self, host, port, user, password):
        self.__host = host
        self.__port = port
        self.__user = user
        self.__password = password
        self.smtp = smtplib.SMTP()
        # 链接指定服务器
        self.smtp.connect(host=self.__host, port=self.__port)
        # 登陆,需要登陆邮箱和授权密码
        self.smtp.login(user=self.__user, password=self.__password)

    def send_message(self, content, subtype, charset=None, from_addr=None, to_addrs=None, header_text=None):
        # 构造MIMEText对象,参数为:正文,MIME的subtype,编码方式
        self.message = MIMEMultipart()
        self.message.attach(MIMEText(content, subtype, charset))  # 正文内容   plain代表纯文本,html代表支持html文本
        # self.message = MIMEText(content,subtype, charset)
        self.message["From"] = Header(from_addr)  # 可自定义
        if isinstance(to_addrs, list):
            to_addrs_str = ','.join(to_addrs)
        else:
            to_addrs_str = to_addrs
        self.message["To"] = Header(to_addrs_str)
        self.message['Subject'] = Header(header_text, 'utf-8')
        self.smtp.sendmail(from_addr=from_addr, to_addrs=to_addrs_str, msg=self.message.as_string())

def send_emailMessage():
    # 创建 SMTP 对象
    smtp = smtplib.SMTP_SSL("smtp.163.com")
    # 连接(connect)指定服务器
    smtp.connect(host="smtp.163.com", port=465)
    # 登录,需要:登录邮箱和授权码
    smtp.login(user="xxx@163.com", password="smtp授权码")
    message = MIMEText('xxx', 'plain', 'utf-8')  # 此处为文本,设置为plain
    message['From'] = Header("xxx@163.com")  # 发件人的昵称
    message['To'] = Header("xxx@qq.com")  # 收件人的昵称
    message['Subject'] = Header('xxx', 'utf-8')  # 定义主题内容
    print(message)
    smtp.sendmail(from_addr="xxx@163.com", to_addrs="xxx@qq.com", msg=message.as_string())


if __name__ == '__main__':
    send_emailMessage()

不知道怎么看授权码的可以参考下图,未开启SMTP的是已关闭状态,我开启了第二个还是不能发送,所以建议直接开启第一个。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值