python使用SMTP发送邮件 – Python高级开发教程

上一章Python教程请查看:python socket网络编程
简单邮件传输协议(SMTP)是一种协议,它处理在邮件服务器之间发送电子邮件和路由电子邮件。
Python提供了smtplib模块,它定义了一个SMTP客户端会话对象,可以使用SMTP或ESMTP侦听器守护进程将邮件发送到任何Internet机器。
下面是创建一个SMTP对象的简单语法,该对象稍后可用于发送电子邮件

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

这里是参数的细节:
  • 主机host——这是运行SMTP服务器的主机,你可以指定主机的IP地址或域名,如srcmini.com,这是可选参数。
  • 端口port——如果提供主机参数,则需要指定一个端口,SMTP服务器正在监听该端口,通常这个端口是25。
  • local_hostname——如果你的SMTP服务器运行在你的本地机器上,那么你可以指定localhost作为这个选项。
SMTP对象有一个名为sendmail的实例方法,该方法通常用于完成发送消息的工作,它需要三个参数:
  • 发送者—包含发送者地址的字符串。
  • 接收者——一个字符串列表,每个接收者对应一个字符串。
  • 消息——在各种rfc中指定格式的字符串消息。
这里有一个使用Python脚本发送电子邮件的简单方法。
#!/usr/bin/pythonimport smtplibsender = 'from@domain.com' receivers = ['to@domain.com']message = """From: From Person < from@domain.com> To: To Person < to@domain.com> Subject: SMTP e-mail test测试邮件。。。 """try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print "成功发送邮件!" except SMTPException: print "Error: 无法发送邮件!"

在这里你已经在message中放置了一个基本的电子邮件,使用三重引号,注意正确地格式化标题。电子邮件需要一个From、To和Subject标头,它与电子邮件正文用空行隔开。
发送邮件你使用smtpObj连接到SMTP服务器在本地机器上,然后使用sendmail方法以及信息,从地址和目的地址作为参数(尽管从地址电子邮件本身,这些并不总是用来路由邮件)。
如果你不在本地机器上运行SMTP服务器,则可以使用smtplib客户机与远程SMTP服务器通信。除非你使用网络邮件服务(如Hotmail或Yahoo!邮件),你的电子邮件提供商必须向你提供你可以提供的发送邮件服务器的详细信息,如下所示
smtplib.SMTP('mail.your-domain.com', 25)

1、使用Python发送HTML电子邮件当你使用Python发送文本消息时,所有内容都被视为简单的文本。即使你在文本消息中包含HTML标记,它也会显示为简单的文本,并且HTML标记不会根据HTML语法进行格式化,但是Python提供了将HTML消息作为实际的HTML消息发送的选项。
发送电子邮件时,可以指定发送HTML电子邮件的Mime版本、内容类型和字符集。
【python使用SMTP发送邮件 – Python高级开发教程】下面是将HTML内容作为电子邮件发送的示例。
#!/usr/bin/pythonimport smtplibmessage = """From: From Person < from@domain.com> To: To Person < to@domain.com> MIME-Version: 1.0 Content-type: text/html Subject: SMTP HTML e-mail test发送HTML格式邮件。。。< b>HTML信息.< /b> < h1>标题< /h1> """try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, message) print "成功发送邮件!" except SMTPException: print "Error: 无法发送邮件!"

2、发送电子邮件附件与混合内容需要发送电子邮件设置内容类型头多部分/混合,然后可以指定文本和附件部分内边界。
边界始于两个连字符后跟一个独特的号码,不能出现在电子邮件消息的一部分,最后的边界表示电子邮件的最后部分还必须有两个连字符结束。
应该编码的附件包(“m”)函数base64编码传输之前。
下面是这个例子中,它发送一个文件/ tmp /用法作为附件。
#!/usr/bin/pythonimport smtplib import base64filename = "/tmp/test.txt"# 读取文件并将其编码为base64格式 fo = open(filename, "rb") filecontent = fo.read() encodedcontent = base64.b64encode(filecontent)# base64sender = 'webmaster@srcmini.com' reciever = 'user@gmail.com'marker = "AUNIQUEMARKER"body =""" 该邮件发送附件。。。 """ # 定义头 part1 = """From: From Person < me@domain.com> To: To Person < user@gmail.com> Subject: Sending Attachement MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=%s --%s """ % (marker, marker)# 定义消息动作 part2 = """Content-Type: text/plain Content-Transfer-Encoding:8bit%s --%s """ % (body,marker)# 定义附件 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 + part3try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, reciever, message) print "成功发送邮件!" except Exception: print "Error: 无法发送邮件!"

    推荐阅读