python + SMTP 傳送郵件
阿新 • • 發佈:2020-08-19
# SMTP傳送郵件 import smtplib from email.mime.image import MIMEImage from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from Config import ConstantConfig as con # class SendEmail(): # # def __init__(self): # # 第三方 SMTP 服務 # self.mail_host = con.MAIL_HOST # 設定伺服器 # self.mail_user = con.MAIL_USER # 使用者名稱 # self.mail_pass = con.MAIL_PW # 傳送方郵箱的授權碼 # self.sender = con.SENDER # 郵件傳送方 # self.receivers = con.RECEIVERS # 郵件接收方,可設定為你的QQ郵箱或者其他郵箱 # # """傳送附件""" # def send_enclosure(self,file_name): # # # 建立一個帶附件的例項 # message = MIMEMultipart() # message['From'] = Header(self.sender, 'utf-8') # message['To'] = Header(str(self.receivers), 'utf-8') # subject = con.SUBJECT # 郵件主題 # message['Subject'] = Header(subject, 'utf-8') # # #郵件正文內容 # message.attach(MIMEText(con.TEXT, 'plain','utf-8')) # 'plain'表示純文字 # # # 構造附件1,傳送當前目錄下的 test.txt 檔案 # att1 = MIMEText(open(file_name,encoding='utf-8').read()) # att1["Content-Type"] = 'application/octet-stream' # # 這裡的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字 # att1["Content-Disposition"] = 'attachment; filename=%s'%file_name # message.attach(att1) # # try: # smtpObj = smtplib.SMTP() # smtpObj.connect(self.mail_host, 25) # 25 為 SMTP 預設埠號 # smtpObj.login(self.mail_user, self.mail_pass) # 登入郵箱 # smtpObj.sendmail(self.sender, self.receivers, message.as_string()) # 傳送郵件,as_string()把MIMEText物件變成str # print("郵件傳送成功") # except smtplib.SMTPException as e: # print("Error: {}".format(e)) # SendEmail().send_enclosure(r"D:\P5-Metabase BI\Reports\result_2020-08-17-17_45_31.html") def sendEmail(file_name): global s msg = MIMEMultipart('mixed') msg['Subject'] = con.SUBJECT msg['From'] = con.SENDER msg['To'] = ';'.join(con.RECEIVERS) #有多個收件人時,通過join將列表轉換為以;為間隔的字串 # 構造文字內容 text_plain = MIMEText(con.TEXT, 'plain', 'utf-8' ) msg.attach(text_plain ) # 構造圖片連結 with open(con.IMAGR_PATH, 'rb' ) as f: sendimagefile = f.read() image = MIMEImage(sendimagefile ) image.add_header('Content-ID', '<image1>' ) image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image ) # 構造html # 傳送正文中的圖片:由於包含未被許可的資訊,網易郵箱定義為垃圾郵件,報554 DT:SPM :<p><img src="cid:image1"></p> with open(file_name,'rb') as f: html = f.read() text_html = MIMEText(html, 'html', 'utf-8' ) text_html["Content-Disposition"] = 'attachment; filename=%s'%file_name msg.attach(text_html ) # 構造附件 with open(file_name, 'rb') as f: sendfile = f.read() # rc.get_email("report_path") 為測試報告的地址 text_att = MIMEText(sendfile, 'base64', 'utf-8' ) text_att["Content-Type"] = 'application/octet-stream' # 以下附件可以重新命名成aaa.txt # text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"' # 另一種實現方式 text_att.add_header('Content-Disposition', 'attachment', filename='aaa.txt' ) # 以下中文測試不ok # text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8') msg.attach(text_att ) #傳送郵件 try: s = smtplib.SMTP_SSL(con.MAIL_HOST, con.MAIL_PORT)# 郵件伺服器及埠號 s.login(con.MAIL_USER, con.MAIL_PW ) s.sendmail(con.SENDER, con.RECEIVERS, msg.as_string() ) print("郵件傳送成功") except smtplib.SMTPException as e: print("Error: {}".format(e)) finally: s.quit()