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字符串匹配算法KMP实例
Jul 18 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
Jan 29 Python
python 巧用正则寻找字符串中的特定字符的位置方法
May 02 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
numpy.array 操作使用简单总结
Nov 08 Python
python如何使用Redis构建分布式锁
Jan 16 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
python实现简单的聊天小程序
Jul 07 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 Python
详细介绍python操作RabbitMq
Apr 12 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中使用模板的方法
2008/05/24 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
2010/04/22 PHP
php中stream(流)的用法
2014/03/25 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
2014/05/10 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
详解Laravel设置多态关系模型别名的方式
2019/10/17 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
python实现UDP协议下的文件传输
2020/03/20 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
vivo智能手机官方商城:vivo
2016/09/22 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
办公室前台岗位职责
2014/01/04 职场文书
劳资协议书范本
2014/04/23 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
学生保证书格式
2015/02/27 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang