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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
python常见的格式化输出小结
Dec 15 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
python3.4爬虫demo
Jan 22 Python
Python检查ping终端的方法
Jan 26 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
python3.6编写的单元测试示例
Aug 17 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
Python排序函数的使用方法详解
Dec 11 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JS加载iFrame出现空白问题的解决办法
2016/05/13 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
微信小程序实现无限滚动列表
2020/05/29 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
用Python去除图像的黑色或白色背景实例
2019/12/12 Python
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
医护人员英文求职信范文
2013/11/26 职场文书
《乞巧》教学反思
2014/02/27 职场文书
保密承诺书
2014/03/27 职场文书
人事经理岗位职责
2014/04/28 职场文书
干部竞争上岗演讲稿
2014/09/11 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
Nginx快速入门教程
2021/03/31 Servers
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
LeetCode189轮转数组python示例
2022/08/05 Python