傳送郵件smtplib,email,郵件頭header,定時器schedule,爬蟲requests(轉)
阿新 • • 發佈:2021-07-08
傳送郵件
發一份簡單的郵件
發一份完整的帶郵件頭的群郵件
自動定時發郵件
自動定時爬取天氣預報傳送郵件
——————————————————————
發一份簡單的郵件
程式碼結構:
也就是這樣:
以QQ郵箱為例傳送一封簡單的郵件如下:
# 以qq郵箱為例
import smtplib #我們要傳送郵件,就需要用到smtplib模組
from email.mime.text import MIMEText #要傳送文字內容用email.mime.text模組
#email是個包,包裡面有好幾個模組,呼叫包(email)文字模組(mime.text)裡的類(MIMEText)可以發文本訊息
#伺服器,埠
host='smtp.qq.com'
port=465
#我方賬戶,授權碼
username='**********@qq.com'
password='***********'
#對方賬戶
to_addr='*********.com'
#要傳送的內容
moment='測試python'
msg = MIMEText(moment,'plain','utf-8') #給文字新增屬性,讓電腦能夠識別
#moment是文字內容,type:文字型別,預設為plain(純文字),文字編碼,中文為“utf-8”
server = smtplib.SMTP_SSL(host) # 【呼叫伺服器】SMTP(“簡單郵件傳輸協議) 是一個類,呼叫smtplib模組中的類SMTP賦值給server.
# 如果是加密的話,寫成:smtplib.SMTP_SSL(),這裡在()裡面加上變數host,是由於在3.7 版本以上才是這種寫法
server.connect(host, port)
#【設定伺服器名稱和埠】呼叫connect(指定的伺服器),host指定伺服器的域名(伺服器地址),port 是“埠”(預設是25)
server.login(username, password)
#【登入你的伺服器賬戶】呼叫login(登入),username(你的郵箱名),password(授權碼)。
server.sendmail(username, to_addr, msg.as_string())
#【傳送訊息】呼叫sendmail(傳送郵件),sender(發件人,就是你的郵箱名),to_addr(收件人郵箱),,msg指要傳送的內容(as_string()是將傳送的資訊msg變為字串型別。因為電腦不知道你要傳送的資訊msg是什麼,我們也沒有定義。這就需要用到email 模組)
server.quit()
#【退出伺服器】呼叫quit(退出)
#如果你用的是QQ以外的其他郵箱,也可能會出現一種報錯。smtplib.SMTPException: No suitable authentication method found
#解決方案是:在登入(login)之前呼叫starttls()方法就可以了。也就是在程式碼中加入這樣一行:server.starttls()
email 模組:也就是用來寫郵件內容的模組。這個內容可以是純文字、HTML內容、圖片、附件等多種形式。
每種形式對應的匯入方式是這樣的:
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
發一份完整的帶郵件頭的群郵件
郵件頭(header)是這一塊區域,包括主題、發件人、收件人等資訊如下:
from email.header import Header #1從email包引入Header()方法。Header()是用來構建郵件頭的
msg['From'] = Header('xxx') #2.from收件人郵箱地址
msg['To'] = Header('xxx') #3.to發件人郵箱地址
msg['Subject'] = Header('xxx') #4.主題
發一封帶有檔案頭的郵件:
#引用模組
import smtplib #發郵件
from email.mime.text import MIMEText #用於構建內容文字
from email.header import Header #用於構建郵件頭
#伺服器,埠
host='smtp.qq.com'
port=465
#我方賬戶,授權碼
username='********@qq.com'
password='***********'
#對方賬戶
to_addr=['bn****@live.com','di******@gmail.com'] #新增多個賬戶採用列表形式
#要傳送的內容
moment='測試python'
#構建純文字的郵件內容
msg = MIMEText(moment,'plain','utf-8')
#構建郵件頭
msg['From'] = Header('丁丁') #2.from來自哪裡,指發件人的名稱或地址
msg['To'] = Header('小可愛') #3.to發件人郵箱地址
msg['Subject'] = Header('我用python') #4.主題
# 開啟發信服務
server = smtplib.SMTP_SSL(host)
server.connect(host, port)
# 登入發信郵箱
server.login(username, password)
# 傳送郵件
server.sendmail(username, to_addr, msg.as_string())
# 關閉伺服器
server.quit()
自動定時發郵件
【定時】+【發郵件】
先看看定時功能實現的方法:
定時模組schedule,安裝第三方庫 pip install schedule
先看看定時模組使用方法:
1 #定時模組schedule
2 import schedule
3 import time
4 #引入schedule和time
5
6 def job():
7 print("I'm working...")
8 #定義一個叫job的函式,函式的功能是列印'I'm working...'
9 schedule.every(2).seconds.do(job) #每2s執行一次job()函式
10 schedule.every(10).minutes.do(job) #部署每10分鐘執行一次job()函式的任務
11 schedule.every().hour.do(job) #部署每×小時執行一次job()函式的任務
12 schedule.every().day.at("10:30").do(job) #部署在每天的10:30執行job()函式的任務
13 schedule.every().monday.do(job) #部署每個星期一執行job()函式的任務
14 schedule.every().wednesday.at("13:15").do(job)#部署每週三的13:15執行函式的任務
15
16 while True:
17 schedule.run_pending() #檢查上面的任務部署情況,如果任務已經準備就緒,就去啟動執行。
18 time.sleep(1) #讓程式按1秒來檢查,如果檢查太快,會浪費計算機的資源。
19 #16-18都是檢查部署的情況,如果任務準備就緒,就開始執行任務。
開始封裝郵件,用定時器傳送:
#引用模組
import smtplib #發郵件
from email.mime.text import MIMEText #用於構建內容文字
from email.header import Header #用於構建郵件頭
import schedule #定時模組
import time #時間模組
def Email(): #定義函式Email(),一旦呼叫將會執行下面的功能
#伺服器,埠
host='smtp.qq.com'
port=465
#我方賬戶,授權碼
username='6*******@qq.com'
password='********'
#對方賬戶
to_addr=['********@live.com','*********@gmail.com'] #新增多個賬戶採用列表形式
#要傳送的內容
moment='測試定時傳送'
#構建純文字的郵件內容
msg = MIMEText(moment,'plain','utf-8')
#構建郵件頭
msg['From'] = Header('丁丁') #2.from來自哪裡,指發件人的名稱或地址
msg['To'] = Header('我的小可愛') #3.to發件人郵箱地址
msg['Subject'] = Header('我用python') #4.主題
try:
# 開啟發信服務
server = smtplib.SMTP_SSL(host)
server.connect(host, port)
# 登入發信郵箱
server.login(username, password)
# 傳送郵件
server.sendmail(username, to_addr, msg.as_string())
# 關閉伺服器
server.quit()
print('傳送成功')
except:
print('傳送失敗')
def job(): #定時器
Email()
schedule.every().day.at("7:30").do(job) #每天早上7點半執行一次
while True:
schedule.run_pending() #檢查上面的任務部署情況,如果任務已經準備就緒,就去啟動執行。
time.sleep(1)
#讓程式按1秒來檢查
自動定時爬取天氣預報傳送郵件:
【定時】+【發郵件】+【爬蟲】
#爬取天氣,需要用到爬蟲裡面requests模組
#引用模組
import smtplib #發郵件
from email.mime.text import MIMEText #用於構建內容文字
from email.header import Header #用於構建郵件頭
import schedule #定時模組
import time #時間模組
import requests #請求網頁資訊模組
from bs4 import BeautifulSoup #用來解析和提取網頁中的資料的模組
def weather(): #定義函式
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
r=requests.get('http://www.weather.com.cn/weather/101281601.shtml',headers=headers) #跟網站要資料賦值給r
r.encoding='utf-8' #重申r的編碼為'utf-8'
bs=BeautifulSoup(r.text,'html.parser') #解碼,'html.parser'是解析器
a=bs.find('li',class_="sky skyid lv1") #提取資料
b=a.find('h1').text
c=a.find('p').text
d=a.find('p',class_="tem").text[-7:]
return'今天%s\n天氣:%s\n溫度:%s' % (b,c,d)
def Email(weathers): #定義函式Email(),一旦呼叫將會執行下面的功能,引數為weathers
#伺服器,埠
host='smtp.qq.com'
port=465
#我方賬戶,授權碼
username='************@qq.com'
password='***********'
#對方賬戶
to_addr=['******@live.com','*******@qq.com'] #新增多個賬戶採用列表形式
#要傳送的內容
moment=weathers
#構建純文字的郵件內容
msg = MIMEText(moment,'plain','utf-8')
#構建郵件頭
msg['From'] = Header('丁丁') #2.from來自哪裡,指發件人的名稱或地址
msg['To'] = Header('我的小可愛') #3.to發件人郵箱地址
msg['Subject'] = Header('天氣預報') #4.主題
try:
# 開啟發信服務
server = smtplib.SMTP_SSL(host)
server.connect(host, port)
# 登入發信郵箱
server.login(username, password)
# 傳送郵件
server.sendmail(username, to_addr, msg.as_string())
# 關閉伺服器
server.quit()
print('傳送成功')
except:
print('傳送失敗')
def job():
weathers=weather() #呼叫函式weather(),返回的值賦值給weathers
Email(weathers) #呼叫函式Email(weathers),引數為weathers
schedule.every().day.at("7:30").do(job) #每天早上7點半執行一次
while True:
schedule.run_pending() #檢查上面的任務部署情況,如果任務已經準備就緒,就去啟動執行。
time.sleep(1)
#讓程式按1秒來檢查
轉:https://blog.csdn.net/weixin_45239949/article/details/96617183