python 实现使用163邮箱发送有图片的邮件
背景介绍
周末温习下python,正好最近在做监控,想着 给163邮箱发邮件,记录下来,方便备查。
邮件发送必须要知道邮件的 传输协议 SMTP SMTP (Simple Mail Transfer Proctol)即简单邮件传输协议,它是一组用于从源地址到目的地址传输邮件的协议,控制信件的中转方式。其默认端口是25。
本次使用的是163邮箱发送消息,需要获取 163 客户端的授权码,登录163邮箱执行以下操作。 用绑定的手机号,发送 9988 到指定的平台 验证消息。验证成功会生成 ==授权码== ,在下面的程序中会使用。
在 python 语言中支持 SMPT 的有 ==smtplib== 和 ==email== 两个模块 smtplib 负责发送邮件 email 负责构造邮件
发送邮件的完整代码如下所示
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
mail_text = 'hello,终于等到你,欢迎来到我的博客' # 邮件内容
mail_host = 'smtp.163.com' # 邮件服务器
mail_user = 'vip_***@163.com' # 发送邮件的用户
mail_pass = 'CBDVAAYHBKVTRRBC' # 客户端密码,注意不是登录密码
sender = 'vip_***@163.com' # 发送地址
receivers = ['9619*****@qq.com'] # 接收地址,可以是多个
# 拼接
textApart = MIMEText(mail_text, 'plain', 'utf-8')
# 构建邮件
msg = MIMEMultipart()
msg.attach(textApart)
msg['From'] = sender #发送人
msg['To'] = receivers[0]
msg['Subject'] = '消息提醒' #邮件主题
try:
smtp_obj = smtplib.SMTP()
smtp_obj.connect(mail_host, 25) # 25端口
smtp_obj.login(mail_user, mail_pass)
# 邮件发送
smtp_obj.sendmail(sender, receivers, msg.as_string())
smtp_obj.quit()
print('当前邮件成功发送!')
except smtplib.SMTPException as e:
print('当前邮件发送失败', e) # 打印错误
运行程序,即可发送邮件。成功结果如下所示。 ==以上内容是没有样式的文字,字数多的话是不太好看,那怎么发送好看,并且可以带照片的邮件呢?== 修改两处 第一、将邮件的内容拼接成 html 格式,发送成功后在页面能自动解析; 第二、修改 MIMEText 传输的方式为 html
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
mail_text = '''<h5> hello,终于等到你,欢迎来到我的博客</h5><p> 用心甘情愿的态度,过随遇而安的生活!<p> 欢迎关注我的个人公众号,分享北漂生活
<a href="https://img-blog.csdnimg.cn/ab1244a267e94c65bf1aee43f0cb964d.png"> 搜一搜哦~ </a> </p></p>''' # 邮件内容
mail_host = 'smtp.163.com' # 邮件服务器
mail_user = 'vip_***@163.com' # 发送邮件的用户
mail_pass = 'CBDVAAYHBKVTRRBC' # 客户端密码,注意不是登录密码
sender = 'vip_***@163.com' # 发送地址
receivers = ['9619******@qq.com'] # 接收地址,可以是多个
# 这里是类型使用的是 html
textApart = MIMEText(mail_text, 'html', 'utf-8')
# 构建邮件
msg = MIMEMultipart()
msg.attach(textApart)
msg['From'] = sender #发送人
msg['To'] = receivers[0]
msg['Subject'] = '消息提醒' #邮件主题
try:
smtp_obj = smtplib.SMTP()
smtp_obj.connect(mail_host, 25)
smtp_obj.login(mail_user, mail_pass)
# 邮件发送
smtp_obj.sendmail(sender, receivers, msg.as_string())
smtp_obj.quit()
print('当前邮件成功发送!')
except smtplib.SMTPException as e:
print('当前邮件发送失败', e) # 打印错误
发送成功的结果如下图所示。 邮件正文中 换行和链接都自动解析,如下图所示。
总结
对于 qq 邮箱发送邮件,处理步骤都是类似的。 第一步、获取 客户端的密码,设置中开启SMTP服务,发短信验证 第二步、修改相应的参数,如 服务器地址 smtp.exemail.qq.com
下面是qq邮箱 开启SMTP服务记录 发送短信到指定的平台 接收到授权码,复制,准备在程序中使用。
可能遇到的错误
1、socket.gaierror:[Errno 11001] getaddrinfo failed 解决方案:查看地址前面是否有空格 2、Unexpected indent 解决方案:查看代码中 函数或者变量的缩进,可能是有空格
参考博客
【1】https://blog.csdn.net/weixin_40475396/article/details/78693408