python: 傳送內容帶圖片的郵件

南郭竽發表於2018-04-23

強推:Python 菜譜,裡面對 python傳送帶圖片的郵件講的比較清楚。

剛好我有一個需求,就傳送一個網頁形式的郵件,而且網頁中有圖片。

下面是我自己的傳送帶圖片的郵件的程式碼:

def send_email(subject, to_address_list, cc_address_list):
    import smtplib
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage

    sendObj = smtplib.SMTP('mail.gometech.com.cn', 25)
    sendObj.set_debuglevel(1)  # 列印debug日誌
    print(sendObj)  # ok 了
    # 2. 跟伺服器建立連線
    sendObj.ehlo()
    # 3. 實現加密的必須的步驟
    # sendObj.starttls()

    username = r'lemon.tony@163.com'
    password = _get_password()

    # ##########################--------------- start
    # 讀取html檔案內容
    f = open('e:/py/notification.html', 'r', encoding='utf-8')
    mail_body = f.read()
    f.close()

    # 00. 型別需要是 multipart 的
    msg = MIMEMultipart('related')
    msg['To'] = ",".join(to_address_list)
    msg['Cc'] = ",".join(cc_address_list)
    msg['Subject'] = Header(subject, 'utf-8').encode()

    # 01. 新增文字
    msgText = MIMEText(mail_body.replace('{username}', newly_gerrit()), _subtype='html', _charset='utf-8')
    msg.attach(msgText)
    # 02. 新增圖片
    file = open("e:/py/dns.jpg", "rb")
    img_data = file.read()
    file.close()
    img = MIMEImage(img_data)
    img.add_header('Content-ID', 'dns_config') 
    msg.attach(img)

    login_result = sendObj.login(username, password)
    # 4. 傳送郵件
    send_result = sendObj.sendmail(username, to_address_list + cc_address_list,
                                   msg.as_string())
    # 5. 傳送完成,退出
    quit_result = sendObj.quit()
    print(login_result, send_result, quit_result)

注意點:

msg = MIMEMultipart('related') 必須選擇這個型別的,不然不能又包含圖片,又包含文字。msg相當於一個容器,本身沒有具體的內容。如果要什麼內容,就呼叫 msg.attach(msgText)這樣的方法去包含。

# 02. 新增圖片
file = open("e:/py/dns.jpg", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'dns_config') # todo: 注意這裡的 dns_config 是和 html中對應的
msg.attach(img)

對應的 html中的程式碼:

<img src="cid:dns_config" alt="dns配置"> 
<!--todo: src 不是一個路徑了,而是 cid:dns_config 這樣的一個東西 -->

大體上內容就這些,跪安吧。


另外,對於給多個收件人設定暱稱,需要使用到新的方法 : email.utils.formataddr

    from email.utils import parseaddr, formataddr

    subject = r"這是主題"
    to_address = [r'灰貓不是貓<grey.cat@gmail.com>']  
    cc_address = [formataddr((r'藍貓不是貓', 'blue.cat@gmail.com'), charset='utf-8'),
                  formataddr((r'呂布', 'tom.cat@gmail.com'), charset='utf-8'),]
    send_email(subject, to_address, cc_address)

相關文章