目錄
1. 認識smtp服務器發送郵件的流程
平時生活中我們想要發送郵件,直接藉助qq郵箱
、163郵箱
等即可,如果我們想要使用代碼來完成這個事情,那就需要Python標準庫中的兩個模塊:email
和smtp
。它們可以做的事情如下圖所示:
2. 認識郵件構造的各個元素
想要組裝一個email
,分爲兩步:
- 創建一個
email
對象 - 給
email
添加屬性
第一步:創建email
對象 使用如下語法格式:
from email.mime.text import MIMEText
msg = MIMEText(content, 'plain', 'utf-8')
參數說明:
content
: 郵件的內容 即爲文本內容 定義爲字符串即可plain
: 郵件的文本格式 默認設置爲plain即可utf-8
: 郵件的編碼格式 默認設置爲utf-8即可
第二步:給email
對象添加屬性 需要添加三個屬性,如下:
from
:從哪裏來,即發送者to
:到哪裏去,即接收者subject
:主題,即郵件的標題
代碼演示:
# msg["from"] = user # 指定發送者的郵箱
msg["from"] = "[email protected]"
# msg["to"] = to_addr # 指定接收者的郵箱
msg["to"] = "[email protected]" # 如果兩個郵箱相同,則表示自己發送給自己
# msg["subject"] = subject # 郵箱的主題
msg["subject"] = "Python面試結果通知"
# 這裏的話我只是隨意拿一個郵箱來進行演示
#########或者使用下面的這種方式##########
from email.header import Header
msg["from"] = Header("amo", "utf-8")
msg["To"] = Header("測試", "utf-8")
subject = "Python SMTP 郵件測試"
msg["Subject"] = Header(subject, "utf-8")
email
示意圖 這裏的話我是拿qq郵箱來舉例子的,爲了安全起見,我將自己的郵箱號打了馬薩克,自己可在自己qq郵箱觀察:
3. 掌握使用smtplib發送郵件的步驟
使用smtp發送郵件,有如下流程:(和socket通信類似):
- 創建一個smtp對象
- 連接smtp服務器
- 登陸smtp服務器
- 發送郵件
- 退出登陸
- 關閉連接
import smtplib
# 1.創建一個smtp對象
server = smtplib.SMTP()
# 2.連接smtp服務器
# mainhost: 設置的目標服務器
# mainport: 端口號
server.connect(mainhost, mainport)
# 3.登陸smtp服務器
# user: 用戶名
# password: 授權碼
server.login(user, password)
# 4.發送郵件
# msg: 就是使用email模塊包裝出來的對象 然後將這個對象轉換爲字符串
# from_addr: 郵件發送者地址
# to_addrs: 字符串列表,郵件發送地址
# msg: 發送消息
server.sendmail(from_addr, to_addrs, msg)
# 5.退出登陸
server.quit()
# 6.關閉連接
server.close()
這裏的話以我的qq
郵箱爲例,怎麼去查找目標服務器
,端口號
,用戶名
,授權碼
獲取服務器和端口號:
獲取用戶名和密碼:
發送一封基本的qq
郵件,完整示例代碼演示:
from email.mime.text import MIMEText # 導包
from email.header import Header
import smtplib
# TODO 2.配置發送郵件需要的基本信息
# 設置第三方smtp相關服務信息
main_host = "smtp.qq.com" # 設置服務器 如果是163 寫smtp.163.com即可
main_user = "[email protected]" # 用戶名 或者是[email protected]
main_pass = "填寫自己獲取的授權碼" # 授權碼
# 設置接收與發送郵件者
sender = "[email protected]"
receiver = "[email protected]" # 第一次可以先測試自己發送給自己
# TODO 1.將發送的內容包裝成爲郵件需要的格式
content = "Hello World" # 發送內容
msg = MIMEText(content, 'plain', 'utf-8')
# 這裏可以將[email protected]指定爲中文
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模塊發送郵件
# 發送郵件server.sendmail(sender, receiver, msg.as_string()) # 4.發送郵件
try:
server = smtplib.SMTP() # 1.創建一個smtp對象
server.connect(main_host, 25) # 2.連接smtp服務器 # 這裏的端口號寫587也是可以的
server.login(main_user, main_pass) # 3.登陸smtp服務器
server.sendmail(sender, receiver, msg.as_string()) # 4.發送郵件
server.quit() # 5.退出登陸
# 6.關閉連接 實際情況中最好是不要關閉自己的鏈接 否則會在後續運行程序中出現莫名的錯誤
# server.close()
except smtplib.SMTPException:
print("無法發送郵件")
運行結果如圖所示:
163
郵箱,怎麼去查找授權碼
:
4. 使用Python發送HTML格式的郵件
Python發送HTML格式的郵件與發送純文本消息的郵件不同之處就是將MIMEText中_subtype設置爲html。具體代碼如下:
from email.mime.text import MIMEText # 導包
from email.header import Header
import smtplib
# TODO 2.配置發送郵件需要的基本信息
# 設置第三方smtp相關服務信息
main_host = "smtp.qq.com" # 設置服務器 如果是163 寫smtp.163.com即可
main_user = "[email protected]" # 用戶名 或者是[email protected]
main_pass = "填寫自己獲取的授權碼" # 授權碼
# 設置接收與發送郵件者
sender = "[email protected]"
receiver = "[email protected]" # 第一次可以先測試自己發送給自己
# TODO 1.將發送的內容包裝成爲郵件需要的格式
content = """
<p>Python 郵件發送測試...</p>
<p><a href="https://blog.csdn.net/xw1680?orderby=ViewCount">點擊進入Amo Xiang的博客</a></p>
""" # 發送內容
msg = MIMEText(content, 'html', 'utf-8')
# 這裏可以將[email protected]指定爲中文
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模塊發送郵件
# 發送郵件server.sendmail(sender, receiver, msg.as_string()) # 4.發送郵件
try:
server = smtplib.SMTP() # 1.創建一個smtp對象
server.connect(main_host, 25) # 2.連接smtp服務器 # 這裏的端口號寫587也是可以的
server.login(main_user, main_pass) # 3.登陸smtp服務器
server.sendmail(sender, receiver, msg.as_string()) # 4.發送郵件
server.quit() # 5.退出登陸
# 6.關閉連接 實際情況中最好是不要關閉自己的鏈接 否則會在後續運行程序中出現莫名的錯誤
# server.close()
except smtplib.SMTPException:
print("無法發送郵件")
代碼執行結果如圖所示:
5. Python發送帶附件的郵件
發送帶附件的郵件,首先要創建MIMEMultipart()實例,然後構造附件,如果有多個附件,可依次構造,最後利用smtplib.smtp發送。代碼如下:
# TODO 1.倒入需要相關的模塊/類
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib
# TODO 2.包裝email
# 創建一個帶附件的實例
msg = MIMEMultipart()
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
# 郵件正文內容
msg.attach(MIMEText("這是Amo Xiang Python郵件發送測試....", "plain", "utf-8"))
# 構造附件1 傳送當前目錄下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這裏的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)
# 構造附件2 傳送當前目錄下的gobang.py文件
att2 = MIMEText(open("gobang.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="gobang.py"'
msg.attach(att2)
# TODO 3.發送郵件
# 準備發送郵件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填寫自己獲取的授權碼"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("無法發送郵件...")
運行結果如圖所示:
6. 在HTML文本中添加圖片
郵件的 HTML 文本中一般郵件服務商添加外鏈是無效的,正確添加圖片的實例如下所示:
# TODO 1.倒入需要相關的模塊/類
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib
# TODO 2.包裝email
# 創建一個帶附件的實例
msg = MIMEMultipart("related")
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
msg2 = MIMEMultipart("alternative")
msg.attach(msg2)
mail_msg = """
<p>Python 郵件發送測試...</p>
<p><a href="https://blog.csdn.net/xw1680?orderby=ViewCount">Amo Xiang博客鏈接</a></p>
<p>圖片演示: </p>
<p><img src="cid:image1"></p>
"""
msg2.attach(MIMEText(mail_msg, "html", "utf-8"))
# 指定圖片爲當前目錄
msgImage = MIMEImage(open('timg.jpeg', "rb").read())
# 定義圖片id 在html文本中引用
msgImage.add_header("Content-ID", "<image1>")
msg.attach(msgImage)
# TODO 3.發送郵件
# 準備發送郵件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填寫自己獲取到的授權碼"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("無法發送郵件...")
執行結果如圖所示:
7. 批量發送郵件
7.1 給同一個人發送多封郵件
# TODO 1.倒入需要相關的模塊/類
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import smtplib
# TODO 2.包裝email
# 創建一個帶附件的實例
msg = MIMEMultipart()
msg["from"] = "[email protected]"
msg["to"] = "[email protected]"
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
# 郵件正文內容
msg.attach(MIMEText("這是Amo Xiang Python郵件發送測試....", "plain", "utf-8"))
# 構造附件1 傳送當前目錄下的user_info.txt文件
att1 = MIMEText(open("user_info.txt", "rb").read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這裏的filename可以任意寫,寫什麼名字,郵件中顯示什麼名字
att1["Content-Disposition"] = 'attachment; filename="user_info.txt"'
msg.attach(att1)
# 構造附件2 傳送當前目錄下的gobang.py文件
att2 = MIMEText(open("gobang.py", "rb").read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="gobang.py"'
msg.attach(att2)
# TODO 3.發送郵件
# 準備發送郵件需要的基本信息
main_host = "smtp.qq.com"
main_user = "[email protected]"
main_pass = "填寫授權碼"
sender = "[email protected]"
receiver = "[email protected]"
try:
server = smtplib.SMTP()
server.connect(main_host, 25)
server.login(main_user, main_pass)
# 給同一個人發很多封 直接在這裏加一個for循環即可 5:表示發送5封
for i in range(5):
server.sendmail(sender, receiver, msg.as_string())
server.quit()
except smtplib.SMTPException:
print("無法發送郵件...")
程序執行結果如下:
7.2 根據不同的人發送不同內容的郵件
from email.mime.text import MIMEText # 導包
from email.header import Header
import smtplib
# TODO 2.配置發送郵件需要的基本信息
# 設置第三方smtp相關服務信息
main_host = "smtp.qq.com" # 設置服務器 如果是163 寫smtp.163.com即可
main_user = "[email protected]" # 用戶名 或者是[email protected]
main_pass = "授權碼" # 授權碼
# 設置接收與發送郵件者
sender = "[email protected]"
receiver = ["[email protected]", "[email protected]", "[email protected]",
"[email protected]"]
# 不同郵箱對應的人的姓名
receiver_name = ["name1", "name2", "name3", "name4"]
# TODO 1.將發送的內容包裝成爲郵件需要的格式
content = """
Dear {}:
恭喜你,通過布塔學院的面試,請與2020-03-30日前來我司報道。
""" # 發送內容
for i in range(len(receiver)):
msg = MIMEText(content.format(receiver_name[receiver.index(receiver[i])]), 'plain', 'utf-8')
msg["from"] = Header("[email protected]", "utf-8")
msg["To"] = Header("[email protected]", "utf-8")
subject = "Python SMTP 郵件測試"
msg["subject"] = Header(subject, "utf-8")
# TODO 3.使用smtplib模塊發送郵件
# 發送郵件server.sendmail(sender, receiver, msg.as_string()) # 4.發送郵件
try:
server = smtplib.SMTP() # 1.創建一個smtp對象
server.connect(main_host, 25) # 2.連接smtp服務器 # 這裏的端口號寫587也是可以的
server.login(main_user, main_pass) # 3.登陸smtp服務器
server.sendmail(sender, receiver[i], msg.as_string()) # 4.發送郵件
server.quit() # 5.退出登陸
except smtplib.SMTPException:
print("無法發送郵件")
程序運行結果如圖所示:
綜上,便是使用Python發送各種形式的郵件,筆者希望大家看完之後,自己使用函數進行封裝,以便於將來方便使用。