想使用python发送邮件这个功能实现自动化测试报告发送到邮箱,结果处处碰壁。废话不多说。
最帮助到我的两篇文章分别是:
在这篇文章中我知道了一个惊天大新闻,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.https://blog.youkuaiyun.com/Nurbiya_K/article/details/104572568smtplib.SMTPServerDisconnected: Connection unexpectedly closed解决方法-优快云博客
https://blog.youkuaiyun.com/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的是已关闭状态,我开启了第二个还是不能发送,所以建议直接开启第一个。