Python 3 – 使用SMTP发送电子邮件
简单邮件传输协议(SMTP)是一种处理邮件发送和路由的协议。
Python提供了 smtplib 模块,它定义了一个SMTP客户端会话对象,可用于向具有SMTP或ESMTP侦听器守护程序的任何Internet机器发送邮件。
这里是创建SMTP对象的简单语法,稍后可用于发送电子邮件 –
import smtplib
smtpObj = smtplib.SMTP([host [,port [,local_hostname]]])
这里是参数的详细描述 –
- host - 运行SMTP服务器的主机。您可以指定主机的IP地址或域名,如tutorialspoint.com。这是一个可选参数。
-
port - 如果您提供 < i > host _ 参数,则需要指定SMTP服务器正在侦听的端口。通常,此端口将为25。
-
local_hostname - 如果您的SMTP服务器运行在本地计算机上,则可以仅指定 localhost 这个选项。
SMTP对象有一个名为 sendmail 的实例方法,通常用于发送邮件。它需要三个参数 –
- 发件人 – sender 字符串,包含发件人地址。
-
收件人 – receivers 字符串列表,每个收件人一个。
-
消息 – message 以各种RFC中指定的格式格式化的字符串消息。
示例
这是使用Python脚本发送一封电子邮件的简单方法。尝试一下 –
#!/usr/bin/python3
import smtplib
sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']
message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test
This is a test e-mail message.
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(发送者,接收者,消息)
print“已成功发送电子邮件”
except SMTPException:
print“错误:无法发送电子邮件”
在这里,您放置了一条基本电子邮件消息,使用三重引号,并注意正确格式化标头。电子邮件需要 From , To , 以及 Subject 标题,用空白行与电子邮件主体分开。
要发送邮件,请使用 smtpObj 连接本地计算机上的SMTP服务器。然后使用 sendmail 方法连同消息、发件人地址和目标地址作为参数(即使发件人和收件人地址在电子邮件本身中,这些地址也不一定用于路由电子邮件)。
如果您没有在本地计算机上运行SMTP服务器,则可以使用 smtplib 客户端与远程SMTP服务器通信。除非您正在使用Webmail服务(例如Gmail或Yahoo!Mail),否则您的电子邮件提供商必须提供您可以提供的发件邮件服务器详细信息,如下所示 –
mail = smtplib.SMTP('smtp.gmail.com',587)
使用Python发送HTML电子邮件
当您使用Python发送文本消息时,所有内容都被视为简单文本。即使在文本消息中包含HTML标记,它也会显示为简单文本,HTML标记不会按HTML语法进行格式化。但是,Python提供了一种选项,可以将HTML消息发送为实际的HTML消息。
在发送电子邮件消息时,您可以指定Mime版本、内容类型和字符集以向HTML电子邮件发送消息。
示例
以下是将HTML内容作为电子邮件发送的示例。试一试:
#!/usr/bin/python3
import smtplib
message = """From: 发件人 <发件人邮箱地址>
To: 收件人 <收件人邮箱地址>
MIME 版本: 1.0
内容类型: text/html
主题:SMTP HTML电子邮件测试
这是一封以HTML格式发送的电子邮件。
<b>这是HTML邮件。</b>
<h1>这是标题。</h1>
"""
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
print "发送电子邮件成功"
except SMTPException:
print "错误:无法发送电子邮件"
发送带附件的电子邮件
要发送带有混合内容的电子邮件,需要设置 内容类型 标头为 multipart/mixed 。然后可以在其中指定文本和附件部分 边界 。
边界以两个连字符开头,后跟一个唯一的数字,此数字不能出现在电子邮件的消息部分中。最后一个边界表示电子邮件的最后部分,也必须以两个连字符结束。
附加的文件应使用 pack(“m”) 函数进行编码,以便在传输之前进行基本64位编码。
示例
以下是一个示例,它将文件 /tmp/test.txt 作为附件进行发送。试一试:
#!/usr/bin/python3
import smtplib
import base64
filename = "/tmp/test.txt"
# 读取文件并将其编码为base64格式
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent) # base64
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body ="""
这是一个发送附件的测试邮件。
"""
# 定义主标题
part1 = """From: 发件人 <发件人邮箱地址>
To: 收件人 <收件人邮箱地址>
Subject: 发送附件
MIME 版本: 1.0
内容类型: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# 定义消息操作
part2 = """内容类型: text/plain
内容传输编码:8位
%s
--%s
""" % (body,marker)
# 定义附件部分
part3 = """内容类型: multipart/mixed; name=\"%s\"
内容传输编码:base64
Content-Disposition: attachment; filename=%s
%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, reciever, message)
print "发送电子邮件成功"
except Exception:
print ("错误:无法发送电子邮件")