Python實(shí)現(xiàn)自動(dòng)發(fā)送郵件 -- 自動(dòng)抓取博客/網(wǎng)站中留言的郵箱并發(fā)送相應(yīng)郵件
- 背景
- 腳本要解決的問題:
- 實(shí)現(xiàn)方法
- 代碼及解析
- 1. AutoSendEmailByBlogComments.py
- 2. FileOperation.py
- 3. SendEmail.py
- 備注:郵箱SMTP設(shè)置
- 其它好玩的Python腳本
背景
在各大論壇、博客上,很多User通過留言郵箱獲取相關(guān)資料,但是留言人數(shù)過多了,對(duì)于博主來說一個(gè)一個(gè)發(fā)送相關(guān)郵件太繁瑣了,同時(shí)也經(jīng)常不能及時(shí)發(fā)現(xiàn)新評(píng)論,效率太低。。。我是個(gè)懶人, 這當(dāng)然也不能忍,所以想到通過Python腳本將上述流程自動(dòng)化。
例如我有一篇博客:嵌入式學(xué)習(xí)中較好的練手項(xiàng)目和課題整理(附代碼資料、學(xué)習(xí)視頻和嵌入式學(xué)習(xí)規(guī)劃),里面會(huì)分享很多資料,小伙伴們通過留言郵箱來獲取資料,通過這個(gè)Python腳本自動(dòng)化將資料發(fā)送到各小伙伴們的郵箱中,非常方便,我再也不必要每天刷博客新留言,再手動(dòng)點(diǎn)開郵箱發(fā)送郵件啦。
腳本要解決的問題:
腳本需要自動(dòng)找到評(píng)論區(qū)中留言的
新郵箱
留言內(nèi)容,然后將相關(guān)資料整合成一封郵件,通過SMTP發(fā)送到對(duì)方郵箱。注意是新郵箱,之前發(fā)送過的腳本當(dāng)然不能再給人家發(fā)一次啦。
通過Python腳本各類成型的庫函數(shù),就可以簡(jiǎn)單完美的解決這類問題:
實(shí)現(xiàn)方法
實(shí)現(xiàn)方法大致就是:通過Python抓取我的Blog網(wǎng)頁中的評(píng)論數(shù)據(jù),通過 正則表達(dá)式 篩選出網(wǎng)頁中的郵箱數(shù)據(jù),并將發(fā)現(xiàn)的 新郵箱 寫入到文件中,然后將資料信息組成一封標(biāo)準(zhǔn)郵件,通過 SMTP 發(fā)送。
代碼目錄結(jié)構(gòu)如下:
其中record.txt就是記錄所有新郵件的文件,
最后將腳本打包成一個(gè)exe, 并通過Windows系統(tǒng)中的
TaskScheduler
,每天定時(shí)的調(diào)用該程序一次,那么,每天新留言的小伙伴,就能自動(dòng)收到資料啦。
代碼及解析
1. AutoSendEmailByBlogComments.py
負(fù)責(zé)抓取數(shù)據(jù),篩選出新郵件數(shù)據(jù),然后調(diào)度發(fā)送郵件。。。代碼如下:
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
)
#我的博客網(wǎng)址
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() 寫入郵箱數(shù)據(jù)到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
這個(gè)文件主要是通過MIME來Build郵件數(shù)據(jù),然后通過smtplib 發(fā)送
# coding:utf-8
# smtplib模塊負(fù)責(zé)連接服務(wù)器和發(fā)送郵件
# MIMEText:定義郵件的文字?jǐn)?shù)據(jù)
# MIMEImage:定義郵件的圖片數(shù)據(jù)
# MIMEMultipart:負(fù)責(zé)將文字圖片音頻組裝在一起添加附件
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'
# 我的郵箱,即發(fā)件人郵箱賬號(hào)
passwd
=
''
#這里填的授權(quán)碼,注意不是郵箱密碼,這么Secret的數(shù)據(jù)當(dāng)然隱去啦
mailserver
=
'smtp.163.com'
port
=
'25'
sub
=
'CSDN資料密碼 By HowieXue'
#用于郵箱的subject
def
SendEmailtoAddr
(
receive
)
:
try
:
msg
=
MIMEMultipart
(
'related'
)
msg
[
'From'
]
=
formataddr
(
[
"Howie"
,
sender
]
)
# 發(fā)件人郵箱昵稱、發(fā)件人郵箱賬號(hào)
msg
[
'To'
]
=
formataddr
(
[
"BlogUser:"
+
receive
,
receive
]
)
# 收件人郵箱昵稱、收件人郵箱賬號(hào)
msg
[
'Subject'
]
=
sub
#正文,html格式
body
=
"""
資料密碼請(qǐng)查收,謝謝關(guān)注我的CSDN博客~
博文地址:https://blog.csdn.net/HowieXue/article/details/76696316
Best Regards,
HowieXue(薛永浩)
send by script of
Python3
...
"""
#鏈接圖片,資料實(shí)際內(nèi)容通過圖片顯示,這樣做為了避免163 Server誤判為垃圾郵件,圖片上是相關(guān)資料的網(wǎng)盤地址和密碼
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
)
# 發(fā)件人郵箱中的SMTP服務(wù)器,端口是25
server
.
login
(
sender
,
passwd
)
# 發(fā)件人郵箱賬號(hào)、郵箱密碼
server
.
sendmail
(
sender
,
receive
,
msg
.
as_string
(
)
)
# 發(fā)件人郵箱賬號(hào)、收件人郵箱賬號(hào)、發(fā)送郵件
server
.
quit
(
)
return
True
except
Exception
as
e
:
print
(
e
)
return
False
備注:郵箱SMTP設(shè)置
要開啟郵箱的SMTP服務(wù),才能通過第三方Client發(fā)送郵件,一般郵箱默認(rèn)是關(guān)閉該服務(wù)的,需要打開,并設(shè)置授權(quán)碼。
針對(duì)·163郵箱,通過設(shè)置中修改:
同時(shí)開啟并設(shè)置客戶端授權(quán)碼(在腳本中連接郵箱用):
其它好玩的Python腳本
Python實(shí)現(xiàn)自動(dòng)發(fā)送郵件 --自動(dòng)抓取博客/網(wǎng)站中留言的郵箱并發(fā)送相應(yīng)郵件
Python自動(dòng)生成代碼 - 通過tkinter圖形化操作并生成代碼框架
Python解析CSV數(shù)據(jù) - 通過Pandas解析邏輯分析儀導(dǎo)出的CSV數(shù)據(jù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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