最全總結!聊聊 Python 發送郵件的幾種方式

image

1. 前言

郵件,做爲最正式規範的溝通方式,在平常辦公過程當中常常被用到bash

咱們都知道 Python內置了對 SMTP 的支持,能夠發送純文本、富文本、HTML 等格式的郵件服務器

本文將聊聊利用 Python 發送郵件的 3 種方式app

2. 準備

以 126 郵箱爲例,在編碼以前,咱們須要開啓 SMTP 服務函數

image

而後,手動新增一個受權碼測試

其中,帳號、受權碼和服務器地址用於鏈接登陸郵箱服務器ui

3. 方式一:smtplib

smtplib是 Python 自帶的依賴庫,能夠直接導入使用首先,經過郵箱帳號、受權碼、郵箱服務器地址初始化一個 SMTP 實例,而後進行鏈接編碼

def __init__(self):
    # 初始化
    self.smtp = smtplib.SMTP()

    # 鏈接郵箱服務器地址
    self.smtp.connect('smtp.126.com')

    # 加入主題和附件,郵件體
    self.email_body = MIMEMultipart('mixed')

    # 發件人地址及受權碼
    self.email_from_username = '**@126.com'
    self.email_from_password = '受權碼'

# 登陸
self.smtp.login(self.email_from_username, self.email_from_password)
複製代碼

而後,將收件人列表、郵件標題、郵件正文內容、附件路徑及附件文件名加入到上面定義的郵件體中spa

def generate_email_body(self, email_to_list, email_title, email_content, attchment_path, files):
    """ 組成郵件體 :param email_to_list:收件人列表 :param email_title:郵件標題 :param email_content:郵件正文內容 :param attchment_path:附件的路徑 :param files:附件文件名列表 :return: """
    self.email_body['Subject'] = email_title
    self.email_body['From'] = self.email_from_username
    self.email_body['To'] = ",".join(email_to_list)

    for file in files:
        file_path = attchment_path + '/' + file
        if os.path.isfile(file_path):
            # 構建一個附件對象
            att = MIMEText(open(file_path, 'rb').read(), 'base64', 'utf-8')
            att["Content-Type"] = 'application/octet-stream'
            att.add_header("Content-Disposition", "attachment", filename=("gbk", "", file))
            self.email_body.attach(att)

    text_plain = MIMEText(email_content, 'plain', 'utf-8')
    self.email_body.attach(text_plain)
複製代碼

接着,就可使用 SMTP 實例對象,將郵件發送出去3d

  # 收件人列表
email_to_list = ['收件人1地址','收件人2地址']

# 發送郵件
# 注意:此處必須同時指定發件人與收件人,不然會看成垃圾郵件處理掉
self.smtp.sendmail(self.email_from_username, email_to_list, self.email_body.as_string())
複製代碼

郵件發送完畢以後,退出服務便可code

def exit(self):
    """ 退出服務 :return: """
    self.smtp.quit()
複製代碼

4. 方式二:zmail

Zmail 項目建立目的是,使郵件處理變得更簡單使用 Zmail 發送接收郵件方便快捷,不須要手動添加服務器地址、端口以及適合的協議,能夠輕鬆建立 MIME 對象和頭文件注意:Zmail 僅支持 Python3,不支持 Python2首先,安裝依賴庫

# 安裝依賴庫
pip3 install zmail
複製代碼

而後,使用郵箱帳號、受權碼建立一個郵箱服務對象

class ZMailObject(object):
​
    def __init__(self):
        # 郵箱帳號
        self.username = '**@126.com'

        # 郵箱受權碼
        self.authorization_code = '受權碼'

        # 構建一個郵箱服務對象
        self.server = zmail.server(self.username, self.authorization_code)
複製代碼

接着,將郵件主題、郵件內容、包含的附件路徑加入到一個字典中,組成郵件主體

# 郵件主體
mail_body = {
        'subject': '測試報告',
        'content_text': '這是一個測試報告',  # 純文本或者HTML內容
        'attachments': ['./attachments/report.png'],
}
複製代碼

最後,將調用send_mail()函數,將郵件發送出去便可

# 收件人
# 能夠指定一我的,字符串;也能夠是多我的,列表
mail_to = "收件人1"

# 發送郵件
self.server.send_mail(mail_to, mail_body)
複製代碼

5. 方式三:yagmail

yagmail 只須要幾行代碼,就能實現發送郵件的功能

相比 zmail,yagmail 實現發送郵件的方式更加簡潔優雅

首先,安裝依賴庫

# 安裝依賴庫
pip3 install yagmail
複製代碼

而後,經過帳號、受權碼和服務器地址鏈接郵箱服務器,返回一個服務對象

​import yagmail

# 鏈接服務器
# 用戶名、受權碼、服務器地址
yag_server = yagmail.SMTP(user='**@126.com', password='受權碼', host='smtp.126.com')
複製代碼

接着,經過 send() 函數,將郵件發送出去

# 發送對象列表
email_to = ['**@qq.com', ]
email_title = '測試報告'
email_content = "這是測試報告的具體內容"
# 附件列表
email_attachments = ['./attachments/report.png', ]

# 發送郵件
yag_server.send(email_to, email_title, email_content, email_attachments)
複製代碼

郵件發送完畢以後,關閉鏈接便可

# 關閉鏈接
yag_server.close()
複製代碼

6. 最後

上面總結了 Python 發送郵件的 3 種方式,實際項目中,更推薦使用後兩種方式

我已經將文中所有源碼上傳到公衆號「 AirPython 」後臺,關注公衆號後回覆「 email 」便可得到所有源碼

若是你以爲文章還不錯,請你們 點贊、分享、留言下,由於這將是我持續輸出更多優質文章的最強動力!

推薦閱讀

這款黑科技,不會代碼也能玩自動化,高效摸魚

自動化篇 | PC 端這款黑科技錄製腳本,完爆按 X 精靈!

如何結合爬蟲與自動化,幫助小姐姐刷抖音徹底解放掉雙手

相關文章
相關標籤/搜索