【Python成長之路】用python實現郵件發送功能

哈嘍大家好,我是鵬哥。

好久沒有寫博客了,最近是有點偷懶。今天想學習記錄的內容是 —— 郵件發送。

~~~上課鈴~~~

Time BackBad Style - Kontrabanda

1

課題背景

其實在寫Python成長之路系列,慢慢有些懈怠了,不知道要如何督促自己來學習成長。結果前段時間由於工作需要,需要經常以郵件方式發項目進展給同事。自然就聯想到了用python來替我完成機械式的動作。

2

效果展示

1、郵件正文發送,並將圖片、文本等以附件形式添加

 

2、以html超文本形式,將文本和圖片一起在正文裏顯示

3

遇到的坑(敲黑板啦)

其實關於python實現郵件發送的示例代碼或者網上有很多類似的帖子,從示例代碼來 看也很簡單。但是絕知此事要躬行後,會發現有幾個坑等着我去跳。

1、第一個坑:通過smtp登錄時,發現登錄報錯。錯誤碼如下:smtplib.SMTPHeloError: (500, b'Error: bad syntax')

開始遇到這個錯誤,網上一查,很快就找到了問題原因:是由於163郵箱沒有開戶客戶端授權,如下圖

這個問題很好解決,只需要根據界面提示開啓下授權。(這裏有個小細節,在代碼登錄時用的並不郵箱登錄密碼,而是這裏的授權碼;並且授權碼設置時不能和登錄密碼一樣。)

 

2、第二個坑:解決完授權碼後,運行代碼仍然報smtplib.SMTPHeloError: (500, b'Error: bad syntax')

這次爲了查找解決方法就有點費神了。其實這裏報錯,還 有一個原因,就是自己網絡問題。如果打印出和郵箱之間的消息交互,會發現這樣一段日誌:

send: ‘ehlo xxx—pc.DHCP HOST-xxxxxxxxxrn’ 

reply: ‘500 Error: bad syntaxrn’

這是因爲DHCP和HOST之間有空格導致!我的天!可以查看自己的網絡詳細信息中,“連接特定的DNS後綴”裏有“DHCP HOST”這個信息。

 

解決方法:

在“控制版面”中點擊“查看網絡狀態和任務”進入“網絡和共享中心”,點擊現在使用的網絡連接,點擊網絡連接的【屬性】按鈕,雙擊“Internet 協議版本 4(TCP/IPv4)”這一項,再點擊【高級】按鈕,切換到“DNS”標籤,把“此連接的 DNS 後綴”修改爲 HOST 或清空,然後依次確認保存。

▲DNS後綴改爲"HOST"

之後對應內容就會變成如下:

至此,smtplib.SMTPHeloError: (500, b'Error: bad syntax')完全解決。

 

3、第3個坑:無法將圖片加到正文中。

開始編寫代碼時,雖然知道要以html方式添加圖片,但是同時我還留有

# 添加文字內容text = "Hi!\n我是鵬哥,歡迎關注我的公衆號'鵬哥賊優秀'!"text_plain = MIMEText(text, 'plain', 'utf-8')self.message.attach(text_plain)# 添加文字內容

由於plain格式和html格式衝突,導致圖片最後並沒有真正以html方式添加到正文裏。因此,爲了實現此功能,需要將plain相關代碼刪除,將文本內容以html標題或者正文方式加進去。

4、其他的一些細節問

        (1)、如果添加圖片時,想把圖片重命名爲中文名稱,結果會圖片名稱會被自動命名,如下圖:

myimage["Content-Disposition"] = 'attachment; filename="公衆號.bmp"'myimage["Content-Disposition"] = 'attachment; filename="公衆號.bmp"'

 

(2)郵件賬號只需要@前面的內容或者自己的郵箱暱稱。

示例代碼

1、郵件正文發送,並將圖片、文本等以附件形式添加​​​​​​

# coding=utf-8# @Auther : "鵬哥賊優秀"# @Date : 2019/11/22# @Software : PyCharm
import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.header import Headerimport traceback
class Email():    def __init__(self,user,passwd,sender,receiver):        self.user = user        self.passwd = passwd        self.sender = sender        self.receiver = receiver
    def send_email(self):        try:            # 登入163郵箱            smtp = smtplib.SMTP()            smtp.connect('smtp.163.com',25)            smtp.login(self.user, self.passwd)
            # 構造郵件對象MIMEMultipart對象            self.message = MIMEMultipart('mixed')
            # 設置郵件發送者、接收者、郵件主題            self.message['From'] = Header('鵬哥賊優秀','utf-8')  # 發送者            self.message['To'] = Header('test')  # 接收者            self.message['Subject'] = Header('Python SMTP 郵件測試', 'utf-8') #郵件主題
            # 添加文字內容            text = "Hi!\n我是鵬哥,歡迎關注我的公衆號'鵬哥賊優秀'!"            text_plain = MIMEText(text, 'plain', 'utf-8')            self.message.attach(text_plain)            # 添加圖片附件            pic = open(r'F:\素材\圖片\公衆號.bmp', 'rb').read()            myimage = MIMEImage(pic)            myimage.add_header('Content-ID', '<image1>')            myimage["Content-Disposition"] = 'attachment; filename="公衆號.bmp"'            self.message.attach(myimage)            # 添加文件作爲附件            file = open(r'F:\Python成長之路\郵件發送\test.txt', 'rb').read()            myfile = MIMEText(file, 'base64', 'utf-8')            myfile["Content-Type"] = 'application/octet-stream'            myfile["Content-Disposition"] = 'attachment; filename="newtest.txt"'            self.message.attach(myfile)
            # 發送郵件            smtp.sendmail(self.sender, self.receiver, self.message.as_string())            smtp.quit()            print('郵件發送成功!')        except:            traceback.print_exc()            print('郵件發送失敗!')

if __name__ == "__main__":    user = '賬號'    passwd = '密碼'    sender = '[email protected]'    receiver = ['[email protected]']    email = Email(user,passwd,sender,receiver)    email.send_email()

 

2、將圖片加到正文中。(多數代碼是一樣的,僅message處不一致,因此只附這段代碼)

# 添加文字內容text = '''<html lang="en">            <body>            <h1>下面是我的公衆號</h1>            <img src="cid:0">            </body>            </html>'''text_plain = MIMEText(text, 'html', 'utf-8')self.message.attach(text_plain)# 添加圖片附件pic = open(r'F:\素材\圖片\公衆號.bmp', 'rb').read()myimage = MIMEImage(pic)myimage.add_header('Content-ID', '<0>')myimage["Content-Disposition"] = 'attachment; filename="公衆號.bmp"'self.message.attach(myimage)

點擊下方詩句,可以互動留言……

願你遇良人,予你歡喜城,長歌暖浮生

 

掃描二維碼

  與鵬哥一起學

python吧!

 

【參考】https://www.sohu.com/a/194137114_650589

發佈了38 篇原創文章 · 獲贊 17 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章