由上篇文章我们已经得知邮件从发送到接收的过程:
公司主营业务:网站制作、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出建水免费做网站回馈大家。
发件人-MUA-MTA-若干MTA-MDA-MUA-收件人
本节接收邮件主要就是编写一个 MUA 客户端,从 MDA 将邮件取回本地。
收取邮件最常用的是 POP协议 ,目前版本是第三版,也称 POP3 。python内置了 poplib 模块,支持POP3协议。
回想上一节 SMTP ,我们对要发送的邮件内容进行了各种编码,包括添加MIME header,编码之后再进行发送。
因此,我们通过POP3协议接收的也不是原内容,而是经过一系列编码等处理的文本。
所以,要想把POP3收取的文本变为可阅读的邮件对象,就需要利用 email 模块对原始邮件进行解析。
所以,邮件收取的流程就是:
由上一篇 文章 最后总结部分可知。邮件由字符到发送到网络经历了如下的格式转化:
纯文本:
str-bytes-base64-str-bytes
二进制文件:
binary code-base64-str-bytes
我们解析邮件也是按这个思路,逆序解析出内容。
这里的 decode('utf-8') 先把字节流转化为字符串,再将字符串转化为 message 结构的对象。这步与发送邮件的 as_string 函数相反。
先从上一节结构化的 msg 中取出信件头,打印出来。
如果是 multipart 结构, get_payload 函数会返回一个包含不同part的list,然后对每一part递归调用 print_info ,打印子信件头和子信件内容。
不是 multipart 时,之后再依据 Content-Type 作不同处理:
如果是 text :
利用 get_payload(decode = Ture) 取出子信件的内容, decode 为True,则按照 Content-Transfer-Type 将 base64 或 QP 解码为 bytes 。
再 guess_charset 猜出编码方式,之后将其解码为字符显示。
如果不是 Text 对象,则为附件:
打印出附件的 Content-Type 。
Python发送邮件简单的实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = 'from@runoob.com'
receivers = ['429240967@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8')
message['To'] = Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
'''''
函数说明:Send_email_text() 函数实现发送带有附件的邮件,可以群发,附件格式包括:xlsx,pdf,txt,jpg,mp3等
参数说明:
1. subject:邮件主题
2. content:邮件正文
3. filepath:附件的地址, 输入格式为["","",...]
4. receive_email:收件人地址, 输入格式为["","",...]
'''
def Send_email_text(subject,content,filepath,receive_email):
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
sender = "发送方邮箱"
passwd = "填入发送方密码"
receivers = receive_email #收件人邮箱
msgRoot = MIMEMultipart()
msgRoot['Subject'] = subject
msgRoot['From'] = sender
if len(receivers)1:
msgRoot['To'] = ','.join(receivers) #群发邮件
else:
msgRoot['To'] = receivers[0]
part = MIMEText(content)
msgRoot.attach(part)
##添加附件部分
for path in filepath:
if ".jpg" in path:
#jpg类型附件
jpg_name = path.split("\\")[-1]
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=jpg_name)
msgRoot.attach(part)
if ".pdf" in path:
#pdf类型附件
pdf_name = path.split("\\")[-1]
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=pdf_name)
msgRoot.attach(part)
if ".xlsx" in path:
#xlsx类型附件
xlsx_name = path.split("\\")[-1]
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=xlsx_name)
msgRoot.attach(part)
if ".txt" in path:
#txt类型附件
txt_name = path.split("\\")[-1]
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=txt_name)
msgRoot.attach(part)
if ".mp3" in path:
#mp3类型附件
mp3_name = path.split("\\")[-1]
part = MIMEApplication(open(path,'rb').read())
part.add_header('Content-Disposition', 'attachment', filename=mp3_name)
msgRoot.attach(part)
try:
s = smtplib.SMTP()
s.connect("smtp.mail.aliyun.com") #这里我使用的是阿里云邮箱,也可以使用163邮箱:smtp.163.com
s.login(sender, passwd)
s.sendmail(sender, receivers, msgRoot.as_string())
print ("邮件发送成功")
except smtplib.SMTPException as e:
print("Error, 发送失败")
finally:
s.quit()
提供以下两种方式:
利用smtplib,email库
coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import sys
reload(sys)
sys.setdefaultencoding("utf8")
# 配置收发件人
recvaddress = ['receiveemail@sina.com','receiveemail@qq.com']
# 163的用户名和密码
sendaddr_name = 'your_email@163.com'
sendaddr_pswd = 'your_password'
class SendMail:
def __init__(self,recver=None):
"""接收邮件的人:list or tuple"""
if recver is None:
self.sendTo = recvaddress
else:
self.sendTo = recver
def send(self,sub,content,attachcontent):
"""发送邮件"""
self.msg = MIMEMultipart()
#设置发送邮件
self.msg['from'] = sendaddr_name
try:
#设置邮箱服务器
smtp = smtplib.SMTP('smtp.163.com',25)
#登录
smtp.login(sendaddr_name,sendaddr_pswd)
#设置发送主题
self.msg['Subject'] = sub
#设置邮件内容
self.msg.attach(MIMEText(content))
#设置邮件附件,将附件的内容attachcontent,写到filename的文件中,作为附件发送
att1 = MIMEText(attachcontent, 'base64', 'gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="testattach.txt"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
self.msg.attach(att1)
#发送邮件
smtp.sendmail(self.msg['from'], self.sendTo, self.msg.as_string())
smtp.close()
print(u"发送邮件成功")
except Exception,e:
print(u'发送邮件失败:'+str(e))
raise
#调用
s = SendMail()
subject = "主题"
content = "这里是邮件内容"
attachcontent = "这里是附件哦"
s.send(subject,content,attachcontent)
2.利用webpy自带的email模块
首先要安装web.py的依赖库
pip install web.py
#coding:utf-8
import web
##### email服务器配置 #####
web.config.smtp_server = 'smtp.sina.com'
web.config.smtp_port = 25
web.config.smtp_username = '你的email前缀,@前的字符串'
web.config.smtp_password = '你的密码'
web.config.smtp_starttls = True
send_from="youremail@sina.com"
receiveemailaddr = ["receiveemail@qq.com","receiveemail@163.com"]
subject=u'这里是主题'
message=u'这里是邮件的内容'
def sendemail(sendfrom,sendto,subject,message,cc=None, bcc=None,headers=({'User-Agent': 'webpy.sendmail', 'X-Mailer': 'webpy.sendmail',})):
try:
web.sendmail(send_from,sendto,subject,message,cc=cc,bcc=bcc)
print "邮件发送成功"
except Exception,e:
print(str(e))
#调用
sendemail(send_from,receiveemailaddr,subject,message)