背景介绍

周末温习下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