1. 程式人生 > 實用技巧 >python + SMTP 傳送郵件

python + SMTP 傳送郵件

# 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()