Python實作電子郵件發送
在生活中或許我們多數都在用微信或者是QQ,但是工作中就會涉及郵件了,我也是最近在工作中用到了,是以找了些資料,有的較為完備有的就特别零散,是以自己也來整理分享一下。這裡主要整理關于SMTP子產品的郵件發送。
smtplib官網
SMTP(Simple Mail Transfer Protocol) 即簡單郵件傳輸協定,它是一組用于由源位址到目的位址傳送郵件的規則,由它來控制信件的中轉方式.
下面大概講述一下SMTP發送郵件的流程:
- 連接配接伺服器
- 登入
- 發送服務請求
- 退出
SMTP服務開啟以授權碼擷取
想要進行郵件的發送操作,首先要搞清楚發件的郵箱的 SMTP 伺服器位址和加密方式,當然别忘了打開 SMTP 服務。這裡以qq郵箱和163郵箱為例子:
登入郵箱進入設定:
進入設定之後,選擇賬戶,往下拉一點兒就可以看到各個服務了:
跟着他的步驟走就收到一個授權碼,這個授權碼是用于後面郵箱登入的,要儲存下來哦
設定好了還要擷取授權碼:
如果忘記了授權碼就重設授權碼。
163郵箱是可以自己設定授權碼的。
Python中SMTP使用
由于騰訊企業郵箱使用 SSL 加密方法,是以需要調用 smtplib 的 SMTP_SSL() 方法并提供 465 端口号。
login() 用于登陸到 SMTP 伺服器,第一個參數為郵件位址,第二個參數為密碼(親測為授權碼)。login()的傳回碼
# 235 == 'Authentication successful'
# 503 == 'Error: already authenticated'
import smtplib
#定義輸入資訊
from_email = r'填發送的郵箱'
password = r'填授權碼'
to_email = r'發送郵箱的位址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自動去适配郵箱的smtp
smtp_ssl_num =465#看情況修改
# 連接配接 SMTP 伺服器并登陸
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
status = smtp.login(from_email,password)
print(status)
print(type(status))
print('狀态:',status[1])
輸出結果:
(235, b'Authentication successful')
<class 'tuple'>
狀态: b'Authentication successful'
這樣就成功連接配接到伺服器了。
加密SMTP
使用标準的25端口連接配接SMTP伺服器時,使用的是明文傳輸,為了安全起見,要更安全地發送郵件,可以加密SMTP會話,就是先建立SSL安全連接配接,然後再使用SMTP協定發送郵件。
郵件服務商 | SMTP | SSL加密端口 |
---|---|---|
qq. | smtp.qq.com | 465或587 |
網易 | smtp.163.com | 465或994 |
建構郵件主體
郵件格式遵循一定的規範,MIME(多用途網際網路郵件擴充類型)。如果對此不熟悉,也沒有關系,我們使用 Python 内置的 email 子產品中的 MIME 子產品來建構一個文本郵件對象。
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#定義輸入資訊
from_email = r'填發送的郵箱'
password = r'填授權碼'
to_email = r'發送郵箱的位址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自動去适配郵箱的smtp
smtp_ssl_num =465
# 建構要發送的郵件内容
text = '正文内容'
title = '我是标題'
m = MIMEText(text, 'plain', 'utf-8')
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email, 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
smtp.login(fromaddr,password)
smtp.sendmail(from_email, to_email, m.as_string())
print('success')
smtp.close()#關閉連接配接
except smtplib.SMTPException as e:
print('error:',e) #列印錯誤
注意:連接配接上了,操作結束後要關閉連接配接。
發送帶多附件的郵件
發送各種帶附件的郵件
使用MIMEMultipart來标示這個郵件是多個部分組成的,然後attach各個部分。如果是附件,則add_header加入附件的聲明。
MIME有很多種類型,比較麻煩,如果附件是:
- 圖檔格式,用MIMEImage,
- 音頻,要用MIMEAudio,
- word、excel,我都不知道該用哪種MIME類型
如果想偷懶就不管什麼類型的附件,都用MIMEApplication,MIMEApplication預設子類型是application/octet-stream。
看代碼你就明白了:
import smtplib
from email.mime.text import MIMEText#用于發送純文字或者HTML
from email.mime.image import MIMEImage#用于發送圖檔
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication #萬能附件發送
from_email = r'填發送的郵箱'
password = r'填授權碼'
to_email = r'發送郵箱的位址'
smtp_ssl = 'smtp.' + from_email.split('@')[-1]#自動去适配郵箱的smtp
smtp_ssl_num =465
title = '送給寶貝的一封信'
content = '正文資訊:我給你發了許多附件,請查收!.'
textApart = MIMEText(content)
#正文文字無需通過add_header加入到
imageFile = r'E:/emailtest/test.jpg'
imageApart = MIMEImage(open(imageFile, 'rb').read(), imageFile.split('.')[-1])
imageApart.add_header('Content-Disposition', 'attachment', filename=imageFile.split('/')[-1])
pdfFile = r'E:/emailtest/《Python進階》.pdf'
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',pdfFile.split('/')[-1]))
zipFile = r'E:/emailtest/《Python進階》.zip'
zipApart = MIMEApplication(open(zipFile, 'rb').read())
zipApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',zipFile.split('/')[-1]))
m = MIMEMultipart()
m.attach(textApart)#加入正文資訊
m.attach(imageApart)#加入圖檔
m.attach(pdfApart)#加入pdf
m.attach(zipApart)#加入壓縮包
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email[i], 'utf-8')
try:
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
smtp.login(from_email,password)
smtp.sendmail(from_email, to_email, m.as_string())
print('successful')
smtp.quit()
except smtplib.SMTPException as e:
print('error:',e) #列印錯誤
其中
filename=('gbk','',zipFile.split('/')[-1])
是為了避免顯示出現亂碼情況而加入的,如果gbk還是亂碼可以試試
utf-8
,我的用
gbk
沒有問題。
寫在最後
希望你看了能夠有所收獲,不用要那麼多彎路。接觸到python郵件發送是因為工作中需要編寫一個exe給别的程式去調用,是以查了些資料,然後整理了一下有空就分享一下。下一篇部落格再把多人接受多附件的郵件發送python腳本分享出來(要去看看哦,可以封裝成為exe然後通過cmd指令行就可以調用了,當然參數是可以自定義的啦)。