详解python发送各类邮件的主要方法


Posted in Python onDecember 22, 2016

 python中email模块使得处理邮件变得比较简单,今天着重学习了一下发送邮件的具体做法,这里写写自己的的心得,也请高手给些指点。

一、相关模块介绍

发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:

1、smtplib模块

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有参数都是可选的。

host:smtp服务器主机名

port:smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。

smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。

smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。

SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。可选参数argstring表示指令的参数。

SMTP.helo([hostname]) :使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。

SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.login(user, password) :登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。

 SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

SMTP.quit() :断开与smtp服务器的连接,相当于发送"quit"指令。(很多程序中都用到了smtp.close(),具体与quit的区别google了一下,也没找到答案。)

2、email模块

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822 的消息文档。使用这些模块来定义邮件的内容,是非常简单的。其包括的类有(更加详细的介绍可见:http://docs.python.org/library/email.mime.html):

class email.mime.base.MIMEBase(_maintype, _subtype, **_params):这是MIME的一个基类。一般不需要在使用时创建实例。其中_maintype是内容类型,如text或者image。_subtype是内容的minor type 类型,如plain或者gif。 **_params是一个字典,直接传递给Message.add_header()。

class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]:MIMEBase的一个子类,多个MIME对象的集合,_subtype默认值为mixed。boundary是MIMEMultipart的边界,默认边界是可数的。

class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]):MIMEMultipart的一个子类。

class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]]): MIME音频对象

class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]]):MIME二进制文件对象。

class email.mime.message.MIMEMessage(_msg[, _subtype]):具体的一个message实例,使用方法如下: 

msg=mail.Message.Message()  #一个实例 
msg['to']='XXX@XXX.com'   #发送到哪里 
msg['from']='YYY@YYYY.com'    #自己的邮件地址 
msg['date']='2012-3-16'      #时间日期 
msg['subject']='hello world'  #邮件主题

class email.mime.text.MIMEText(_text[, _subtype[, _charset]]):MIME文本对象,其中_text是邮件内容,_subtype邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件),  _charset编码,可以是gb2312等等。

二、几种邮件的具体实现代码

1、普通文本邮件

普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain。首先导入smtplib和mimetext。创建smtplib.smtp实例,connect邮件smtp服务器,login后发送,具体代码如下:(python2.6下实现)

# -*- coding: UTF-8 -*-
'''
发送txt文本邮件
'''
import smtplib 
from email.mime.text import MIMEText 
mailto_list=[YYY@YYY.com] 
mail_host="smtp.XXX.com" #设置服务器
mail_user="XXXX"  #用户名
mail_pass="XXXXXX"  #口令 
mail_postfix="XXX.com" #发件箱的后缀
 
def send_mail(to_list,sub,content): 
  me="hello"+"<"+mail_user+"@"+mail_postfix+">" 
  msg = MIMEText(content,_subtype='plain',_charset='gb2312') 
  msg['Subject'] = sub 
  msg['From'] = me 
  msg['To'] = ";".join(to_list) 
  try: 
    server = smtplib.SMTP() 
    server.connect(mail_host) 
    server.login(mail_user,mail_pass) 
    server.sendmail(me, to_list, msg.as_string()) 
    server.close() 
    return True 
  except Exception, e: 
    print str(e) 
    return False 
if __name__ == '__main__': 
  if send_mail(mailto_list,"hello","hello world!"): 
    print "发送成功" 
  else: 
    print "发送失败"

2、html邮件的发送

与text邮件不同之处就是将将MIMEText中_subtype设置为html。具体代码如下:(python2.6下实现)

# -*- coding: utf-8 -*-
'''
发送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 "发送失败"

3、发送带附件的邮件

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

# -*- coding: cp936 -*-
'''
发送带附件邮件
'''

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)

 4、利用MIMEimage发送图片

# -*- coding: cp936 -*-
import smtplib
import mimetypes
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

def AutoSendMail():
  msg = MIMEMultipart()
  msg['From'] = "XXX@XXX.com"
  msg['To'] = "YYY@YYY.com"
  msg['Subject'] = "hello world"


  txt = MIMEText("这是中文的邮件内容哦",'plain','gb2312')   
  msg.attach(txt)
  

  file1 = "C:\\hello.jpg"
  image = MIMEImage(open(file1,'rb').read())
  image.add_header('Content-ID','<image1>')
  msg.attach(image)
  
  
  server = smtplib.SMTP()
  server.connect('smtp.XXX.com')
  server.login('XXX','XXXXXX')
  server.sendmail(msg['From'],msg['To'],msg.as_string())
  server.quit()
  
if __name__ == "__main__":
  AutoSendMail()

利用MIMEimage发送图片,原本是想图片能够在正文中显示,可是代码运行后发现,依然是以附件形式发送的,希望有高手能够指点一下,如何可以发送在正文中显示的图片的邮件,就是图片是附件中存在,但同时能显示在正文中,具体形式如下图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中ConfigParse模块的用法
Sep 29 Python
Python RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python中的单继承与多继承实例分析
May 10 Python
Python rstrip()方法实例详解
Nov 11 Python
对python 多个分隔符split 的实例详解
Dec 20 Python
python小程序实现刷票功能详解
Jul 17 Python
Django中多种重定向方法使用详解
Jul 17 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
python3使用diagrams绘制架构图的步骤
Apr 08 Python
详解python 发送邮件实例代码
Dec 22 #Python
使用Python3 编写简单信用卡管理程序
Dec 21 #Python
Python 遍历子文件和所有子文件夹的代码实例
Dec 21 #Python
详解python中的json的基本使用方法
Dec 21 #Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 #Python
python查看微信好友是否删除自己
Dec 19 #Python
python用reduce和map把字符串转为数字的方法
Dec 19 #Python
You might like
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
Node爬取大批量文件的方法示例
2019/06/28 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Python制作爬虫抓取美女图
2016/01/20 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
python selenium xpath定位操作
2020/09/01 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
统计学专业毕业生的自我评价分享
2013/11/28 职场文书
初中毕业生的自我评价
2014/03/03 职场文书
小学庆六一活动总结
2014/08/28 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
Golang: 内建容器的用法
2021/05/05 Golang