当前位置: 首页 > 文档资料 > Python 中文教程 >

Sending Email

优质
小牛编辑
132浏览
2023-12-01

简单邮件传输协议(SMTP)是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件。

Python提供了smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于通过SMTP或ESMTP侦听器守护程序将邮件发送到任何Internet计算机。

以下是创建一个SMTP对象的简单语法,稍后可用于发送电子邮件 -

import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

以下是参数的详细信息 -

  • host - 这是运行SMTP服务器的主机。 您可以指定主机的IP地址或域名,例如xnip.cn。 这是可选参数。

  • port - 如果要提供host参数,则需要指定SMTP服务器正在侦听的端口。 通常这个端口是25。

  • local_hostname - 如果您的SMTP服务器在本地计算机上运行,​​则您可以在此选项中指定localhost

SMTP对象具有名为sendmail的实例方法,该方法通常用于执行邮件发送的工作。 它需要三个参数 -

  • sender - 包含发件人地址的字符串。

  • receivers - 字符串列表,每个接收者一个。

  • message - 作为字符串格式的消息,如各种RFC中指定的那样。

例子 (Example)

这是使用Python脚本发送一封电子邮件的简单方法。 尝试一次 -

#!/usr/bin/python
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(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

在这里,您已使用三重引号在消息中放置了基本电子邮件,注意正确格式化标题。 电子邮件需要“ From ,“ To ”和“ Subject标题,并使用空行与电子邮件正文分隔。

要发送邮件,请使用smtpObj连接到本地计算机上的SMTP服务器,然后使用sendmail方法以及消息,发件人地址和目标地址作为参数(即使from和to地址在e内)邮件本身,这些并不总是用于路由邮件)。

如果未在本地计算机上运行SMTP服务器,则可以使用smtplib客户端与远程SMTP服务器进行通信。 除非您使用的是Webmail服务(例如Hotmail或Yahoo! Mail),否则您的电子邮件提供商必须为您提供可以提供的外发邮件服务器详细信息,如下所示 -

smtplib.SMTP('mail.your-domain.com', 25)

使用Python发送HTML电子邮件

使用Python发送文本消息时,所有内容都被视为简单文本。 即使您在文本消息中包含HTML标记,它也会显示为简单文本,HTML标记将不会根据HTML语法进行格式化。 但Python提供了将HTML消息作为实际HTML消息发送的选项。

发送电子邮件时,您可以指定Mime版本,内容类型和字符集以发送HTML电子邮件。

例子 (Example)

以下是将HTML内容作为电子邮件发送的示例。 尝试一次 -

#!/usr/bin/python
import smtplib
message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test
This is an e-mail message to be sent in HTML format
<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""
try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

将附件作为电子邮件发送

要发送包含混合内容的电子邮件,需要将Content-type标头设置为multipart/mixed 。 然后,可以在boundaries内指定文本和附件部分。

边界以两个连字符开头,后跟唯一编号,该编号不能出现在电子邮件的邮件部分中。 表示电子邮件最后部分的最后边界也必须以两个连字符结尾。

附加文件应使用pack("m")函数进行编码,以便在传输之前进行base64编码。

例子 (Example)

以下是示例,它将文件/tmp/test.txt作为附件发送。 尝试一次 -

#!/usr/bin/python
import smtplib
import base64
filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64
sender = 'webmaster@tutorialpoint.com'
reciever = 'amrood.admin@gmail.com'
marker = "AUNIQUEMARKER"
body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <me@fromdomain.net>
To: To Person <amrood.admin@gmail.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)
# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit
%s
--%s
""" % (body,marker)
# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding: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 "Successfully sent email"
except Exception:
   print "Error: unable to send email"