天天看點

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

Python實作電子郵件發送

在生活中或許我們多數都在用微信或者是QQ,但是工作中就會涉及郵件了,我也是最近在工作中用到了,是以找了些資料,有的較為完備有的就特别零散,是以自己也來整理分享一下。這裡主要整理關于SMTP子產品的郵件發送。

smtplib官網

SMTP(Simple Mail Transfer Protocol) 即簡單郵件傳輸協定,它是一組用于由源位址到目的位址傳送郵件的規則,由它來控制信件的中轉方式.

下面大概講述一下SMTP發送郵件的流程:

  1. 連接配接伺服器
  2. 登入
  3. 發送服務請求
  4. 退出

SMTP服務開啟以授權碼擷取

想要進行郵件的發送操作,首先要搞清楚發件的郵箱的 SMTP 伺服器位址和加密方式,當然别忘了打開 SMTP 服務。這裡以qq郵箱和163郵箱為例子:

登入郵箱進入設定:

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

進入設定之後,選擇賬戶,往下拉一點兒就可以看到各個服務了:

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件
Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

跟着他的步驟走就收到一個授權碼,這個授權碼是用于後面郵箱登入的,要儲存下來哦

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

設定好了還要擷取授權碼:

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

如果忘記了授權碼就重設授權碼。

Python郵件發送SMATP子產品詳細總結(含qq郵箱及163郵箱服務開啟及授權碼擷取,多附件發送)Python實作電子郵件發送發送各種帶附件的郵件

163郵箱是可以自己設定授權碼的。

Python中SMTP使用

由于騰訊企業郵箱使用 SSL 加密方法,是以需要調用 smt­plib 的 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指令行就可以調用了,當然參數是可以自定義的啦)。

繼續閱讀