使用 Python 發送一封郵件
1. 簡介
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議, 它是一組用于傳送郵件的規則,由它來控制信件的中轉方式。
Python 的 smtplib 模塊對 smtp 協議進行了簡單的封裝,提供了一種方便的途徑發送電子郵件。
2. 配置發送服務器
2.1 簡介
在本節的例子中,使用 QQ 郵箱的 SMTP 服務發送郵件,需要對 QQ 郵件發送進行配置。
本節的例子中,假設用戶的信息如下:
- 用戶郵件地址,假設為 [email protected]
- 使用 SMTP 服務的密碼,需要對 QQ 郵件進行配置后獲取,注意:不是登錄 QQ 郵箱的密碼
2.2 進入設置界面
需要在 PC 端通過瀏覽器登錄 QQ 郵箱:
- 點擊設置,進入郵箱設置
- 在郵箱設置中,點擊賬戶
2.2 設置 POP3/SMTP 發送服務器
在賬戶設置的 TAB 頁面中,選擇 “開啟服務:POP3/SMTP 服務”。
2.3 通過短信開啟 POP3/SMTP 服務
選擇 "開啟服務:POP3/SMTP 服務"后,系統提示通過發送短信開啟 POP3/SMTP 服務
2.4 獲取 SMTP 服務密碼
按照系統提示操作后,系統會給出使用 SMTP 服務的密碼,請記住該服務密碼,在后續的小節中會使用該密碼。
3. 發送文本格式的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
- 導入 smtplib 用于發送郵件
- 導入類 Header 和 MIMEText 用于構造郵件
fromAddr ='[email protected]'
password = 'password for smtp'
toAddr ='[email protected]'
subject = 'hello world'
content = '你好,世界'
- fromAddr 為發送郵件地址
- toAddr 為目的郵件地址,設置成與發送郵件地址相同,表示向自己發送一封郵件
- password 是使用 SMTP 服務的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節
- subject 是郵件標題
- content 是郵件內容
def makeMail():
mail = MIMEText(content, 'plain', 'utf-8')
mail['From'] = Header(fromAddr, 'utf-8')
mail['To'] = Header(toAddr, 'utf-8')
mail['Subject'] = Header(subject, 'utf-8')
return mail
- 在第 1 行,函數 makeMail() 根據 fromAddr、toAddr、subject、content 構造一封郵件
- 在第 2 行,使用 MIMEText 構造一個文本格式的郵件
- MIMEText 的第二個參數 plain,表示郵件的內容是文本格式
- 在第 3 行,構造郵件頭 From
- 在第 4 行,構造郵件頭 To
- 在第 5 行,構造郵件頭 Subject
def sendMail(mail):
server = smtplib.SMTP_SSL("smtp.qq.com")
server.login(fromAddr, password)
server.sendmail(fromAddr, toAddr, mail.as_string())
server.quit()
- 在第 1 行,函數 sendMail 調用 SMTP 服務發送郵件 mail
- 在第 2 行,獲取 SMTP 服務器,使用 QQ 發送服務
- 在第 3 行,登錄 SMTP 服務
- 在第 4 行,通過 SMTP 服務器發送服務
mail = makeMail()
sendMail(mail)
print('發送郵件成功')
運行程序,在 QQ 郵箱中收到郵件:
4. 發送 html 格式的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
- 導入 smtplib 用于發送郵件
- 導入類 Header 和 MIMEText 用于構造郵件
fromAddr ='[email protected]'
password = 'password for smtp'
toAddr ='[email protected]'
subject = 'hello with html content'
content = '<b>Please click</b> <a href="http://www.xianlaiwan.cn">imooc</a>'
- fromAddr 為發送郵件地址
- toAddr 為目的郵件地址,設置成與發送郵件地址相同,表示向自己發送一封郵件
- password 是使用 SMTP 服務的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節
- subject 是郵件標題
- content 是郵件內容,例子中使用 HTML 格式的文本
def makeMail():
mail = MIMEText(content, 'html', 'utf-8')
mail['From'] = Header(fromAddr, 'utf-8')
mail['To'] = Header(toAddr, 'utf-8')
mail['Subject'] = Header(subject, 'utf-8')
return mail
- 在第 1 行,函數 makeMail() 根據 fromAddr、toAddr、subject、content 構造一封郵件
- 在第 2 行,使用 MIMEText 構造一個文本格式的郵件
- MIMEText 的第二個參數 html,表示郵件的內容是 HTML 格式
- 在第 3 行,構造郵件頭 From
- 在第 4 行,構造郵件頭 To
- 在第 5 行,構造郵件頭 Subject
def sendMail(mail):
server = smtplib.SMTP_SSL("smtp.qq.com")
server.login(fromAddr, password)
server.sendmail(fromAddr, toAddr, mail.as_string())
server.quit()
- 在第 1 行,函數 sendMail 調用 SMTP 服務發送郵件 mail
- 在第 2 行,獲取 SMTP 服務器,使用 QQ 發送服務
- 在第 3 行,登錄 SMTP 服務
- 在第 4 行,通過 SMTP 服務器發送服務
mail = makeMail()
sendMail(mail)
print('發送郵件成功')
運行程序,在 QQ 郵箱中收到郵件:
5. 發送帶有附件的郵件
5.1 附件 hello.c
在當前目錄下,創造文件 hello.c,內容如下:
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
5.2 發送帶有附件的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
- 導入 smtplib 用于發送郵件
- 導入類 Header 和 MIMEText 用于構造郵件
- 導入類 MIMEMultipart 用于構造帶有附件的郵件
fromAddr ='[email protected]'
password = 'password for smtp'
toAddr ='[email protected]'
subject = 'hello with attachment'
content = '你好,請查收附件'
- fromAddr 為發送郵件地址
- toAddr 為目的郵件地址,設置成與發送郵件地址相同,表示向自己發送一封郵件
- password 是使用 SMTP 服務的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節
- subject 是郵件標題
- content 是郵件內容
def makeAttachment(filename):
file = open(filename, 'rb')
blob = file.read()
attachment = MIMEText(blob, 'base64', 'utf-8')
attachment["Content-Type"] = 'application/octet-stream'
attachment["Content-Disposition"] = 'attachment; filename="%s"' % filename
return attachment
- 在第 1 行,函數 makeAttachment 構造一個附件
- 在第 2 行到第 3 行,讀取當前目錄下的文件 filename 的內容
- 在第 3 行,構造附件對象 attachment
- 在第 4 行到第 5 行,設置附件屬性
def makeMail():
mail = MIMEMultipart()
mail['From'] = Header(fromAddr, 'utf-8')
mail['To'] = Header(toAddr, 'utf-8')
mail['Subject'] = Header(subject, 'utf-8')
mail.attach(MIMEText(content, 'plain', 'utf-8'))
return mail
- 在第 1 行,函數 makeMail() 根據 fromAddr、toAddr、subject、content 構造一封郵件
- 在第 2 行,使用 MIMEMultipart 構造一個帶有附件的郵件
- 在第 3 行,構造郵件頭 From
- 在第 4 行,構造郵件頭 To
- 在第 5 行,構造郵件頭 Subject
- 在第 6 行,設置郵件的正文 content
def sendMail(mail):
server = smtplib.SMTP_SSL("smtp.qq.com")
server.login(fromAddr, password)
server.sendmail(fromAddr, toAddr, mail.as_string())
server.quit()
- 在第 1 行,函數 sendMail 調用 SMTP 服務發送郵件 mail
- 在第 2 行,獲取 SMTP 服務器,使用 QQ 發送服務
- 在第 3 行,登錄 SMTP 服務
- 在第 4 行,通過 SMTP 服務器發送服務
mail = makeMail()
attachment = makeAttachment('hello.c')
mail.attach(attachment)
sendMail(mail)
print('發送郵件成功')
- 在第 2 行,構造一個附件 hello.c
- 在第 3 行,將附件加入到郵件中
運行程序,在 QQ 郵箱中收到郵件: