Python SMTP发送邮件

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

import smtplib
smtpobj = smtp.SMTP([host[,port[,local_host]]])

参数说明:
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: blog.csdn.net,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])  

参数说明:
from_addr: 邮件发送者地址。
to_addrs: 字符串列表,邮件发送地址。
msg: 发送消息
这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。
实例
以下执行实例需要你本机已安装了支持 SMTP 的服务,如:sendmail。
以下是一个使用 Python 发送邮件简单的实例:

#-*- coding:utf-8 -*-  

import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  


sender = '1234@szreach.com'#发送人地址  
receivers = ['75461111@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱  

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码  
message = MIMEText('邮件发送测试...', 'plain', 'utf-8')#邮件内容  
message['From'] = Header("hello", 'utf-8')#括号里的对应发件人邮箱昵称、发件人邮箱账号  
message['To'] = Header("测试", 'utf-8')#括号里的对应收件人邮箱昵称  

subject = 'Python SMTP 邮件测试'#邮件的主题,也可以说是标题  
message['Subject'] = Header(subject, 'utf-8')  

try:  
    smtpObj = smtplib.SMTP('smtp.qiye.163.com')  
    smtpObj.sendmail(sender, receivers, message.as_string())  
    print "邮件发送成功"  
except smtplib.SMTPException:  
    print "Error: 无法发送邮件"  

我们使用三个引号来设置邮件信息,标准邮件需要三个头部信息: From, To, 和 Subject ,每个信息直接使用空行分割。
我们通过实例化 smtplib 模块的 SMTP 对象 smtpObj 来连接到 SMTP 访问,并使用 sendmail 方法来发送信息。
执行以上程序,如果你本机安装 sendmail(邮件传输代理程序),就会输出:
$ python test.py
邮件发送成功

使用第三方 SMTP 服务
如果我们本机没有 sendmail 访问,也可以使用其他邮件服务商的 SMTP 访问(QQ、网易、Google等)。

#-*- coding:utf-8 -*-  


import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  

#带HTML格式发送  
#第三方 SMTP 服务  
mail_host = "smtp.qiye.163.com"  # 设置服务器,即你的邮箱服务器  
mail_user = "123@qq.com"  # 用户名  
mail_pass = "xxxx"  # 口令,你的邮箱密码  

sender = '123@qq.com'#发送方的邮箱地址  
receivers = ['75461111@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱  

mail_msg = """ 
<p>Python 邮件发送测试...</p> 
<p><a href="http://blog.csdn.net/mtbaby">这是一个链接</a></p> 
"""  
message = MIMEText(mail_msg, 'html', 'utf-8') #邮件内容  
message['From'] = Header("hello", '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())  
    print "邮件发送成功"  
except smtplib.SMTPException:  
    print "Error: 无法发送邮件"  

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

#-*- coding:utf-8 -*-  


import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  

#带附件发送  
# 第三方 SMTP 服务  
mail_host = "smtp.qiye.163.com"  # 设置服务器,即你的邮箱服务器  
mail_user = "123@qq.com"  # 用户名  
mail_pass = "xxxx"  # 口令,你的邮箱密码  

sender = '123@qq.com'#发送方的邮箱地址  
receivers = ['75411111@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱  

# 创建一个带附件的实例  
message = MIMEMultipart()  
message['From'] = Header("hello", 'utf-8')#括号里的对应发件人邮箱昵称、发件人邮箱账号  
message['To'] = Header("测试", 'utf-8')#括号里的对应收件人邮箱昵称  
subject = 'Python SMTP 邮件测试'   #邮件的主题,也可以说是标题  
message['Subject'] = Header(subject, 'utf-8')  

# 邮件正文内容  
message.attach(MIMEText('这是MTbaby 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="this is test.txt content"'  
message.attach(att1)  

# 构造附件2,传送当前目录下的 test2.txt 文件  
att2 = MIMEText(open('test2.txt', 'rb').read(), 'base64', 'utf-8')  
att2["Content-Type"] = 'application/octet-stream'  
att2["Content-Disposition"] = 'attachment; filename="this is test2.txt content"'  
message.attach(att2)  

try:  
    smtpObj = smtplib.SMTP()  
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号  
    smtpObj.login(mail_user, mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())  
    print "邮件发送成功"  
except smtplib.SMTPException:  
    print "Error: 无法发送邮件"  

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

#-*- coding:utf-8 -*-  


import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  
from email.mime.multipart import MIMEMultipart  

#带附件发送  
# 第三方 SMTP 服务  
mail_host = "smtp.qiye.163.com"  # 设置服务器,即你的邮箱服务器  
mail_user = "123@qq.com"  # 用户名  
mail_pass = "xxxx"  # 口令,你的邮箱密码  

sender = '123@qq.com'#发送方的邮箱地址  
receivers = ['754691111@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱  

# 创建一个带附件的实例  
message = MIMEMultipart()  
message['From'] = Header("hello", 'utf-8')#括号里的对应发件人邮箱昵称、发件人邮箱账号  
message['To'] = Header("测试", 'utf-8')#括号里的对应收件人邮箱昵称  
subject = 'Python SMTP 邮件测试'   #邮件的主题,也可以说是标题  
message['Subject'] = Header(subject, 'utf-8')  

# 邮件正文内容  
message.attach(MIMEText('这是MTbaby 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="this is test.txt content"'  
message.attach(att1)  

# 构造附件2,传送当前目录下的 test2.txt 文件  
att2 = MIMEText(open('test2.txt', 'rb').read(), 'base64', 'utf-8')  
att2["Content-Type"] = 'application/octet-stream'  
att2["Content-Disposition"] = 'attachment; filename="this is test2.txt content"'  
message.attach(att2)  

try:  
    smtpObj = smtplib.SMTP()  
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号  
    smtpObj.login(mail_user, mail_pass)  
    smtpObj.sendmail(sender, receivers, message.as_string())  
    print "邮件发送成功"  
except smtplib.SMTPException:  
    print "Error: 无法发送邮件"  

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

#-*- coding:utf-8 -*-  


import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  
from email.mime.multipart import MIMEMultipart   
from email.mime.image import MIMEImage  


#在HTML中添加图片  
mail_host = "smtp.qiye.163.com"  # 设置服务器,即你的邮箱服务器  
mail_user = "123@qq.com"  # 用户名  
mail_pass = "xxxx"  # 口令,你的邮箱密码  

sender = '123@qq.com'#发件人邮箱账号  
receivers = ["75461111.com"]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱  

msgRoot = MIMEMultipart('related')  
msgRoot['From'] = Header("hello", '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://blog.csdn.net/mtbaby">这是一个链接</a></p> 
<p>图片演示:</p> 
<p><img src="cid:image1"></p> 
"""  
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))  

# 指定图片为当前目录  
fp = open('xx.jpg', 'rb')  
msgImage = MIMEImage(fp.read())  
fp.close()  

# 定义图片 ID,在 HTML 文本中引用  
msgImage.add_header('Content-ID', '<image1>')  
msgRoot.attach(msgImage)  

try:  
    smtpObj = smtplib.SMTP()  
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号  
    smtpObj.login(mail_user, mail_pass)##括号中对应的是发件人邮箱账号、邮箱密码  
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())#括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件  
    print "邮件发送成功"  
except smtplib.SMTPException:  
    print "Error: 无法发送邮件"  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

  • Python SMTP发送邮件 作者:杨梦鸽 校对:翟舒青 SMTP(Simple Mail Transfer P...
    木易林1阅读 229评论 0 1
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,218评论 4 16
  • 首先你要用两个邮箱,一个测试发送邮件,一个用来接收测试. 这里我用的是网易邮箱发送和 QQ邮箱接收测试. 1.用来...
    Silence_王凯阅读 560评论 2 1
  • 一、相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍: 1...
    LizPL阅读 1,350评论 0 3
  • 前言: SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源...
    小喜_ww阅读 3,404评论 1 7