python发送QQ邮件
程序员文章站
2022-07-07 19:30:53
第一步,登录QQ邮箱, 走到设置 开启pop3服务 和SMTP服务SMTP 服务相当于一个服务器 发送邮件使用SMTP服务器第二步 开启成功后,我们会拿到秘钥串 ,也就是相当于我们登录SMTP服务 我们就有了一个权限(发送邮件的权限)代码登录的时候我们输入自己的QQ邮箱,密码相当于秘钥串。第三步 代码完成 引入SMTPlib包(SMTP相关)和关于email操作的包 (发送邮件的相关)问题1 发送的是什么? 邮件 ,邮件的内容当然由关于邮件部分的包或者模块来操作。 问题2 是谁来发送这个问题?...
第一步,登录QQ邮箱, 走到设置 开启pop3服务 和SMTP服务
SMTP 服务相当于一个服务器 发送邮件使用SMTP服务器
第二步 开启成功后,我们会拿到秘钥串 ,也就是相当于我们登录SMTP服务 我们就有了一个权限(发送邮件的权限)代码登录的时候我们输入自己的QQ邮箱,密码相当于秘钥串。
第三步 代码完成 引入SMTPlib包(SMTP相关)和关于email操作的包 (发送邮件的相关)
问题1 发送的是什么? 邮件 ,邮件的内容当然由关于邮件部分的包或者模块来操作。 问题2 是谁来发送这个问题? SMTP 服务器来发送 ,由SMTP相关的模块来构造。
这里以qq邮箱举例
导包
from email.mime.text import MIMEText
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.header import Header
from email import encoders
from email.header import Header
from email.utils import parseaddr, formataddr
发送纯文本格式邮件
def _format_addr(s):
name, addr = parseaddr(s) # 解析邮件地址,name为邮件人,addr为邮件地址
return formataddr((Header(name, 'utf-8').encode(), addr)) # 格式化邮件地址
from_addr = 'xxxx@qq.com' #发送者邮箱
password = 'xxxx' #输入密码,此密码为邮箱的授权码
to_addr = 'xxxx@qq.com' #收件人地址
smtp_server = 'smtp.qq.com' #SMTP服务器地址
#这里有三个参数,第一个参数为邮件正文,第二个参数为邮件类型,传入'plain'表示纯文本,第三个参数'utf-8'是编码,以保证兼容多语言
msg = MIMEText('hello,send by Python.....','plain','utf-8')
msg['From'] = _format_addr('学生 <%s>' % from_addr) # 添加发件人
msg['To'] = _format_addr('老师 <%s>' % to_addr) # 添加收件人
msg['Subject'] = Header('SMTP测试', 'utf-8').encode() # 添加邮件主题
server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
server.login(from_addr, password) # 登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发邮件
server.quit()
发送HTML格式的邮件
在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:
#注意将第二个参数改为html
msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8')
发送txt格式的邮件
首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。
def _format_addr(s):
name, addr = parseaddr(s) # 解析邮件地址,name为邮件人,addr为邮件地址
return formataddr((Header(name, 'utf-8').encode(), addr)) # 格式化邮件地址
from_addr = 'xxxx@qq.com' #发送者邮箱
password = 'xxxx' #输入密码,此密码为邮箱的授权码
to_addr = 'xxxx@qq.com' #收件人地址
smtp_server = 'smtp.qq.com' #SMTP服务器地址
#创建一个带附件的实例
msg = MIMEMultipart()
#邮件正文内容
msg.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))
msg['From'] = _format_addr('学生 <%s>' % from_addr) # 添加发件人
msg['To'] = _format_addr('老师 <%s>' % to_addr) # 添加收件人
msg['Subject'] = Header('SMTP测试', 'utf-8').encode() # 添加邮件主题
#添加附件
mime = MIMEApplication(open('123.txt','rb').read())
mime.add_header('Content-Disposition', 'attachment', filename="123.txt")
msg.attach(mime)
server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25
server.starttls()
server.set_debuglevel(1) # 打印和SMTP服务器交互的所有信息
server.login(from_addr, password) # 登录SMTP服务器
server.sendmail(from_addr, [to_addr], msg.as_string()) #发邮件
server.quit()
发送图片附件
#创建一个带附件的实例
msg = MIMEMultipart()
msg.attach(MIMEText('这是测试Python发送附件功能....','plain','utf-8'))
msg['From'] = _format_addr('学生 <%s>' % from_addr) # 添加发件人
msg['To'] = _format_addr('老师 <%s>' % to_addr) # 添加收件人
msg['Subject'] = Header('SMTP测试', 'utf-8').encode() # 添加邮件主题
with open('123.jpg', 'rb') as f: # 打开需要添加的附件
# 创建MIMEBase对象,即附件内容
mime = MIMEBase('image', 'jpg', filename='123.jpg')
# 添加必要的头文件
mime.add_header('Content-Disposition', 'attachment', filename='123.jpg')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-ID', '0')
mime.set_payload(f.read()) # 读进附件的内容
encoders.encode_base64(mime) # 用base64编码
msg.attach(mime)
然后,按正常的邮件发送流程补充代码即可
若想在邮件正文中显示图片,需要先把图片作为附件,然后在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了
msg.attach(MIMEText('<html><body><h1>Hello, my friend...</h1>' +
'<p><img src="cid:0"></p>' +
'</body></html>', 'html', 'utf-8'))
这个时候图片不再作为附件发送,而是直接在邮件正文中显示。
如果有多张图片,则給它们编号后,引用不同的cid:x即可。
同时发送纯文本和html格式
通过创建MIMEMultipart对象,我们可以让邮件内容即支持plain,也支持HTML。
在创建MIMEMultipart时指定subtype是alternative:
msg = MIMEMultipart('alternative')
msg['From'] = ...
msg['To'] = ...
msg['Subject'] = ...
msg.attach(MIMEText('Hello, my friend...', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello, my friend...</h1></body></html>', 'html', 'utf-8'))
一旦收件人无法查看HTML格式的邮件,就会自动变为plain格式查看。
STMP加密
使用标准的25端口连接SMTP服务器时,使用的是明文传输,在发送的过程有可能被窃听。
想要给邮件加密,添加starttls()方法即可:
server = smtplib.SMTP(smtp_server, 25)
server.starttls()
总结
只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。
构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
可详细参考此文档:https://cloud.tencent.com/developer/article/1445126
本文地址:https://blog.csdn.net/weixin_44885134/article/details/107163301