1、QQ邮箱开通SMTP权限,并获取授权码
QQ邮箱---->设置---->账户---->开启服务---->IMAP/SMTP服务---->获取授权码
发送方和接收方都必须开通
2、发送纯文本邮件:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 配置
mail_host = 'smtp.qq.com' # 服务器
mail_port = 587 # 端口
mail_sender = '******@qq.com' # 发送者邮箱
mail_psw = '******' # 口令,不是邮箱密码
mail_receivers = ['******@qq.com'] # 接收者邮箱
# 内容
msg_content = '邮件测试内容'
msg_subject = 'SMTP邮件测试'
msg_from = '发送者'
msg_to = '接受者'
msg = MIMEText(msg_content, 'plain', 'utf-8') # 纯文本内容
msg['Subject'] = Header(msg_subject, 'utf-8') # 主题
msg['From'] = Header(msg_from, 'utf-8') # 发送者名称
msg['To'] = Header(msg_to, 'utf-8') # 接收者名称
# 发送
try:
stmpObj = smtplib.SMTP(mail_host, mail_port) # 配置服务器和端口
stmpObj.starttls() # 先加密,部分邮箱服务商要求加密传输,避免被窃听
stmpObj.login(mail_sender, mail_psw) # 登录
stmpObj.sendmail(mail_sender, mail_receivers, msg.as_string()) # 发送邮件 stmpObj.quit()
print('发送成功')except smtplib.SMTPException as e: print('Error:', e)
# 构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain',最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。
# as_string()把MIMEText对象变成str
运行结果:
3、发送HTML格式邮件
msg_content = ''' <p>邮件测试内容</p> <p><a href='http://www.baidu.com'>百度链接</a></p> ''' msg = MIMEText(msg_content, 'html', 'utf-8') # 带HTML文本
运行结果:
4、同时支持HTML和Plain格式
msg = MIMEMultipart('alternative') msg['Subject'] = Header(msg_subject, 'utf-8') # 主题 msg['From'] = Header(msg_from, 'utf-8') # 发送者名称 msg['To'] = Header(msg_to, 'utf-8') # 接收者名称 msg.attach(MIMEText(str('Python测试内容'),'plain','utf-8')) msg.attach(MIMEText('<p><a href="http://www.baidu.com"></a></p>','html','utf-8'))
5、发送带附件的邮件
# 如果Email中要加上附件怎么办?带附件的邮件可以看做包含若干部分的邮件: # 文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身, # 然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可:
# 邮件对象 msg = MIMEMultipart() msg['Subject'] = Header(msg_subject, 'utf-8') # 主题 msg['From'] = Header(msg_from, 'utf-8') # 发送者名称 msg['To'] = Header(msg_to, 'utf-8') # 接收者名称 # 邮件正文MIMEText msg.attach(MIMEText(msg_content, 'plain', 'utf-8')) # 邮件附件--图片 attachment = MIMEBase('image','png',filename = 'bd_logo1.png') attachment.add_header('Content-Disposition','attachment',filename = 'bd_logo1.png') attachment.add_header('Content-ID','<logo>') attachment.add_header('X-Attachment-Id','logo') fp = open('bd_logo1.png','rb') attachment.set_payload(fp.read()) # 加载附件内容 encoders.encode_base64(attachment) # 用base64编码 msg.attach(attachment)
# 要把图片嵌入到邮件正文中,我们只需按照发送附件的方式,先把邮件作为附件添加进去, # 然后,在HTML中通过引用src="cid:0"就可以把附件作为图片嵌入了。 # 如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。
6、继承关系
# 构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象, # 如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来, # 就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
Message +- MIMEBase +- MIMEMultipart +- MIMENonMultipart +- MIMEMessage +- MIMEText +- MIMEImage
参考链接: