Python 使用SMTP发送邮件的代码小结


Posted in Python onSeptember 21, 2016

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

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

参数说明:
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:w3cschool.cc,这个是可选参数。
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协议中定义的格式。
实例
以下是一个使用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"

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

import smtplib 
from email.mime.text import MIMEText 
mailto_list=["YYY@YYY.com"] 
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXX"  #用户名
mail_pass="XXXX"  #口令 
mail_postfix="XXX.com" #发件箱的后缀
 
def send_mail(to_list,sub,content): #to_list:收件人;sub:主题;content:邮件内容
  me="hello"+"<"+mail_user+"@"+mail_postfix+">"  #这里的hello可以任意设置,收到信后,将按照设置显示
  msg = MIMEText(content,_subtype='html',_charset='gb2312')  #创建一个实例,这里设置为html格式邮件
  msg['Subject'] = sub  #设置主题
  msg['From'] = me 
  msg['To'] = ";".join(to_list) 
  try: 
    s = smtplib.SMTP() 
    s.connect(mail_host) #连接smtp服务器
    s.login(mail_user,mail_pass) #登陆服务器
    s.sendmail(me, to_list, msg.as_string()) #发送邮件
    s.close() 
    return True 
  except Exception, e: 
    print str(e) 
    return False 
if __name__ == '__main__': 
  if send_mail(mailto_list,"hello","<a href='http://www.cnblogs.com/xiaowuyi'>小五义</a>"): 
    print("发送成功")
  else: 
    print("发送失败")

或者你也可以在消息体中指定Content-type为text/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")

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

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

#创建一个带附件的实例
msg = MIMEMultipart()

#构造附件1
att1 = MIMEText(open('d:\\123.rar', 'rb').read(), 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="123.doc"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)

#构造附件2
att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="123.txt"'
msg.attach(att2)

#加邮件头
msg['to'] = 'YYY@YYY.com'
msg['from'] = 'XXX@XXX.com'
msg['subject'] = 'hello world'
#发送邮件
try:
  server = smtplib.SMTP()
  server.connect('smtp.XXX.com')
  server.login('XXX','XXXXX')#XXX为用户名,XXXXX为密码
  server.sendmail(msg['from'], msg['to'],msg.as_string())
  server.quit()
  print '发送成功'
except Exception, e: 
  print(str(e))

以下实例指定了Content-type header 为 multipart/mixed,并发送/tmp/test.txt 文本文件:

#!/usr/bin/python

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 ="""
This is a test email to send an attachement.
"""
# 定义头部信息
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)

# 定义消息动作
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 + part3

try:
  smtpObj = smtplib.SMTP('localhost')
  smtpObj.sendmail(sender, reciever, message)
  print("Successfully sent email")
except Exception:
  print("Error: unable to send email")

如果感兴趣的朋友可以继续参考下面的文章。

Python 相关文章推荐
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
Python生成随机验证码的两种方法
Dec 22 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
Python爬虫包BeautifulSoup实例(三)
Jun 17 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
python requests爬取高德地图数据的实例
Nov 10 Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 Python
Django异步任务线程池实现原理
Dec 17 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
java字符串格式化输出实例讲解
Jan 06 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 #Python
Python中将字典转换为列表的方法
Sep 21 #Python
Python 两个列表的差集、并集和交集实现代码
Sep 21 #Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
Sep 21 #Python
python if not in 多条件判断代码
Sep 21 #Python
python中range()与xrange()用法分析
Sep 21 #Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 #Python
You might like
php将会员数据导入到ucenter的代码
2010/07/18 PHP
关于PHP中Object对象的笔记分享
2011/06/28 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
ExtJs使用总结(非常详细)
2012/03/22 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
屏蔽script注入小例子
2013/11/12 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
详解Puppeteer前端自动化测试实践
2019/02/21 Javascript
Python数据类型详解(一)字符串
2016/05/08 Python
python查看微信好友是否删除自己
2016/12/19 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Python高级特性切片(Slice)操作详解
2018/09/27 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
jupyter notebook远程访问不了的问题解决方法
2021/01/11 Python
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
会计实习期自我鉴定
2013/10/06 职场文书
建设投标担保书
2014/05/13 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
遗失证明范文
2015/06/19 职场文书
如何撰写促销方案?
2019/07/05 职场文书
详解Python中__new__方法的作用
2022/03/31 Python
Python开发五子棋小游戏
2022/04/28 Python
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server