詳解Python如何實現發送帶附件的電子郵件

Python SMTP發送郵件

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。python的smtplib提供瞭一種很方便的途徑發送電子郵件。它對smtp協議進行瞭簡單的封裝。

Python創建 SMTP 對象語法如下:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

參數說明:

host: SMTP 服務器主機。 你可以指定主機的ip地址或者域名如:runoob.com,這個是可選參數。

port: 如果你提供瞭host 參數, 你需要指定 SMTP 服務使用的端口號,一般情況下SMTP端口號為25。

local_hostname:如果SMTP在你的本機上,你隻需要指定服務器地址為 localhost 即可。

Python SMTP對象使用sendmail方法發送郵件,語法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]

參數說明:

  • from_addr: 郵件發送者地址。
  • to_addrs: 字符串列表,郵件發送地址。
  • msg: 發送消息

這裡要註意一下第三個參數,msg是字符串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,發送郵件的時候,要註意msg的格式。這個格式就是smtp協議中定義的格式。

導入模塊如果沒有錯誤,表示已經安裝成功。

Python發送帶附件的電子郵件基本思路如下:

1.構造MIMEMultipart對象做為根容器

2.構造MIMEText對象做為郵件顯示內容並附加到根容器

3.構造MIMEBase對象做為文件附件內容並附加到根容器

a. 讀入文件內容並格式化

b. 設置附件頭

4.設置根容器屬性

5.得到格式化後的完整文本

6.用smtp發送郵件

import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os

# 配置郵箱服務器信息
mail_host = "smtp.qq.com"   # 設置服務器
mail_user = "823634900"     # 用戶名
mail_pass = "gfgwmfbzmutebajc"  # 口令是授權碼,不是郵箱密碼

# 配置發件人、收件人信息
sender = '[email protected]' # 發件人郵箱
receivers = ['[email protected]']  # 接收郵件,可設置為多個郵箱


def message_config():
    """
    配置郵件信息
    :return: 消息對象
    """
    # 第三方 SMTP 服務
    content = MIMEText('測試數據,註意查收')
    message = MIMEMultipart() # 多個MIME對象
    message.attach(content)  # 添加內容
    message['From'] = Header("白雲", 'utf-8') # 發件人
    message['To']   = Header("黑土", 'utf-8')  # 收件人
    message['Subject'] = Header('測試數據', 'utf-8') # 主題
    # 添加Excel類型附件
    file_name = 'output.xlsx' # 文件名
    file_path = os.path.join(file_name)        # 文件路徑
    xlsx = MIMEApplication(open(file_path, 'rb').read())  # 打開Excel,讀取Excel文件
    xlsx["Content-Type"] = 'application/octet-stream'     # 設置內容類型
    xlsx.add_header('Content-Disposition', 'attachment', filename=file_name) # 添加到header信息
    message.attach(xlsx)
	# jpg類型的附件
    #jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
    #jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
    #message.attach(jpgpart)

    # mp3類型的附件
    #mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
    #mp3part.add_header('Content-Disposition', 'attachment', filename='kenny.mp3')
    #message.attach(mp3part)
 
    # pdf類型附件
    #part = MIMEApplication(open('foo.pdf', 'rb').read())
    #part.add_header('Content-Disposition', 'attachment', filename="foo.pdf")
    #message.attach(part)
    
    return message
    

def send_mail(message):
    """
    發送郵件
    :param message: 消息對象
    :return: None
    """
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host) # 使用SSL連接郵箱服務器
        smtpObj.login(mail_user, mail_pass)   # 登錄服務器
        smtpObj.sendmail(sender, receivers, message.as_string()) # 發送郵件
        print("郵件發送成功")
    except Exception as e:
        print(e)

if __name__ == "__main__":
    print("開始執行")
    message = message_config() # 調用配置方法
    send_mail(message)         # 發送郵件
    print("執行結束")

相信看到535報錯的同學代碼編寫方面都沒有問題,隻是不明白為什麼填寫瞭帳號密碼後還是報535錯誤,這裡我以163和QQ郵箱為例,並使用Python講解怎麼解決535問題

關於發郵件報錯535 Error:authentication failed解決方法:

報錯:535, b’Login Fail. Please enter your authorization code to login.

解決辦法:

調用郵箱服務器來發送郵件,我們需要開啟POP3/SMTP服務,這時需要我們設置客戶端授權碼,這個授權碼替代上面代碼部分的mail_pass 即可成功發送郵件

到此這篇關於詳解Python如何實現發送帶附件的電子郵件的文章就介紹到這瞭,更多相關Python發送帶附件郵件內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: