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分析nignx访问日志脚本分享
Feb 26 Python
Python发送http请求解析返回json的实例
Mar 26 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
Python实现一个简单的递归下降分析器
Aug 01 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
MySQL中create table语句的基本语法是
2007/01/15 PHP
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
jquery如何实现锚点链接之间的平滑滚动
2013/12/02 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
python保存网页图片到本地的方法
2018/07/24 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
农村产权制度改革实施方案
2014/03/21 职场文书
2015年社区宣传工作总结
2015/05/20 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python