python 收发邮件_python发送各类邮件的主要基本方法

利用python实现基本的邮件发送。

感谢以下博客的整理,本人在学习的同时也做了一些整理

一、相关模块介绍

发送邮件主要用到了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())

使用smtplib库发送邮件的基本步骤:

#连接到SMTP服务器,参数表示SMTP主机和端口,端口默认25

SMTP.connect([host[,port]]) #也可以不显式链接:SMTP(host)

#登录SMTP服务器

SMTP.login(user,password)

#发送邮件。.as_string()是字符串,表示邮件内容,to_addrs是收件人list

SMTP.sendmail(from_addr, to_addrs, msg.as_string())

#断开连接

SMTP.close() #也有用SMTP.quit()

2、email模块

Email库用来处理邮件消息。包括MIME和基于RFC2822的消息文档。

有关MIME的一些知识

RFC2822定义的邮件格式中,邮件体只是单纯的ASCII编码的字符序列,MIME扩展邮件的格式,用以支持非ASCII编码的文本、非文本附件及包含多个部分(multi-part)的邮件体。

MIME消息由消息头、消息体组成,即邮件的邮件头、邮件体。中间以空行进行分隔。

1、邮件头:包括发件人(from)、收件人(to)、邮件主题(subject)、接收日期(date)、MIME版本、邮件内容类型等信息。每条信息称为一个域,由域名后加“:”和信息内容构成,域的首行必须顶头写。

2、邮件体:有text/plain(纯文本)和text/html(超文本)之分,由邮件头的“content type”域指出。可以同时存在,也可以只存在一种。这就是为什么有些邮件既可以用html格式查看,又可以用文本格式查看的原因。邮件体分为多个段,称为Payload。每个段也包括段头段尾,中间以空行分隔。multipart类型有3种:multipart/mixed multipart/related multipart/alternative。邮件里添加附件要定义multipart/mixed段,如果纯文本超文本共存,则要定义multipart/alternative,如存在内嵌资源,要定义multipart/related。

3、附件(attach)。发送邮件时,可以将本机的文件一起发送。附件可以有0个或多个,只要附件的总大小,不超过邮件服务器所声明的最大容量。 4、

