Python實現自動發送郵件 -- 自動抓取博客/網站中留言的郵箱并發送相應郵件
- 背景
- 腳本要解決的問題:
- 實現方法
- 代碼及解析
- 1. AutoSendEmailByBlogComments.py
- 2. FileOperation.py
- 3. SendEmail.py
- 備注:郵箱SMTP設置
- 其它好玩的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
(
"\w+@\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
)
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
=
'howiexue@163.com'
# 我的郵箱,即發件人郵箱賬號
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
=
"""
資料密碼請查收,謝謝關注我的CSDN博客~
博文地址:https://blog.csdn.net/HowieXue/article/details/76696316
Best Regards,
HowieXue(薛永浩)
send by script of
Python3
...
"""
#鏈接圖片,資料實際內容通過圖片顯示,這樣做為了避免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'
,
'
'
)
msg
.
attach
(
text
)
msg
.
attach
(
pic
)
rew
=
open
(
r
'C:\**\reward.png'
,
'rb'
)
rewPic
=
MIMEImage
(
rew
.
read
(
)
)
rew
.
close
(
)
rewPic
.
add_header
(
'Content-ID'
,
'
'
)
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
備注:郵箱SMTP設置
要開啟郵箱的SMTP服務,才能通過第三方Client發送郵件,一般郵箱默認是關閉該服務的,需要打開,并設置授權碼。
針對·163郵箱,通過設置中修改:
其它好玩的Python腳本
Python實現自動發送郵件 --自動抓取博客/網站中留言的郵箱并發送相應郵件
Python自動生成代碼 - 通過tkinter圖形化操作并生成代碼框架
Python解析CSV數據 - 通過Pandas解析邏輯分析儀導出的CSV數據
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
