发送邮件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
天气:%s
温度:%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

 

原文地址:https://www.cnblogs.com/annatest/p/14985944.html