二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)


Posted in Python onDecember 03, 2013

可以使用Python的email模块来实现带有附件的邮件的发送。

SMTP (Simple Mail Transfer Protocol)
邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。

SMTP协议的一个重要特点是它能够接力传送邮件。它工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。

POP3 (Post Office Protocol) & IMAP (Internet Message Access Protocol)
POP协议和IMAP协议是用于邮件接收的最常见的两种协议。几乎所有的邮件客户端和服务器都支持这两种协议。

POP3协议为用户提供了一种简单、标准的方式来访问邮箱和获取电邮。使用POP3协议的电邮客户端通常的工作过程是:连接服务器、获取所有信息并保存在用户主机、从服务器删除这些消息然后断开连接。POP3协议的默认TCP端口号是110。

IMAP协议也提供了方便的邮件下载服务,让用户能进行离线阅读。使用IMAP协议的电邮客户端通常把信息保留在服务器上直到用户显式删除。这种特性使得多个客户端可以同时管理一个邮箱。IMAP协议提供了摘要浏览功能,可以让用户在阅读完所有的邮件到达时间、主题、发件人、大小等信息后再决定是否下载。IMAP协议的默认TCP端口号是143。

邮件格式 (RFC 2822)
每封邮件都有两个部分:邮件头和邮件体,两者使用一个空行分隔。

邮件头每个字段 (Field) 包括两部分:字段名和字段值,两者使用冒号分隔。有两个字段需要注意:From和Sender字段。From字段指明的是邮件的作者,Sender字段指明的是邮件的发送者。如果From字段包含多于一个的作者,必须指定Sender字段;如果From字段只有一个作者并且作者和发送者相同,那么不应该再使用Sender字段,否则From字段和Sender字段应该同时使用。

邮件体包含邮件的内容,它的类型由邮件头的Content-Type字段指明。RFC 2822定义的邮件格式中,邮件体只是单纯的ASCII编码的字符序列。

MIME (Multipurpose Internet Mail Extensions) (RFC 1341)
MIME扩展邮件的格式,用以支持非ASCII编码的文本、非文本附件以及包含多个部分 (multi-part) 的邮件体等。

Python email模块

1. class email.message.Message

__getitem__,__setitem__实现obj[key]形式的访问。
Msg.attach(playload): 向当前Msg添加playload。
Msg.set_playload(playload): 把整个Msg对象的邮件体设成playload。
Msg.add_header(_name, _value, **_params): 添加邮件头字段。
2. class email.mime.base.MIMEBase(_maintype, _subtype, **_params)
所有MIME类的基类,是email.message.Message类的子类。

3. class email.mime.multipart.MIMEMultipart()

在3.0版本的email模块 (Python 2.3-Python 2.5) 中,这个类位于email.MIMEMultipart.MIMEMultipart。
这个类是MIMEBase的直接子类,用来生成包含多个部分的邮件体的MIME对象。

4. class email.mime.text.MIMEText(_text)

使用字符串_text来生成MIME对象的主体文本。

代码实现

!/usr/bin/env python
# -*- coding: UTF-8 -*-from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
# python 2.3.*: email.Utils email.Encoders
from email.utils import COMMASPACE,formatdate
from email import encoders
import os
#server['name'], server['user'], server['passwd']
def send_mail(server, fro, to, subject, text, files=[]): 
    assert type(server) == dict 
    assert type(to) == list 
    assert type(files) == list 
    msg = MIMEMultipart() 
    msg['From'] = fro 
    msg['Subject'] = subject 
    msg['To'] = COMMASPACE.join(to) #COMMASPACE==', ' 
    msg['Date'] = formatdate(localtime=True) 
    msg.attach(MIMEText(text)) 
    for file in files: 
        part = MIMEBase('application', 'octet-stream') #'octet-stream': binary data 
        part.set_payload(open(file, 'rb'.read())) 
        encoders.encode_base64(part) 
        part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) 
        msg.attach(part) 
    import smtplib 
    smtp = smtplib.SMTP(server['name']) 
    smtp.login(server['user'], server['passwd']) 
    smtp.sendmail(fro, to, msg.as_string()) 
    smtp.close()

利用python的smtplib库实现邮件发送

import smtplib
def sendmail():
    try:
        smtp=smtplib.SMTP(HOST)
        smtp.login(USER,PASSWORD)     #登录邮箱
        smtp.sendmail(USER+"@"+PROFIX,TO,MSG)  #发送邮件
        smtp.quit()
        print 'email send success'
    except Exception,e:
        print e
        print 'email send failed.'

邮件可以发送了

然后学习了一点定义msg
python中有几个类库生成丰富的msg格式
总结一个简单的MIMEText,可以编辑许多邮件头信息,也可以编辑邮件格式
from email.MIMEText import MIMEText
msg=MIMEText("要发送的内容","格式,例如:html,plain","编码,例如:gb2312,utf-8")
msg['From']='邮件中显示的发送方的名字'
msg['To']='邮件中显示收件方的名字'
msg['Subject']='邮件标题'
这些都可以不设置

Python 相关文章推荐
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
django使用xadmin的全局配置详解
Nov 15 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Python with语句用法原理详解
Jul 03 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
Python hashlib模块的使用示例
Oct 09 Python
python re的findall和finditer的区别详解
Nov 15 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 Python
python paramiko实现ssh远程访问的方法
Dec 03 #Python
Python使用urllib2获取网络资源实例讲解
Dec 02 #Python
python读写文件操作示例程序
Dec 02 #Python
python通过ElementTree操作XML获取结点读取属性美化XML
Dec 02 #Python
一个简单的python程序实例(通讯录)
Nov 29 #Python
Python时间戳与时间字符串互相转换实例代码
Nov 28 #Python
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 #Python
You might like
Oracle Faq(Oracle的版本)
2006/10/09 PHP
php读取msn上的用户信息类
2008/12/05 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
js实现聊天对话框
2020/02/08 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
python使用插值法画出平滑曲线
2018/12/15 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
浅析python中的del用法
2020/09/02 Python
Python实现EM算法实例代码
2020/10/04 Python
幼儿教师自我鉴定
2013/11/02 职场文书
学生周末长期请假条
2014/02/15 职场文书
团拜会策划方案
2014/06/07 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
运动会宣传语
2015/07/13 职场文书
学校运动会开幕词
2016/03/03 职场文书