包括的类主要有(更加详细的介绍可见:

http://docs.python.org/library/email.mime.html):

class email.mime.text.MIMEText(_text[, _subtype[, _charset]])

用于生成MIME对象的主体文本:_text指定邮件内容,_subtype指定邮件类型,_charset指定编码。

class email.mime.multipart.MIMEMultipart()

用于生成包含多个部分的邮件体的MIME对象

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@YYY.com' #自己的邮件地址

msg['date']='2013-5-25' #时间日期

msg['subject']='hello python' #邮件主题

class email.mime.text.MIMEText(_text[, _subtype[, _charset]])

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

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

1.普通文本和html邮件的发送

普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain。首先导入smtplib和mimetext。创建smtplib.smtp实例,connect邮件smtp服务器,login后发送.

html信息发送和普通文本一样,conten内容变为html信息,并将_subtype设置为html。

具体代码如下(python 2.7):

#import getpass #如果需要交互获取密码

#pwd_input = getpass.getpass('Password:')

import time

import smtplib

import email.utils

from email.mime.text import MIMEText

#Initialize mail information

#mailto_list = ['XXX@163.com','YYY@qq.com']

mail_host = 'smtp.163.com' #设置网易163服务器

mail_user = 'ZZZ' #用户名

mail_pass = '*********' #口令

mail_postfix = '163.com' #发件箱后缀

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#Create the message

#html信息

#content = "Dyllian使用程序给你发了个链接!"

#msg = MIMEText(content,_subtype='html',_charset='utf8')

#普通文本

content = "Hello dyllian"

msg = MIMEText(content,_subtype='plain',_charset='utf8')

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定义发送时间(不定义的可能有的邮件客户端会不显示发送时间)

#msg.preamble = 'This is a common message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有异常则执行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中没有异常则执行

print 'Mail passed successfully!'

finally: #try中有无异常都执行

server.close()

2.带附件的邮件发送(附件图片,附件一般文件)

import os

import time

import smtplib

import email.utils

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

#Get local path

path = os.path.dirname(__file__)

#Initialize mail infomation

#mailto_list = ['XXX@163.com','YYY@qq.com']

mailto_list = ['XXX@163.com']

mail_host = 'smtp.163.com' #设置服务器

mail_user = 'ZZZ' #用户名

mail_pass = '******' #口令

mail_postfix = '163.com' #发件箱后缀

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#构建一个带附件的实例

msg = MIMEMultipart()

#用MIMEImage附件图片

fp = open(path+'\\ning1.jpg', 'rb')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID', '')

msg.attach(msgImage)

#构造附件1图片

att1 = MIMEText(open(path+'\\ning1.jpg','rb').read(),_subtype='base64',_charset='utf8')

att1['Content-Type'] = 'application/octet-stream'

att1['Content-Disposition'] = "attachment; filename=ningning1.jpg" #这里的filename可以随便取,写什么名字,邮件中显示什么名字

msg.attach(att1)

#构造附件2文件

att2 = MIMEText(open(path+'\\ning2.txt','rb').read(),_subtype='base64',_charset='utf8')

att2['Content-Type'] = 'application/octet-stream'

att2['Content-Disposition'] = "attachment; filename=test2.txt"

msg.attach(att2)

#加邮件头

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定义发送时间(不定义的可能有的邮件客户端会不显示发送时间)

#msg.preamble = 'This is a multi-part message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有异常则执行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中没有异常则执行

print 'Mail passed successfully!'

finally: #try中有无异常都执行

server.close()

四:遇到的问题

希望在邮件正文中显式图片信息,思路是用html属性发送,查了几个资料,遇到了同样的问题:

1.如果做以下处理,结果还是以附件的形式发送图片:

#构建一个带附件的实例

msg = MIMEMultipart('ralated')

#用MIMEImage附件图片

fp = open(path+'\\ning1.jpg', 'rb')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID', '')

msg.attach(msgImage)

2.如果做以下的处理,结果有编译错误:

import os

import smtplib

import email.utils

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

#Get local path

path = os.path.dirname(__file__)

#Initialize mail infomation

mailto_list = ['XXX@163.com']

mail_host = 'smtp.163.com' #设置服务器

mail_user = 'YYY' #用户名

mail_pass = '******' #口令

mail_postfix = '163.com' #发件箱后缀

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#构建一个带附件的实例

msg = MIMEMultipart('ralated')

#html附带图片正文

msgAlternative = MIMEMultipart('alternative')

msg.attach(msgAlternative)

html = '本邮件,正文中显示图片!path+"\\ning1.jpg"'

htmlText = MIMEText(html,_subtype='html',_charset='utf8')

msgAlternative.attach(htmlText)

#内置图片

fp = open(path+'\\ning1.jpg','rb+')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID','')

msg.attach(msgImage)

#加邮件头

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg.preamble = 'This is a multi-part message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有异常则执行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中没有异常则执行

print 'Mail passed successfully!'

finally: #try中有无异常都执行

server.close()

编译结果:

Mail passed unsuccessfully!

(554, 'DT:SPM smtp11, D8CowEDp5XJrPKBR0ATQBg--.765S2 1369455724 http://mail.163.com/help/help_spam_16.htm?ip=61.150.43.98&hostid=smtp11&time=1369455724')

不知道哪里出了错,哪位可能提供思路解决?谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] websocket握手阶段是通过什么协议传输的?

[html] websocket握手阶段是通过什么协议传输的? HTTP个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

区分Activity的四种加载模式

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式,而不是使用默认的加载模…

laravel常用响应操作

转载于:https://www.cnblogs.com/saintdingspage/p/11298246.html

[html] 说说你对Media Source Extensions(MSE)的理解,它解决了什么问题呢?

[html] 说说你对Media Source Extensions(MSE)的理解&#xff0c;它解决了什么问题呢&#xff1f; Media Source Extensions 允许JavaScript动态地为<audio>和<video>创建媒体流&#xff0c;而不再只能是引用一个视频文件的url。这样就极大地丰富了前端对音视频的…

教学思路SQL之入门习题《学生成绩》 二、基础单表查询

根据查询要求&#xff0c;写出SQL脚本&#xff1a; 1、 查询学生信息表&#xff0c;查找学生的姓名&#xff0c;性别&#xff0c;并将查询结果按姓名进行排序。 2、查询学生信息表&#xff0c;查找地区在大连的学生&#xff0c;显示其姓名&#xff0c;联系电话&#xff0c;地…

python中mat函数_python matplotlib中的subplot函数使用详解

python里面的matplotlib.pylot是大家比较常用的&#xff0c;功能也还不错的一个包。基本框架比较简单&#xff0c;但是做一个功能完善且比较好看整洁的图&#xff0c;免不了要网上查找一些函数。于是&#xff0c;为了节省时间&#xff0c;可以一劳永逸。我把常用函数作了一个总…

pytorch资料

