Python3 SMTP发送邮件

Posted 说笑谈古松

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 SMTP发送邮件相关的知识,希望对你有一定的参考价值。

Python3 SMTP发送邮件

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

我这里会演示使用qq的smtp访问,但是第三方的服务商都需要手动开始SMTP服务。
用浏览器打开qq邮箱官网,登录界面

需要输入用户名,密码:
在这里插入图片描述
输入用户名,密码之后点击登录按钮进行登录
在这里插入图片描述
进入邮箱之后,点击最上方字体比较小的【设置】按钮,如下图所示
在这里插入图片描述
进入设置界面之后,在右侧切换到【账户】面板
在这里插入图片描述
然后鼠标向下滚动,

找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务栏目

点击开启POP3/SMTP服务的开启按钮
在这里插入图片描述
这时候需要用手机发送【配置邮件客户端】到【1069070069】(这里可能会报错,可以根据提示去发送信息给另一个收件人)
在这里插入图片描述
手机发送完成之后,单击【我已发送】按钮
在这里插入图片描述
之后服务开启成功,生成了第三方邮件客户端授权码,充当密码的作用
在这里插入图片描述
qq邮箱的smtp服务开启成功,如下图所示
在这里插入图片描述
之后登陆第三方邮件客户端,就只需输入用户名和授权码就可以登陆了
如果我们本机没有 sendmail 访问,也可以使用其他服务商的 SMTP 访问(QQ、网易、Google等)。

#!/usr/bin/python3
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #口令 开启smtp服务后获得的密钥
 
 
sender = 'from@runoob.com' #你的邮箱账号
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8') #发送者
message['To'] =  Header("测试", 'utf-8')#接收者
 
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')#邮件内容
 
 
try:
    smtpObj = smtplib.SMTP() 
    smtpObj.connect(mail_host, 25)    # 25 为 SMTP 端口号
    smtpObj.login(mail_user,mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    smtpObj.quit() #关闭连接
    print ("邮件发送成功")
except smtplib.SMTPException:

在这里插入图片描述

发送成功
在这里插入图片描述

使用Python发送html格式的邮件

Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html。具体代码如下:

#!/usr/bin/python3
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
sender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
 
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
 
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    smtpObj.quit() #关闭连接
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

执行以上程序,如果你本机安装sendmail,就会输出:

$ python3 test.py 
邮件发送成功

Python 发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

#!/usr/bin/python3
 
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
sender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
 
#邮件正文内容
message.attach(MIMEText('这是菜鸟教程Python 邮件发送测试……', 'plain', 'utf-8'))
 
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
 
# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('runoob.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, message.as_string())
    smtpObj.quit() #关闭连接
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

在 HTML 文本中添加图片

邮件的 HTML 文本中一般邮件服务商添加外链是无效的,正确添加图片的实例如下所示:

#!/usr/bin/python3
 
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
 
sender = 'from@runoob.com'
receivers = ['429240967@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
 
msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("菜鸟教程", 'utf-8')
msgRoot['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
msgRoot['Subject'] = Header(subject, 'utf-8')
 
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
 
 
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">菜鸟教程链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
 
# 指定图片为当前目录
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
 
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
 
try:
    smtpObj = smtplib.SMTP('localhost')
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())
    smtpObj.quit() #关闭连接
    print ("邮件发送成功")
except smtplib.SMTPException:
    print ("Error: 无法发送邮件")

以上是关于Python3 SMTP发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

[Python3]SMTP发送邮件

Python3 SMTP发送邮件

Python3 SMTP发送邮件

Python3 SMTP发送邮件

Python3 SMTP发送邮件

Python3 SMTP发送邮件