本文主要描述了利用Python發送郵件的基本方法,以及郵件發送的基本原理
在我們日常項目中,會經常使用到郵件的發送功能,如何利用Python發送郵件也是一項必備的技能。本文主要講述利用Python來發送郵件的一些基本操作。
本章主要包含知識點:
- 郵件發送原理簡述即常用smtp郵箱伺服器
- 發送文字郵件
- 發送html郵件
我們一般發送郵件時,用到的代理有outlook,qq郵箱等,不管用什麼代理,你都需要登入你的郵箱,而這個郵箱就是在各大郵箱伺服器上開辟的一部分空間,用來接收、發送和存儲你的郵件資訊。
說到郵件發送,不得不了解一下SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協定,是一種提供可靠且有效電子郵件傳輸的協定。郵件發送原理簡單講就是代理通過SMTP協定将資訊發送到郵箱伺服器上,郵箱伺服器再通過POP3協定轉發到收件人的郵件伺服器中,如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9AnYldnJwAzN9c3Pn5GcuQ0MlQ0MlcnW1JkbMBTVE5keRpmT1EEVNlHMD5EMZpmT6NGROhXSq1EejRUT3lERNlHMT10MRR1TwsGVNZ3YE10dJRUT5hzUNNTUU9EMrRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
是以使用Python發送郵件時,可以将Python的解釋器當做一個代理,需要首先連接配接到郵箱伺服器,将郵件發過去,那麼由于不同公司的郵箱伺服器位址不盡相同,這裡列出了一些常用的位址如下:
既然已經知道郵件發送原理,接下來就是用Python連接配接smtp伺服器,不就可發送郵件了。其實強大的python早就封裝好了一個package:email, 利用其中的幾個類即可實作,具體代碼如下:
1 from email.mime.text import MIMEText
2 from email.header import Header
3 from email.mime.multipart import MIMEMultipart
4 import smtplib
5
6
7 class Email(object):
8
9 def __init__(self):
10 self.smtp = ''
11 self.username = ''
12 self.password = ''
13
14 self.subject = ''
15 self.sender = ''
16 self.receiver = []
17 self.cc = []
18
19
20 def message_init(self, html):
21 message = MIMEMultipart()
22 message['subject'] = Header(self.subject, 'utf-8')
23 message['From'] = self.sender
24 message['To'] = ', '.join(self.receiver)
25 message['Cc'] = ', '.join(self.cc)
26
27 # 解決亂碼, html是html格式的str
28 message_context = MIMEText(html, _subtype='html', _charset='utf-8')
29
30 # 郵件正文内容
31 message.attach(message_context)
32
33 return message
Email自定義類中屬性包含了郵箱伺服器的位址,郵箱登入的使用者名和密碼,郵件主題,發件人,收件人和抄送人。這裡注意了,收件人和抄送人是個list,添加的時候使用append()
message_init(self, html)即将發送内容進行初始化,包括郵件發送和收件人的初始化。其中 MIMEText(html, _subtype='html', _charset='utf-8') 中,參數一為發送的郵件内容,為字元串;參數二表示設定文本格式為html(郵件都是使用html格式發送的);參數三表示設定編碼格式為utf-8。如上這樣一個郵件資訊包就構造好了,萬事俱備隻欠東風,發送郵件的核心代碼如下:
1 def send_email(self, html):
2 message = self.message_init(html)
3 smtp_obj = smtplib.SMTP(self.smtp)
4 smtp_obj.login(self.username, self.password)
5 smtp_obj.sendmail(self.sender, self.receiver + self.cc, message.as_string())
6 smtp_obj.quit()
模拟正常用戶端郵件發送,遵循登入->發送->退出原則, 這裡注意sendmail的第二個參數為 收件人和抄送人的合集。
下面來測試一下這個代碼是否可行,發送一段簡單的文字:
1 if __name__ == '__main__':
2 print('start……')
3 sende = Email()
4 strs = "This is a test email / 這是一封測試郵件"
5
6 sende.smtp = 'smtp.163.com'
7 sende.username = '[email protected]'
8 sende.password = 'xxxxxx'
9
10 sende.subject = 'Test/測試郵件'
11 sende.sender = '[email protected]'
12 sende.receiver.append('[email protected]')
13 sende.cc.append('[email protected]')
14
15 sende.send_email(strs)
16
17 print('end')
如上,測試了發送中文和英文兩種語言,發送了測試的簡單字元串,實測結果可行,截圖如下
那麼如何發送html格式檔案呢?其實想想也很簡單,将html檔案全部讀取出來之後,轉為str即可,如何轉換,可以參考我之前寫的文章,讀取檔案生成str,參考連結:https://www.cnblogs.com/potato-find/p/13216471.html 使用 readFile 方法即可,然後複用上述的方法。具體的代碼就不在這裡展現了,有興趣的同學可以結合實作一下呢。
那麼,利用Python如何發送郵件已經都了解了吧,那麼這時就會引發更深的問題:如何添加附件?如何發送圖檔呢? Good question! 關注我,下期為你解答。
(希望我的文章能夠助你一臂之力,成就更輝煌的你,關注我,我們一起進步)