Python實現自動發送郵件 - 自動抓取Blog中留言的郵箱併發送郵件

背景

在各大論壇、博客上,很多User通過留言郵箱獲取相關資料,但是留言人數過多了,對於博主來說一個一個發送相關郵件太繁瑣了,同時也經常不能及時發現新評論,效率太低。。。我是個懶人, 這當然也不能忍,所以想到通過Python腳本將上述流程自動化。

例如我有一篇博客:嵌入式學習中較好的練手項目和課題整理(附代碼資料、學習視頻和嵌入式學習規劃),裏面會分享很多資料,小夥伴們通過留言郵箱來獲取資料,通過這個Python腳本自動化將資料發送到各小夥伴們的郵箱中,非常方便,我再也不必要每天刷博客新留言,再手動點開郵箱發送郵件啦。

腳本要解決的問題:

腳本需要自動找到評論區中留言的新郵箱留言內容,然後將相關資料整合成一封郵件,通過SMTP發送到對方郵箱。注意是新郵箱,之前發送過的腳本當然不能再給人家發一次啦。
通過Python腳本各類成型的庫函數,就可以簡單完美的解決這類問題:

實現方法

實現方法大致就是:通過Python抓取我的Blog網頁中的評論數據,通過正則表達式篩選出網頁中的郵箱數據,並將發現的新郵箱寫入到文件中,然後將資料信息組成一封標準郵件,通過SMTP發送。

代碼目錄結構如下:
其中record.txt就是記錄所有新郵件的文件,
在這裏插入圖片描述
最後將腳本打包成一個exe, 並通過Windows系統中的TaskScheduler ,每天定時的調用該程序一次,那麼,每天新留言的小夥伴,就能自動收到資料啦。

在這裏插入圖片描述

代碼及解析

1. AutoSendEmailByBlogComments.py

負責抓取數據,然後通過正則表達式篩選出郵件數據,通過歷史數據判斷是否是新郵箱,然後調度發送郵件。。。代碼如下:

import time
import urllib.request
import re
from SendEmail import SendEmailtoAddr
from FileOperation import RecordEmail, isNewEmail

HasNewEmail = False


def handleEmailAddr(EmailAddr):
    isNew = isNewEmail(EmailAddr)
    if isNew == True:
        print('Get New Email addr:' + EmailAddr)
        isSuccess = SendEmailtoAddr(EmailAddr)
        if isSuccess == True:
            RecordEmail(EmailAddr)
        	global HasNewEmail
        	HasNewEmail = True
        	print('Send email to '+EmailAddr+': success!')
        else:
        	print('Send email to '+EmailAddr+': Failed, Pls. retry...')	


def SendEmailByBlogComments(url):
    rsp = urllib.request.urlopen(url)
    html = rsp.read().decode("utf-8")
    #以列表的形式返回所有匹配郵箱格式的子串
    emaillist = re.findall("[A-Za-z0-9_]+@\w+\.\w+", html)

    print('Get Email list from CSDN: ')
    print(emailList)

    for emailFromBlog in emailList:
        handleEmailAddr(emailFromBlog)

#我的博客網址
url = "https://blog.csdn.net/howiexue/article/details/76696316#comments"


SendEmailByBlogComments(url)

if HasNewEmail == False:
    print("No New email found, do nothing... this window will close after 10s")
else:
    print("Done! this window will close after 10s")

time.sleep(10)


這裏正則表達式是通過[A-Za-z0-9_]+@\w+.\w+匹配所有郵箱格式的數據。

2. FileOperation.py

主要是做一些文件類的操作,RecordEmail() 寫入郵箱數據到record.txt、isNewEmail() 讀取record.txt判斷是否是新的郵箱。


def RecordEmail(EmailAddr):
    fileName= 'record.txt'
    with open(fileName,'a') as record:
        record.write(EmailAddr+"\n")


