哈嘍大家好,我是鵬哥。
好久沒有寫博客了,最近是有點偷懶。今天想學習記錄的內容是 —— 郵件發送。
~~~上課鈴~~~
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)郵件賬號只需要@前面的內容或者自己的郵箱暱稱。
4 示例代碼
1、郵件正文發送,並將圖片、文本等以附件形式添加
# coding=utf-8
# @Auther : "鵬哥賊優秀"
# @Date : 2019/11/22
# @Software : PyCharm
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.header import Header
import 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吧!