利用Python+163郵箱授權碼發送帶附件的郵件


背景

前段時間寫了個自動爬蟲的腳本,定時在阿里雲服務器上執行,會從某個網站上爬取鏈接保存到txt文本中,但是腳本不夠完善,我需要爬蟲完畢之后通過郵件把附件給我發送過來,之前寫過一個《利用Python+163郵箱授權碼發送郵件》的博客,但是那篇文章是沒有帶附件的,因此,我想到了爬蟲完畢之后,再執行一段發送郵件的代碼,把爬蟲保存的TXT文件通過郵件發送到我的郵箱中,需求開始明確了,就開始分析和寫代碼實現吧。

分析

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

看到阿里雲服務上的定時任務如下:

爬蟲執行完畢獲取到TXT文件命名如下,前面xfurlwett-是固定的,后面是日期,".txt"是固定的后綴

在python中用以下兩行代碼格式化時間,格式化之后把它轉為字符串賦給一個變量caodate

ISOTIMEFORMAT='%Y%m%d'
caodate=str(time.strftime(ISOTIMEFORMAT, time.localtime()))

文件名如下,可在字符串xfurlwett前面加上絕對路徑的文件名

filename='xfurlwett-'+caodate+'.txt'

發送帶附件的郵件,首先要創建MIMEMultipart()實例,然后構造附件,如果有多個附件,可依次構造,最后利用smtplib.smtp發送。

message = MIMEMultipart() 
message['subject'] = caodate+'下載附件通知' 
# 設置郵件標題
message['from'] = sender  
# 設置發送人
message['to'] = receiver0  
# 設置接收人 
message.attach(msg)
filename='xfurlwett-'+caodate+'.txt'
# 構造附件1,傳送當前目錄下的 filename 文件
att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
att1["Content-Disposition"] = 'attachment; filename="'+filename+'"'
message.attach(att1)

代碼實現

import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
ISOTIMEFORMAT='%Y%m%d'
def sentemail():
    caodate=str(time.strftime(ISOTIMEFORMAT, time.localtime()))
    host = 'smtp.163.com'  
    # 設置發件服務器地址
    port = 465  
    # 設置發件服務器端口號。注意,這里有SSL和非SSL兩種形式
    sender = 'a419914150@163.com'  
    # 設置發件郵箱,一定要自己注冊的郵箱
    pwd = 'ifujfnjdfnhkgnjfd'  
    # 設置發件郵箱的密碼,163郵箱的授權碼,等會登陸會用到
    receiver0 = '419914150@qq.com' 
    # 設置郵件接收人,可以是扣扣郵箱
    receiver1 = '1879230382@qq.com'
    body = '<h1>'+caodate+'</h1><p>zhongfs</p>' 
    # 設置郵件正文,這里是支持HTML的
    msg = MIMEText(body, 'html') 
    # 設置正文為符合郵件格式的HTML內容
    message = MIMEMultipart() 
    message['subject'] = caodate+'下載附件通知' 
    # 設置郵件標題
    message['from'] = sender  
    # 設置發送人
    message['to'] = receiver0  
    # 設置接收人 
    message.attach(msg)
    filename='xfurlwett-'+caodate+'.txt'
    # 構造附件1,傳送當前目錄下的 filename 文件
    att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    att1["Content-Type"] = 'application/octet-stream'
    # 這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
    att1["Content-Disposition"] = 'attachment; filename="'+filename+'"'
    message.attach(att1)
    try:
	    s = smtplib.SMTP_SSL(host, port)  # 注意!如果是使用SSL端口,這里就要改為SMTP_SSL
	    s.login(sender, pwd)  # 登陸郵箱
	    s.sendmail(sender, receiver0, message.as_string())# 發送郵件!
	    #s.sendmail(sender, receiver1, msg.as_string())
	    print ('Done.sent email success')
    except smtplib.SMTPException:
	    print ('Error.sent email fail')
if __name__ == '__main__':
    sentemail()

執行情況

程序運行截圖:

收到郵件截圖:

總結

本文簡單介紹了如何利用python通過163郵箱發送帶附件的郵件,並附上了代碼。由於比較簡單,不再過多闡述。已上傳github代碼,鏈接如下:

https://github.com/rootzhongfengshan/python_practical/blob/master/SentMail/SentMailWithAttachment.py


免責聲明!

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



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