1. 程式人生 > 其它 >傳送郵件smtplib,email,郵件頭header,定時器schedule,爬蟲requests(轉)

傳送郵件smtplib,email,郵件頭header,定時器schedule,爬蟲requests(轉)

傳送郵件

發一份簡單的郵件
發一份完整的帶郵件頭的群郵件
自動定時發郵件
自動定時爬取天氣預報傳送郵件

——————————————————————

發一份簡單的郵件

程式碼結構:

也就是這樣:

以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