用python实现自动发邮件的功能

炒沙作縻终不饱,缕冰文章费工巧。这篇文章主要讲述用python实现自动发邮件的功能相关的知识,希望能为你提供帮助。
一、用python实现自动发邮件的思路如下:使用Python发送邮件, 需要使用smtplib与email两个模块
画出图就是这么个意思:

用python实现自动发邮件的功能

文章图片

也就是说email模块负责构造邮件;smtplib模块负责发送邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、html邮件以及带附件的邮件。
首先, 我们来构造一个简单的邮件。
#代码片段 from email.mime.text import MIMEText import smtplib msg = MIMEText(\'hello, Python auto send email\', \'plain\', \'utf-8\')

在这里, 我们把email模块与smtplib模块引入进来,我们还使用MIMEText构造了邮件内容。
MIMEText对象中, 有三个参数。
用python实现自动发邮件的功能

文章图片

然后通过SMTP发送邮件出去。
现在有了邮件的正文, 但是还缺少, 发件人,收件人; 接下来,我们向用户收集信息。
#代码片段 # 输入Email地址和口令: from_addr = input(\'From: \') password = input(\'Password: \') # 输入SMTP服务器地址: smtp_server = input(\'SMTP server: \') # 输入收件人地址: to_addr = input(\'To: \')

在这里, 我们需要拿到, 发件人的邮箱,邮箱的密码, SMTP服务器地址, 还有收件人的邮箱。
这个STMP服务器地址是什么?
SMTP服务器地址,实际上就是代收发服务器地址,是由邮箱服务商提供的。说白了,你用哪家公司的邮箱, 就是哪家公司收发邮件服务器的地址。
在本文中编写的程序以QQ邮箱来测试. 使用QQ邮箱的收发邮件服务器的地址。
QQ邮箱SMTP服务器地址:smtp.qq.com, 端口465, QQ邮箱默认的端口是25, 我们这里使用的是加密端口465。
好了, 接下来我们要开始配置SMTP服务了.
#代码片段 server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465 server.set_debuglevel(1)#调试级别 #用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。

好了,接下来我们就要想着发送邮件了, 完成SMTP发送邮件功能
#代码片段 server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string())

login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。
sendmail()方法就是发邮件,需要引入三个参数:
第一个参数:from_addr是发件人的邮箱地址
第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。
第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。
【用python实现自动发邮件的功能】接下来我们整合所有代码.如下:
from email.mime.text import MIMEText import smtplib msg = MIMEText(\'hello, Python auto send email\', \'plain\', \'utf-8\') # 输入Email地址和口令: from_addr = input(\'请输入发件人的邮箱号码From: \') password = input(\'请输入发件人的邮箱密码Password: \') # 输入SMTP服务器地址: smtp_server = input(\'请输入邮箱服务器地址SMTP server: \') # 输入收件人地址: to_addr = input(\'请输入收件人邮箱地址To: \')server = smtplib.SMTP_SSL(smtp_server, 465) # SMTP协议加密端口是465 server.set_debuglevel(1) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit()

好了,运行一下上面代码, 观察终端里的效果。
发现报错了:SMTPAuthenticationError: (535, b\'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256\')
如果出现这种错误, 就说明邮箱出现授权问题. 也就是邮箱的SMTP服务没有开启。
解决办法请参考:< https://blog.51cto.com/u_5839280/3815351>
问题解决后,运行代码,就可以在收件人信箱中收到我们刚发送的Email,如下图
用python实现自动发邮件的功能

文章图片

仔细观察上图,会发现,现在还存在如下两个问题: 1.邮件没有主题; 2.收件人的名字没有显示为友好的名字,比如某某先生 ;
这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件。
二、用python编写自动发邮件的代码如下:对以上代码进行完善后:
# 1、encoders模块负责编码 # 2、Header模块负责处理邮件头 # 3、MIMEText模块负责处理文本 # 4、parseaddr模块与formataddr模块 负责将输入的内容格式化 # 5、smtplib模块负责发送邮件 from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib# 用来处理格式化文本,将格式化的结果作为返回值传出去 def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, \'utf-8\').encode(), addr)) # 输入Email地址和口令: from_addr = input(\'请输入发件人的邮箱号码From: \') password = input(\'请输入发件人的邮箱密码Password: \') # 输入SMTP服务器地址: smtp_server = input(\'请输入邮箱服务器地址SMTP server: \') # 输入收件人地址: to_addr = input(\'请输入收件人邮箱地址To: \')# 邮件正文内容 content = \'\'\' 亲爱的朋友: 你好! 恭喜你坚持到现在! 继续努力加油吧,未来可期,奥利给! \'\'\'# 把From、To和Subject添加到MIMEText中,才是一封完整的邮件 # 将发送邮箱、接收邮箱、邮件主题格式化 msg = MIMEText(content, \'plain\', \'utf-8\') msg[\'From\'] = _format_addr(u\'英子 < %s> \' % from_addr) msg[\'To\'] = _format_addr(u\'管理员 < %s> \' % to_addr) msg[\'Subject\'] = Header(u\'来自好友的问候……\', \'utf-8\').encode()# SMTP协议加密端口是465 server = smtplib.SMTP_SSL(smtp_server,465)# 调试级别,用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息 server.set_debuglevel(1)#login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。 server.login(from_addr, password) #sendmail()方法就是发邮件,需要引入三个参数: # 第一个参数:from_addr是发件人的邮箱地址 # 第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。 # 第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。 server.sendmail(from_addr, [to_addr], msg.as_string())#server.quit()语句,是邮件发送结束后,停止服务的意思. server.quit()

收到的邮件如下:
用python实现自动发邮件的功能

文章图片


    推荐阅读