Python(1)自動發送郵件


python發郵件需要掌握兩個模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。smtplib模塊主要負責發送郵件,email模塊主要負責構造郵件。

smtplib模塊主要負責發送郵件:是一個發送郵件的動作,連接郵箱服務器,登錄郵箱,發送郵件(有發件人,收信人,郵件內容)。

email模塊主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。

1.smtplib模塊

import smtplib

smtp = smtplib.SMTP() 
smtp.connect('smtp.163.com,25') 
smtp.login(username, password) 
smtp.sendmail(sender, receiver, msg.as_string()) 
smtp.quit()

2.email模塊

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

我們必須把Subject,From,To添加到MIMEText對象或者MIMEMultipart對象中,郵件中才會顯示主題,發件人,收件人。

# 組裝郵件內容和標題,中文需參數‘utf-8’,單字節字符不需要
        msg = MIMEMultipart()
        msg['Subject'] = Header(subject)
        msg['From'] = sender
        msg['To'] = ','.join(user_list)

3.編寫發件函數,方便調用

自動化測試報告為HTML,以附件方式發送,

不管什么類型的附件,都可以用MIMEApplication,MIMEApplication默認子類型是application/octet-stream

# 發送html內容的郵件
import smtplib
import time
import os
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart

class SendMail():
    def find_new_file(self, dir):
        '''查找目錄下最新的文件'''
        file_lists = os.listdir(dir)
        file_lists.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn)
                        if not os.path.isdir(dir + "\\" + fn)
                        else 0)
        # print('最新的文件為: ' + file_lists[-1])
        file = os.path.join(dir, file_lists[-1])
        print('完整文件路徑:', file)
        return file

    def send_mail_html(self, file):
        '''發送html格式測試報告郵件'''
        # 發送郵箱
        sender = 'name@163.com'
        # 接收郵箱
        user_list = [
            'user@foxmail.com',
            'user@qq.com',
            'user@qq.com']
        # 發送郵件主題
        t = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        subject = '接口自動化測試結果(請下載附件查看)_' + t
        # 發送郵箱服務器
        smtpserver = 'smtp.163.com'
        # 發送郵箱用戶/密碼
        username = 'user@163.com'
        password = 'youer_password'
        # 組裝郵件內容和標題,中文需參數‘utf-8’,單字節字符不需要
        msg = MIMEMultipart()
        msg['Subject'] = Header(subject)
        msg['From'] = sender
        msg['To'] = ','.join(user_list)
        # ---這是附件部分---
        # html類型附件,不管什么類型的附件,都可以用MIMEApplication,MIMEApplication默認子類型是application/octet-stream。
        part = MIMEApplication(open(file, 'rb').read())
        part.add_header('Content-Disposition', 'attachment', filename=file)
        msg.attach(part)
        # 登錄並發送郵件
        try:
            smtp = smtplib.SMTP()
            smtp.connect(smtpserver)
            smtp.login(username, password)
            smtp.sendmail(sender, user_list, msg.as_string())
        except BaseException:
            print("郵件發送失敗!")
        else:
            print("郵件發送成功!")
        finally:
            smtp.quit()


if __name__ == '__main__':
    sen = SendMail()
    dir = r'D:\\api\\report'  # 指定文件目錄
    b = sen.find_new_file(dir)  # 查找最新的html文件
    sen.send_mail_html(b)  # 發送html內容郵件

ps:

python郵件發送給多人時,只有第一個人能收到的問題,

MIMEText()["to"]的數據類型與sendmail(from_addrs,to_addrs,...)的to_addrs不同;前者為str類型,多個地址使用逗號分隔,后者為list類型。

expects toaddrs to be a list of email addresses. (Or, of course, just use recipients in place of toaddrs.)

參考鏈接:https://stackoverflow.com/questions/20509427/python-not-sending-email-to-multiple-addresses

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM