利用Python收发邮件
一封電子郵件的發(fā)送過程:
1. 發(fā)件人 -> MUA ?? MUA: 郵件用戶代理 ?? 像Outlook或faxmail之類的軟件就屬于MUA
2. MUA -> MTA ? ? ? MTA:郵件傳輸代理 ? 郵件服務(wù)提供商就屬于MTA,比如網(wǎng)易、新浪等
3、MTA->MTA ? ? ? 由于收發(fā)郵件雙方的服務(wù)提供商可能不同,比如有的是@sina.com, 有的是@163.com? 所有這時就要涉及到 ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MTA之間的轉(zhuǎn)發(fā)
4、MTA->MDA ? ?? MDA:郵件投遞代理 ? 郵件到達MDA后,郵件會存放在目的信箱的某個服務(wù)器上。
5、MDA->MUA ? ?? 收件人要取到郵件必須要通過MUA從MDA上把郵件取到電腦本地
所以編寫程序來實現(xiàn)發(fā)送和接收郵件,本質(zhì)上就是:
1. 編寫MUA把郵件發(fā)到MTA ? 這個過程使用SMTP協(xié)議
2. 編寫MUA從MDA上收郵件 ?? 這個過程使用POP3或者IMAP協(xié)議
假設(shè)我們現(xiàn)在有兩個郵箱:xxx@163.com ?? xxx@qq.com
大多數(shù)的郵件服務(wù)商都需要手動打開SMTP發(fā)信和POP收信功能,否則只允許在網(wǎng)頁登錄。
(一)從163郵箱發(fā)送郵件到qq郵箱
注意:當(dāng)用程序模擬MUA發(fā)送郵件時,要保證163郵箱的SMTP服務(wù)開啟,而qq郵箱沒有特殊設(shè)置(前提是你用網(wǎng)頁打開郵箱)
網(wǎng)易默認開啟這些服務(wù),但是要成功發(fā)送郵件還要開啟“客戶端授權(quán)碼”
開啟之后會讓用戶設(shè)置一個授權(quán)碼
Python對SMTP支持有smtplib和email兩個模塊,email負責(zé)構(gòu)造郵件,smtplib負責(zé)發(fā)送郵件,可以發(fā)送純文本郵件、HTML郵件和帶附件的郵件。
#!/usr/bin/python
#coding=utf-8
from email.mime.text import MIMEText
import smtplib
send_str = '''
你好:
? ? ?收到信息請回復(fù),謝謝!
此致
? ?敬禮
'''
msg = MIMEText(send_str, 'plain', 'utf-8') ? ? #構(gòu)建發(fā)送的正文文本,’send_str‘就是郵件的正文,’plain‘代表純文本
from_addr = 'xxx@163.com' ? ? ?? #發(fā)件人信箱
password = 'xxxxx' ? ? ? ? ? ? ? ? ? ? ? #客戶端授權(quán)密碼
to_addr = '871990719@qq.com'? #收件人信箱
smtp_server = 'smtp.163.com' ? ? #smtp地址
msg['subject'] = 'python' ? ? ?? #郵件主題
msg['from'] = from_addr ? ? ? #收件人
msg['to'] = to_addr ? ? ? ? ? ?? #發(fā)件人
server = smtplib.SMTP_SSL() ? ? #使用SSL方式
server.connect(smtp_server, '465') #注意端口號是465
#server.set_debuglevel(1) ? ? ? #設(shè)置debug模式 可以顯示交互過程
server.login(from_addr, password) ? #登錄SMTP服務(wù)器
server.sendmail(from_addr, [to_addr], msg.as_string()) ? #發(fā)送郵件 ? 可以發(fā)送多人所以收件人地址是一個list
server.quit()
注意:通過實驗發(fā)現(xiàn) 通過163信箱發(fā)送郵件時,“郵件主題” “收件人” “發(fā)件人”不能全空,否則發(fā)送會失敗
(二)發(fā)送帶附件的郵件
使用MIMEMutipart為郵件添加 “發(fā)送文本”和“附件”
send_str = '<h1 style="color:red">上岸報考祝您成功</h1>'
textApart = MIMEText(send_str, 'html', 'utf-8') ?? #采用“html”格式發(fā)送文本,可以設(shè)置文本格式
pdfFileLocation = 'C:\\project\\io_file\\output\\'
pdfName = '報考 .pdf' ? #這里如果采用utf-8編碼,發(fā)送郵件中的附件格式不正確
pdfFile = (pdfFileLocation+pdfName).decode('utf-8') ? #這里進行utf-8編碼,以便正確查找文件位置
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=pdfName)
msg = MIMEMultipart()
msg.attach(textApart)
msg.attach(pdfApart)
msg['subject'] = u'報考崗位分析'
msg['from'] = '上岸報考<exam_success@163.com>' ? #這種設(shè)置便于在收件人 的收件箱中顯示發(fā)件人信息
msg['to'] = to_addr?
后面發(fā)送郵件步驟同(一)
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的利用Python收发邮件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab常用代码及操作
- 下一篇: NOI-砝码称重v2 多重背包 生成函数