使用 Python 發(fā)送一封郵件
1. 簡介
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議, 它是一組用于傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
Python 的 smtplib 模塊對 smtp 協(xié)議進(jìn)行了簡單的封裝,提供了一種方便的途徑發(fā)送電子郵件。
2. 配置發(fā)送服務(wù)器
2.1 簡介
在本節(jié)的例子中,使用 QQ 郵箱的 SMTP 服務(wù)發(fā)送郵件,需要對 QQ 郵件發(fā)送進(jìn)行配置。
本節(jié)的例子中,假設(shè)用戶的信息如下:
- 用戶郵件地址,假設(shè)為 zhangsan@qq.com
- 使用 SMTP 服務(wù)的密碼,需要對 QQ 郵件進(jìn)行配置后獲取,注意:不是登錄 QQ 郵箱的密碼
2.2 進(jìn)入設(shè)置界面
需要在 PC 端通過瀏覽器登錄 QQ 郵箱:
- 點(diǎn)擊設(shè)置,進(jìn)入郵箱設(shè)置
- 在郵箱設(shè)置中,點(diǎn)擊賬戶
2.2 設(shè)置 POP3/SMTP 發(fā)送服務(wù)器
在賬戶設(shè)置的 TAB 頁面中,選擇 “開啟服務(wù):POP3/SMTP 服務(wù)”。
2.3 通過短信開啟 POP3/SMTP 服務(wù)
選擇 "開啟服務(wù):POP3/SMTP 服務(wù)"后,系統(tǒng)提示通過發(fā)送短信開啟 POP3/SMTP 服務(wù)
2.4 獲取 SMTP 服務(wù)密碼
按照系統(tǒng)提示操作后,系統(tǒng)會(huì)給出使用 SMTP 服務(wù)的密碼,請記住該服務(wù)密碼,在后續(xù)的小節(jié)中會(huì)使用該密碼。
3. 發(fā)送文本格式的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
- 導(dǎo)入 smtplib 用于發(fā)送郵件
- 導(dǎo)入類 Header 和 MIMEText 用于構(gòu)造郵件
fromAddr ='zhangsan@qq.com'
password = 'password for smtp'
toAddr ='zhangsan@qq.com'
subject = 'hello world'
content = '你好,世界'
- fromAddr 為發(fā)送郵件地址
- toAddr 為目的郵件地址,設(shè)置成與發(fā)送郵件地址相同,表示向自己發(fā)送一封郵件
- password 是使用 SMTP 服務(wù)的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節(jié)
- subject 是郵件標(biāo)題
- content 是郵件內(nèi)容
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 行,函數(shù) makeMail() 根據(jù) fromAddr、toAddr、subject、content 構(gòu)造一封郵件
- 在第 2 行,使用 MIMEText 構(gòu)造一個(gè)文本格式的郵件
- MIMEText 的第二個(gè)參數(shù) plain,表示郵件的內(nèi)容是文本格式
- 在第 3 行,構(gòu)造郵件頭 From
- 在第 4 行,構(gòu)造郵件頭 To
- 在第 5 行,構(gòu)造郵件頭 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 行,函數(shù) sendMail 調(diào)用 SMTP 服務(wù)發(fā)送郵件 mail
- 在第 2 行,獲取 SMTP 服務(wù)器,使用 QQ 發(fā)送服務(wù)
- 在第 3 行,登錄 SMTP 服務(wù)
- 在第 4 行,通過 SMTP 服務(wù)器發(fā)送服務(wù)
mail = makeMail()
sendMail(mail)
print('發(fā)送郵件成功')
運(yùn)行程序,在 QQ 郵箱中收到郵件:
4. 發(fā)送 html 格式的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
- 導(dǎo)入 smtplib 用于發(fā)送郵件
- 導(dǎo)入類 Header 和 MIMEText 用于構(gòu)造郵件
fromAddr ='zhangsan@qq.com'
password = 'password for smtp'
toAddr ='zhangsan@qq.com'
subject = 'hello with html content'
content = '<b>Please click</b> <a href="http://idcbgp.cn">imooc</a>'
- fromAddr 為發(fā)送郵件地址
- toAddr 為目的郵件地址,設(shè)置成與發(fā)送郵件地址相同,表示向自己發(fā)送一封郵件
- password 是使用 SMTP 服務(wù)的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節(jié)
- subject 是郵件標(biāo)題
- content 是郵件內(nèi)容,例子中使用 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 行,函數(shù) makeMail() 根據(jù) fromAddr、toAddr、subject、content 構(gòu)造一封郵件
- 在第 2 行,使用 MIMEText 構(gòu)造一個(gè)文本格式的郵件
- MIMEText 的第二個(gè)參數(shù) html,表示郵件的內(nèi)容是 HTML 格式
- 在第 3 行,構(gòu)造郵件頭 From
- 在第 4 行,構(gòu)造郵件頭 To
- 在第 5 行,構(gòu)造郵件頭 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 行,函數(shù) sendMail 調(diào)用 SMTP 服務(wù)發(fā)送郵件 mail
- 在第 2 行,獲取 SMTP 服務(wù)器,使用 QQ 發(fā)送服務(wù)
- 在第 3 行,登錄 SMTP 服務(wù)
- 在第 4 行,通過 SMTP 服務(wù)器發(fā)送服務(wù)
mail = makeMail()
sendMail(mail)
print('發(fā)送郵件成功')
運(yùn)行程序,在 QQ 郵箱中收到郵件:
5. 發(fā)送帶有附件的郵件
5.1 附件 hello.c
在當(dāng)前目錄下,創(chuàng)造文件 hello.c,內(nèi)容如下:
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
5.2 發(fā)送帶有附件的郵件
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
- 導(dǎo)入 smtplib 用于發(fā)送郵件
- 導(dǎo)入類 Header 和 MIMEText 用于構(gòu)造郵件
- 導(dǎo)入類 MIMEMultipart 用于構(gòu)造帶有附件的郵件
fromAddr ='zhangsan@qq.com'
password = 'password for smtp'
toAddr ='zhangsan@qq.com'
subject = 'hello with attachment'
content = '你好,請查收附件'
- fromAddr 為發(fā)送郵件地址
- toAddr 為目的郵件地址,設(shè)置成與發(fā)送郵件地址相同,表示向自己發(fā)送一封郵件
- password 是使用 SMTP 服務(wù)的密碼,不是 QQ 郵箱的登錄密碼,請查看第 2 小節(jié)
- subject 是郵件標(biāo)題
- content 是郵件內(nèi)容
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 行,函數(shù) makeAttachment 構(gòu)造一個(gè)附件
- 在第 2 行到第 3 行,讀取當(dāng)前目錄下的文件 filename 的內(nèi)容
- 在第 3 行,構(gòu)造附件對象 attachment
- 在第 4 行到第 5 行,設(shè)置附件屬性
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 行,函數(shù) makeMail() 根據(jù) fromAddr、toAddr、subject、content 構(gòu)造一封郵件
- 在第 2 行,使用 MIMEMultipart 構(gòu)造一個(gè)帶有附件的郵件
- 在第 3 行,構(gòu)造郵件頭 From
- 在第 4 行,構(gòu)造郵件頭 To
- 在第 5 行,構(gòu)造郵件頭 Subject
- 在第 6 行,設(shè)置郵件的正文 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 行,函數(shù) sendMail 調(diào)用 SMTP 服務(wù)發(fā)送郵件 mail
- 在第 2 行,獲取 SMTP 服務(wù)器,使用 QQ 發(fā)送服務(wù)
- 在第 3 行,登錄 SMTP 服務(wù)
- 在第 4 行,通過 SMTP 服務(wù)器發(fā)送服務(wù)
mail = makeMail()
attachment = makeAttachment('hello.c')
mail.attach(attachment)
sendMail(mail)
print('發(fā)送郵件成功')
- 在第 2 行,構(gòu)造一個(gè)附件 hello.c
- 在第 3 行,將附件加入到郵件中
運(yùn)行程序,在 QQ 郵箱中收到郵件: