Python發送郵件

1. 認識smtp服務器發送郵件的流程

平時生活中我們想要發送郵件,直接藉助qq郵箱163郵箱等即可,如果我們想要使用代碼來完成這個事情,那就需要Python標準庫中的兩個模塊:emailsmtp。它們可以做的事情如下圖所示:
在這裏插入圖片描述

2. 認識郵件構造的各個元素

想要組裝一個email,分爲兩步:

  1. 創建一個email對象
  2. email添加屬性

第一步:創建email對象 使用如下語法格式:

from email.mime.text import MIMEText
msg = MIMEText(content, 'plain', 'utf-8')

參數說明:

  1. content: 郵件的內容 即爲文本內容 定義爲字符串即可
  2. plain: 郵件的文本格式 默認設置爲plain即可
  3. utf-8: 郵件的編碼格式 默認設置爲utf-8即可

第二步:給email對象添加屬性 需要添加三個屬性,如下:

  1. from:從哪裏來,即發送者
  2. to:到哪裏去,即接收者
  3. 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通信類似):

  1. 創建一個smtp對象
  2. 連接smtp服務器
  3. 登陸smtp服務器
  4. 發送郵件
  5. 退出登陸
  6. 關閉連接
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發送各種形式的郵件,筆者希望大家看完之後,自己使用函數進行封裝,以便於將來方便使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章