这里以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()
在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:
#注意将第二个参数改为html
msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8')
首先要创建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即可。
通过创建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格式查看。
使用标准的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
如对本文有疑问, 点击进行留言回复!!
听课笔记--Python数据分析--Numpy基础及基本应用
Python-定时任务APScheduler中两种调度器的区别
网友评论