Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件_第1页
Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件_第2页
Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件_第3页
Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件_第4页
Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件#设置附件的MIME和文件名,这里是png类型:

mime=MIMEBase('image','jpg',filename='a.jpg')

#加上必要的头信息:

mime.add_header('Content-Disposition','attachment',filename='附件显示名称.jpg')

mime.add_header('Content-ID','')#如果有多个文件需要使用.format(index)

mime.add_header('X-Attachment-Id','0')#如果有多个文件需要使用.format(index)

#把附件的内容读进来:

mime.set_payload(fp.read())

#用Base64编码:

encoders.encode_base64(mime)

#添加到MIMEMultipart:

message.attach(mime)

6、同时支持HTML和Plain格式

如果我们发送HTML邮件,收件人通过浏览器或者Outlook之类的软件是可以正常浏览邮件内容的,但是,如果收件人使用的设备太古老,查看不了HTML邮件怎么办?

办法是在发送HTML的同时再附加一个纯文本,如果收件人无法查看HTML格式的邮件,就可以自动降级查看纯文本邮件。

利用MIMEMultipart就可以组合一个HTML和Plain,要注意指定subtype是alternative:

msg=MIMEMultipart('alternative')

msg['From']=...

msg['To']=...

msg['Subject']=...

msg.attach(MIMEText('hello','plain','utf-8'))

msg.attach(MIMEText('Hello','html','utf-8'))

#正常发送msg对象...

7、加密SMTP

使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。

某些邮件服务商,例如Gmail,提供的SMTP服务必须要加密传输。我们来看看如何通过Gmail提供的安全SMTP发送邮件。

只需要在创建SMTP对象后,立刻调用starttls()方法,就创建了安全连接。后面的代码和前面的发送邮件代码完全一样。

必须知道,Gmail的SMTP端口是587,因此,修改代码如下:

smtp_server=''

smtp_port=587

server=smtplib.SMTP(smtp_server,smtp_port)

server.starttls()

#剩下的代码和前面的一模一样:

server.set_debuglevel(1)

三、使用poplib接收邮件

收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3。

Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。

POP3的命令和响应数据都是基于ASCII文本的,并以CR和LF(/r/n)作为行结束符,响应数据包括一个表示返回状态的符号(+/)和描述信息。

请求和响应的标准格式如下:

请求标准格式:命令[参数]CRLF

响应标准格式:+OK/[-ERR]descriptionCRLF

POP3协议客户端的命令和服务器端对应的响应数据如下:

username:向POP服务器发送登录的用户名。passstring:向POP服务器发送登录的密码。quit:退出POP服务器。stat:统计邮件服务器状态,包括邮件数和总大小。list[msg_no]:列出全部邮件或指定邮件。返回邮件编号和对应大小。retrmsg_no:获取指定邮件的内容(根据邮件编号来获取,编号从1开始)。delemsg_no:删除指定邮件(根据邮件编号来删除,编号从1开始)。noop:空操作。仅用于与服务器保持连接。rset:用于撤销dele命令。

poplib模块完全模拟了上面命令,poplib.POP3或poplib.POP3_SSL为上面命令提供了相应的方法,开发者只要依次使用上面命令即可从服务器端下载对应的邮件

注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。

要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。

所以,收取邮件分两步:

第一步:使用poplib.POP3或poplib.POP3_SSL按POP3协议把邮件的原始文本下载到本地;

用POP3获取邮件其实很简单,要获取所有邮件,只需要循环使用retr()把每一封邮件内容拿到即可。真正麻烦的是把邮件的原始内容解析为可以阅读的邮件对象。

importpoplib

fromemail.parserimportParser

#email.parser解析电子邮件,返回这个对象的email.message.Message实例

fromemail.headerimportdecode_header

fromemail.utilsimportparseaddr

#服务器及用户信息

host=''

username='bobin.yang@'

password='Ybb7654321'

#连接到POP3服务器

conn=poplib.POP3_SSL(host)

#注意qq邮箱使用SSL连接

#设置调试模式,可以看到与服务器的交互信息

conn.set_debuglevel(1)

#打印POP3服务器的欢迎文字

print(conn.getwelcome().decode("utf-8"))

#身份认证

conn.user(username)

conn.pass_(password)

#获取服务器上信件信息,返回一个列表,第一项是一共有多少封邮件,第二项是共有多少字节

#stat()返回邮件数量和占用空间

mail_total,total_size=conn.stat()

print('message:%s.Size:%s'%(mail_total,total_size))

#list()返回(response,['mesg_numoctets',...],octets),第二项是编号

resp,mails,octets=conn.list()

print(mails)

#返回的列表类似[b'182923',b'22184',...]

#获取最新一封邮件,注意索引号从1开始

#POP3.retr(which)检索序号which的这个邮件,然后设置他的出现标志返回(response,['line',...],octets)这个三元组

resp,lines,ocetes=conn.retr(len(mails))

print('lines:',len(lines))

#lines存储了邮件的原始文本的每一行

#可以获得整个邮件的原始文本

print("-------------------")

第二步:使用email.parser.Parser或BytesParser解析邮件内容为消息对象,然后,用适当的形式把邮件内容展示给用户即可。

解析邮件的过程和上一节构造邮件正好相反。

程序在创建BytesParser(解析字节串格式的邮件数据)或Parser(解析字符串格式的邮件数据)时,必须指定policy=default;否则,BytesParse或Parser解析邮件数据得到的就是过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论