Python實現自動發送郵件 - 自動抓取博客/網站中留言的郵箱併發送郵件
背景
在各大論壇、博客上,很多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圖形化操作並生成代碼框架