torchvision是独立于pytorch的关于图像操作的一些方便工具库。 torchvision的详细介绍在&#xff1a;https://pypi.org/project/torchvision/ torchvision主要包括一下几个包&#xff1a; vision.datasets : 几个常用视觉数据集&#xff0c;可以下载和加载&#xff0c;这里主要…

[html] 浏览器是怎么对HTML5的离线储存资源进行管理和加载的

[html] 浏览器是怎么对HTML5的离线储存资源进行管理和加载的 在线的情况下&#xff0c;浏览器发现html头部有manifest属性&#xff0c;它会请求manifest文件&#xff0c;如果是第一次访问app&#xff0c;那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。…

常用技术面试题

java面试题 http://blog.csdn.net/uiop_7890_7890转载于:https://www.cnblogs.com/ajian005/archive/2011/11/02/2753780.html

if else if else语句格式_你还在用if/else吗?

你还在用if/else吗&#xff1f;前提我们在日常开发当中经常会遇到复杂的条件判断&#xff0c;一般的做法是用if/else&#xff0c;或者优雅一点的写法是用switch语句来实现多个条件的判断&#xff0c;这样的话会有很多问题&#xff0c;随着判断条件的增加&#xff0c;代码中if/e…

魔术球问题

题目大意&#xff1a; 有 \(n\) 个柱子&#xff0c;依次将若干个球放上去&#xff0c;要满足&#xff1a; 1.每次只能放在柱子的顶端 2.相邻两个球的编号之和必须为完全平方数。 问最多能放几个球&#xff1f; \((1 \leq n \leq 55)\) 思路&#xff1a; 首先&#xff0c;答案一…

[html] svg如何转为字体图标?

[html] svg如何转为字体图标&#xff1f; 选择一个支持在线转换的网站 如IconFont或icomoon上传svg文件的图标在相应的地方进行下载好处字体图标直接用color自由控制颜色&#xff1b;整合在一起&#xff0c;减少http请求等个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

乔梁专访——让持续交付变为可能

本月起&#xff0c;图灵社区陆续推出专业IT人访谈版块&#xff0c;首期人物是百度公司项目管理部高级架构师、《持续交付》译者乔梁。   本次访谈分三个主题&#xff1a;   1、 从概念和技术两个层次来解释持续交付   2、.持续交付是可实施的   3、持续交付将变成必备…

java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一。因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。那到底应该怎么学习并发编程呢? Java SDK的并发工具包有很多,是…

移动端安全 - 安卓Android - 漏洞修复方案整理

敏感数据泄露 明文传输用户名、密码和验证码等敏感信息 MD5/Base64弱加密传输手机、密码等敏感信息 敏感信息在本地加密存储 后台服务器地址泄露。 边信道信息泄漏 在日志中对于密码等敏感信息进行加密存储。 关闭调试接口&#xff0c;禁止输出敏感信息。 未经用户确认调用敏感…

[html] html中如何使用svg?

[html] html中如何使用svg&#xff1f; 1-使用embed标签 推荐优点主流浏览器都支持允许使用脚本缺点不推荐在HTML4和XHTML中使用语法<embed src"svg File Path" type"image/svgxml" width"width" height"height" pluginspage&quo…

element中select默认选中第一个_探索在网页中使用“标注”

github地址&#xff1a;https://github.com/1314mxc/yunUI &#xff0c;欢迎star&#xff01;说起“标注”&#xff0c;在HTML5之前&#xff0c;你可能想起的是各种浏览器插件&#xff0c;emmmmmmm或者说你根本不认为浏览器上可以有这种玩意。但是HTML5来了&#xff0c;这是它的…

ckeditor 框架分析 几个核心“人物”

ckeditor代码中有几个核心的内容&#xff1a; 1. (function(){})(); 2. prototype new 配合&#xff0c;继承属性方法 3. a.event.implementOn() 公共属性扩充 4. e.extend / a.tools.extend 自由扩充 5. a.on 6. j.add 1.(function(){})(); (function(){ //要运行的程序 })();…

项目管理沙龙第五次聚会

项目管理沙龙第五次聚会本次的话题从第30个项目百态模式《短铅笔》开始。“短铅笔”模式里最让人印象深刻的是这一句话“只有把用短的铅笔交上去&#xff0c;才能更换一支长铅笔”。很多人都遇过这样的公司&#xff0c;因为要所谓的“控制成本”&#xff0c;结果却把自己的员工…

算法之排序算法-选择排序与优化

package com.ebiz.sort;import java.text.SimpleDateFormat; import java.util.Date;/*** author YHj* create 2019-07-28 20:58* 选择排序*/ public class Choose {public static void main(String[] args) {int[] arr new int[80000];for (int i 0; i < 80000; i) {arr[…