亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

使用 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 郵箱中收到郵件:

圖片描述