2022.5.1周學習總結
阿新 • • 發佈:2022-05-09
目錄
Python傳送郵件
smtplib 是 Python 用來發送郵件的模組,email 是用來處理郵件訊息
這裡,我們使用裝飾器來製作傳送郵件的功能
一、 文字資訊
我們使用MIMEText
來發送文字資訊
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: A.L.Kun # @file : mail.py # @time : 2022/5/7 16:48 from smtplib import SMTP from email.mime.text import MIMEText # 傳送文字資訊使用的庫 from email.header import Header # 設定請求的頭部資訊 from email.utils import formataddr # 格式化 from functools import wraps receivers = ['[email protected]',] # 接收者為可迭代物件,可以實現郵件的群發 subject = '測試郵件' # 設定郵件的標題 def decorate(fun_): username = '[email protected]' # 傳送郵件的qq號 password_pass = 'meryyupicqjjciei' # 授權密碼,有的郵箱是使用登入密碼 smtp = SMTP('smtp.qq.com') # 建立一個SMTP伺服器,這裡使用qq郵箱 smtp.login(username, password_pass) # 登入 @wraps(fun_) def func_mail(*args, **kwargs): fun_(smtp, username, *args, **kwargs) # 呼叫發郵件的函式 smtp.quit() # 關閉伺服器 smtp.close() return func_mail @decorate def mail(smtp, username): for receiver_ in receivers: msgRoot = MIMEText(f"這是一個測試郵件,不要回復哦~~~", "html", "utf-8") # 如果第二個引數為plain,則是傳送純文字資訊,如果郵件有中文,就要使用utf-8 msgRoot["Subject"] = Header(subject, "utf-8") # 設定文字標題 msgRoot['From'] = formataddr(("A.L.Kun", username)) # 設定發件人資訊 msgRoot['To'] = formataddr((receiver_.split("@")[0], receiver_)) # 設定收件人資訊 smtp.sendmail(username, receiver_, msgRoot.as_string()) # 傳送郵件 # smtp.set_debuglevel(1) # 輸出除錯資訊 print(receiver_.split("@")[0], ':傳送完成') if __name__ == '__main__': mail()
使用裝飾器的好處,可以動態建立一個傳送郵件的物件,同時可以不用關注郵件的配置,只要關注郵件的內容
二、 圖片資訊
我們可以使用MIMEImage
來讀取圖片資料,然後進行傳送
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: A.L.Kun # @file : mail.py # @time : 2022/5/7 16:48 from smtplib import SMTP from email.mime.text import MIMEText # 傳送文字資訊使用的庫 from email.mime.multipart import MIMEMultipart # 可以傳送多種型別的郵件 from email.mime.image import MIMEImage # 讀取圖片資訊 from email.header import Header from email.utils import formataddr from functools import wraps import os receivers = ['[email protected]',] subject = '測試郵件' pic_path = "./test.jpeg" def decorate(fun_): username = '[email protected]' password_pass = 'mdsrecuicqjjciei' smtp = SMTP('smtp.qq.com') smtp.login(username, password_pass) @wraps(fun_) def func_mail(*args, **kwargs): fun_(smtp, username, *args, **kwargs) smtp.quit() smtp.close() return func_mail @decorate def mail(smtp, username): for receiver_ in receivers: msgRoot = MIMEMultipart("related") # 建立一個容器,可以為related模式,可以往裡面新增文字、圖片、附件 msgRoot["Subject"] = Header(subject, "utf-8") msgRoot['From'] = formataddr(("A.L.Kun", username)) msgRoot['To'] = formataddr((receiver_.split("@")[0], receiver_)) pic_data = open(pic_path, "rb").read() # 讀取圖片資料 """以附件的形式傳送圖片""" send_img_f = MIMEImage(pic_data) # 設定頭部資訊,第一個引數和第二個引數都表示以附件的形式傳送,最後一個表示檔案的檔名 # 只要設定了這個頭部資訊,就是為傳送附件 send_img_f.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(pic_path))) msgRoot.attach(send_img_f) # 將圖片附件新增到容器中 """將圖片新增到正文中""" send_img_c = MIMEImage(pic_data) # 設定圖片的唯一標識,即圖片的id為img1,通過`cid:img1`訪問 send_img_c.add_header("Content-Id", "<img1>") msgRoot.attach(send_img_c) # 要先將圖片資料上傳到容器中 img_text = f""" <p>這是一張圖片:</p> <br><img src="cid:img1" width="300" alt={os.path.basename(pic_path)}></br> """ # 使用匯入的圖片資料 msgRoot.attach(MIMEText(img_text, "html", "utf-8")) smtp.sendmail(username, receiver_, msgRoot.as_string()) print(receiver_.split("@")[0], ':傳送完成') if __name__ == '__main__': mail()
三、 附件
我們使用MIMEApplication
來發送附件
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: A.L.Kun # @file : mail.py # @time : 2022/5/7 16:48 from smtplib import SMTP from email.mime.multipart import MIMEMultipart from email.header import Header from email.mime.application import MIMEApplication # 傳送二進位制附件 from email.utils import formataddr from functools import wraps import os receivers = ['[email protected]',] subject = '測試郵件' file_lis = ["./test2.pptx", "./test.jpeg"] def decorate(fun_): username = '[email protected]' password_pass = 'mwdftrtycqjjciei' smtp = SMTP('smtp.qq.com') smtp.login(username, password_pass) @wraps(fun_) def func_mail(*args, **kwargs): fun_(smtp, username, *args, **kwargs) smtp.quit() smtp.close() return func_mail @decorate def mail(smtp, username): for receiver_ in receivers: msgRoot = MIMEMultipart("related") # 建立一個容器,必須為related模式,可以往裡面新增文字、圖片、附件 msgRoot["Subject"] = Header(subject, "utf-8") msgRoot['From'] = formataddr(("A.L.Kun", username)) msgRoot['To'] = formataddr((receiver_.split("@")[0], receiver_)) for file in file_lis: # 建立二進位制檔案資料 msgFile = MIMEApplication(open(file, "rb").read()) # 設定標頭 msgFile.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(file))) # 將資料新增到容器中 msgRoot.attach(msgFile) smtp.sendmail(username, receiver_, msgRoot.as_string()) print(receiver_.split("@")[0], ':傳送完成') if __name__ == '__main__': mail()