def isNewEmail(EmailAddr):
    fileName = 'record.txt'
    with open(fileName) as record:
        lines = record.read().splitlines()
        #print(lines)
        if EmailAddr in lines:
            return False
        else:
            return True

3. SendEmail.py

這個文件主要是通過MIME來Build郵件數據,然後通過smtplib 發送

# coding:utf-8
# smtplib模塊負責連接服務器和發送郵件
# MIMEText:定義郵件的文字數據
# MIMEImage:定義郵件的圖片數據
# MIMEMultipart:負責將文字圖片音頻組裝在一起添加附件
import smtplib  # 加載smtplib模塊
from email.mime.text import MIMEText
from email.utils import formataddr
from email.mime.application import MIMEApplication
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

sender = '[email protected]'  # 我的郵箱,即發件人郵箱賬號
passwd = '' #這裏填的授權碼,注意不是郵箱密碼,這麼Secret的數據當然隱去啦
mailserver = 'smtp.163.com'
port = '25'
sub = 'CSDN資料密碼 By HowieXue' #用於郵箱的subject

def SendEmailtoAddr(receive):
	try:
		msg = MIMEMultipart('related')
		msg['From'] = formataddr(["Howie", sender])  # 發件人郵箱暱稱、發件人郵箱賬號
		msg['To'] = formataddr(["BlogUser:"+receive, receive])  # 收件人郵箱暱稱、收件人郵箱賬號
		msg['Subject'] = sub

		#正文,html格式
		body = """
		<b>資料密碼請查收,謝謝關注我的CSDN博客~    </b> 
		<p>博文地址:https://blog.csdn.net/HowieXue/article/details/76696316</p>
		<br><img src="cid:passowrd"><br>
		<br><img src="cid:reward"><br>
		
		<p>Best Regards,</p>
		<p>HowieXue(薛永浩)</p>
		
		<p>send by script of <a href="http://www.python.org">Python3</a>...</p>
		
		"""
		#鏈接圖片,資料實際內容通過圖片顯示,這樣做爲了避免163 Server誤判爲垃圾郵件,圖片上是相關資料的網盤地址和密碼
		text = MIMEText(body, 'html', 'utf-8')
		f = open(r'C:\**\password.png', 'rb') #所插入的圖片
		pic = MIMEImage(f.read())
		f.close()
		pic.add_header('Content-ID', '<passowrd>')
		
		msg.attach(text)
		msg.attach(pic)
		
		rew = open(r'C:\**\reward.png', 'rb')
		rewPic = MIMEImage(rew.read())   
		rew.close()
		rewPic.add_header('Content-ID', '<reward>')
		
		msg.attach(rewPic)


		server = smtplib.SMTP(mailserver, port)  # 發件人郵箱中的SMTP服務器,端口是25
		server.login(sender, passwd)  # 發件人郵箱賬號、郵箱密碼
		server.sendmail(sender, receive, msg.as_string())  # 發件人郵箱賬號、收件人郵箱賬號、發送郵件
		server.quit()
	
		return True
	except Exception as e:
		print(e)
		return False

Record.txt內容是這樣的:
在這裏插入圖片描述

發送的郵件是這樣的:
在這裏插入圖片描述

備註:郵箱SMTP設置

要開啓郵箱的SMTP服務,才能通過第三方Client發送郵件,一般郵箱默認是關閉該服務的,需要打開,並設置授權碼。
針對·163郵箱,通過設置中修改:
在這裏插入圖片描述

在這裏插入圖片描述
同時開啓並設置客戶端授權碼(在腳本中連接郵箱用):
在這裏插入圖片描述

其它好玩的Python腳本

Python實現自動發送郵件 --自動抓取博客/網站中留言的郵箱併發送相應郵件

Python自動生成代碼 - 通過tkinter圖形化操作並生成代碼框架

Python解析CSV數據 - 通過Pandas解析邏輯分析儀導出的CSV數據

Python通過Django搭建網站執行Lua腳本 (實現數據解析)

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