重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
由上篇文章我們已經(jīng)得知郵件從發(fā)送到接收的過程:
公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出建水免費(fèi)做網(wǎng)站回饋大家。
發(fā)件人-MUA-MTA-若干MTA-MDA-MUA-收件人
本節(jié)接收郵件主要就是編寫一個 MUA 客戶端,從 MDA 將郵件取回本地。
收取郵件最常用的是 POP協(xié)議 ,目前版本是第三版,也稱 POP3 。python內(nèi)置了 poplib 模塊,支持POP3協(xié)議。
回想上一節(jié) SMTP ,我們對要發(fā)送的郵件內(nèi)容進(jìn)行了各種編碼,包括添加MIME header,編碼之后再進(jìn)行發(fā)送。
因此,我們通過POP3協(xié)議接收的也不是原內(nèi)容,而是經(jīng)過一系列編碼等處理的文本。
所以,要想把POP3收取的文本變?yōu)榭砷喿x的郵件對象,就需要利用 email 模塊對原始郵件進(jìn)行解析。
所以,郵件收取的流程就是:
由上一篇 文章 最后總結(jié)部分可知。郵件由字符到發(fā)送到網(wǎng)絡(luò)經(jīng)歷了如下的格式轉(zhuǎn)化:
純文本:
str-bytes-base64-str-bytes
二進(jìn)制文件:
binary code-base64-str-bytes
我們解析郵件也是按這個思路,逆序解析出內(nèi)容。
這里的 decode('utf-8') 先把字節(jié)流轉(zhuǎn)化為字符串,再將字符串轉(zhuǎn)化為 message 結(jié)構(gòu)的對象。這步與發(fā)送郵件的 as_string 函數(shù)相反。
先從上一節(jié)結(jié)構(gòu)化的 msg 中取出信件頭,打印出來。
如果是 multipart 結(jié)構(gòu), get_payload 函數(shù)會返回一個包含不同part的list,然后對每一part遞歸調(diào)用 print_info ,打印子信件頭和子信件內(nèi)容。
不是 multipart 時,之后再依據(jù) Content-Type 作不同處理:
如果是 text :
利用 get_payload(decode = Ture) 取出子信件的內(nèi)容, decode 為True,則按照 Content-Transfer-Type 將 base64 或 QP 解碼為 bytes 。
再 guess_charset 猜出編碼方式,之后將其解碼為字符顯示。
如果不是 Text 對象,則為附件:
打印出附件的 Content-Type 。
Python發(fā)送郵件簡單的實(shí)例:
#!/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'] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱
# 三個參數(shù):第一個為文本內(nèi)容,第二個 plain 設(shè)置文本格式,第三個 utf-8 設(shè)置編碼
message = MIMEText('Python 郵件發(fā)送測試...', '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 "郵件發(fā)送成功"
except smtplib.SMTPException:
print "Error: 無法發(fā)送郵件"
'''''?
函數(shù)說明:Send_email_text()?函數(shù)實(shí)現(xiàn)發(fā)送帶有附件的郵件,可以群發(fā),附件格式包括:xlsx,pdf,txt,jpg,mp3等?
參數(shù)說明:?
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?=?"發(fā)送方郵箱"??
passwd?=?"填入發(fā)送方密碼"??
receivers?=?receive_email???#收件人郵箱??
msgRoot?=?MIMEMultipart()???
msgRoot['Subject']?=?subject??
msgRoot['From']?=?sender??
if?len(receivers)1:??
msgRoot['To']?=?','.join(receivers)?#群發(fā)郵件??
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?("郵件發(fā)送成功")??
except?smtplib.SMTPException?as?e:??
print("Error,?發(fā)送失敗")??
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")
#?配置收發(fā)件人
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):
"""發(fā)送郵件"""
self.msg?=?MIMEMultipart()
#設(shè)置發(fā)送郵件
self.msg['from']?=?sendaddr_name
try:
#設(shè)置郵箱服務(wù)器
smtp?=?smtplib.SMTP('smtp.163.com',25)
#登錄
smtp.login(sendaddr_name,sendaddr_pswd)
#設(shè)置發(fā)送主題
self.msg['Subject']?=?sub
#設(shè)置郵件內(nèi)容
self.msg.attach(MIMEText(content))
#設(shè)置郵件附件,將附件的內(nèi)容attachcontent,寫到filename的文件中,作為附件發(fā)送
att1?=?MIMEText(attachcontent,?'base64',?'gb2312')
att1["Content-Type"]?=?'application/octet-stream'
att1["Content-Disposition"]?=?'attachment;?filename="testattach.txt"'#這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
self.msg.attach(att1)
#發(fā)送郵件
smtp.sendmail(self.msg['from'],?self.sendTo,?self.msg.as_string())
smtp.close()
print(u"發(fā)送郵件成功")
except?Exception,e:
print(u'發(fā)送郵件失敗:'+str(e))
raise
#調(diào)用
s?=?SendMail()
subject?=?"主題"
content?=?"這里是郵件內(nèi)容"
attachcontent?=?"這里是附件哦"
s.send(subject,content,attachcontent)
2.利用webpy自帶的email模塊
首先要安裝web.py的依賴庫
pip install web.py
#coding:utf-8
import?web
#####?email服務(wù)器配置?#####
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'這里是郵件的內(nèi)容'?
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?"郵件發(fā)送成功"
except?Exception,e:
print(str(e))
#調(diào)用
sendemail(send_from,receiveemailaddr,subject,message)