详解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 itertools模块详解
May 09 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
详解django的serializer序列化model几种方法
Oct 16 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
Django高并发负载均衡实现原理详解
Apr 04 Python
python如何求圆的面积
Jul 01 Python
pandas参数设置的实用小技巧
Aug 23 Python
pymysql模块使用简介与示例
Nov 17 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
基于python制作简易版学生信息管理系统
Apr 20 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实现今天是星期几的几种写法
2013/09/26 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
2021/03/09 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
jQuery实现邮箱下拉列表自动补全功能
2016/09/08 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
python抓取网页图片并放到指定文件夹
2014/04/24 Python
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
python处理写入数据代码讲解
2020/10/22 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
作文评语大全
2014/04/23 职场文书
环保倡议书格式范文
2014/05/14 职场文书
常务副总经理任命书
2014/06/05 职场文书
安全生产宣传标语
2014/06/06 职场文书
工程承包协议书
2014/10/20 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2014个人年度工作总结
2014/12/15 职场文书
公务员年度考核评语
2014/12/31 职场文书
常用的Python代码调试工具总结
2021/06/23 Python