python基础之自动发邮件篇

1、模块学习
python 发邮件调用模块:smtplib,email 模块。(1)smtplib 模块:发送邮件;
(2)email 模块:构建邮件内容。
1.1、smtplib 模块
1.1.1、SMTP
SMTP (Simple Mail Transfer Protocol):简单邮件传输协议,SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。
server = smtplib.SMTP()
1.1.2、连接服务器
server.connect(host, port):host是指定连接的邮箱服务器port 是“端口”的意思(一般情况下SMTP默认端口号为25)
1.1.3、登录服务器
server.login(username, password):username:登录邮箱的用户名
password:授权码
1.1.4、发送邮件
server.sendmail(from_addr, to_addr, msg.as_string()):
from_addr:发件人
to_addr:收件人
msg.as_string():邮件内容(as_string()是将发送的信息msg变为字符串类型)
1.1.5、退出服务器
server.quit()
1.2、email 模块
1.2.1、模块内容
(1)MIMEText
定义:内容形式为纯文本、HTML页面
调用:from email.mime.text import MIMETextMIMEText(msg,type,chartset):msg:文本内容,可自定义
type:文本类型,默认为plain(纯文本)chartset:文本编码,中文为“utf-8”
(2)MIMEImage
定义:内容形式为图片
调用:from email.mime.image import MIMEImage
(3)MIMEMultipart
定义:多形式组合,可包含文本和附件
调用:from email.mime.multipart import MIMEMultipart
2、发送邮件
2.1、邮件头
(1)调用:from email.header import Header
(2)使用
msg[‘From’] = Header(from_addr)
msg[‘To’] = Header(to_addr)
msg[‘Subject’] = Header(‘python test’)
2.2、群发邮件
msg[‘To’] = Header(to_addr) :
to_addrs = [‘wufeng@qq.com’,‘kaxi@qq.com’]
join():用法是 str.join(sequence)

QQ邮箱 POP3 和 SMTP 服务器地址设置如下:
邮箱:qq.com
POP3服务器(端口995):pop.qq.com(接受邮件)
SMTP服务器(端口465或587): smtp.qq.com (发出邮件)
SMTP服务器需要身份验证。
下面以获取某网站菜谱为例子,代码如下:

import requestsimport smtplib #发送邮件的模块
from bs4 import BeautifulSoup
from email.mime.text import MIMEText #内容形式为出文本、HTML页面
from email.mime.image import MIMEImage #内容形式为图片
from email.mime.multipart import MIMEMultipart #内容形式为多形式组合,可包含文本和附件
from email.header import Header
from email.mime.application import MIMEApplication
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '菜单列表'
sheet['A1'] ='菜名'     # 加表头,给A1单元格赋值
sheet['B1'] ='作者'   # 加表头,给B1单元格赋值
sheet['C1'] ='食材'   # 加表头,给C1单元格赋值
sheet['D1'] ='制作次数'   # 加表头,给D1单元格赋值
sheet['E1'] ='链接'   # 加表头,给D1单元格赋值
#添加请求头
url = 'url'
headers = {'User-Agent':'Mozilla/5.0 (windows NT 10.0; win64; x64) Applewebkit/\    537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 safari/537.36'}
# 获取数据
res_foods = requests.get(url, headers = headers)print(res_foods.status_code)# print(res_foods)
# 解析数据
bs_foods = BeautifulSoup(res_foods.text,'html.parser') 
# 查找包含菜名和URL的<p>标签
tag_name = bs_foods.find_all('p',class_='name')
# 查找包含食材的<p>标签
tag_ingredients = bs_foods.find_all('p',class_='ing ellipsis')
# 查找包含作者的<p>标签
tag_authors = bs_foods.find_all('p',class_='author')
# 查找包含制作次数的<p>标签
tag_numbers = bs_foods.find_all('p',class_='stats green-font')
# 创建一个空列表,用于存储信息
list_all = []
# 启动一个循环,次数等于菜名的数量
for x in range(len(tag_name)):    # 提取信息,封装为列表。  
	list_food = [tag_name[x].text.strip(),tag_authors[x].text.strip(),tag_ingredients[x].text.strip(),tag_numbers[x].text.strip(),'http://www.xiachufang.com'+tag_name[x].find('a')['href']]    
# 将信息添加进list_all        
	list_all.append(list_food)    
	sheet.append(list_food)# print(list_food)
for i in range(2,3):    
	url1 = url+'?page='+str(i)    
	res_foods = requests.get(url1, headers = headers)    
	bs_foods = BeautifulSoup(res_foods.text,'html.parser')    
	tag_name = bs_foods.find_all('p',class_='name')    # 查找包含食材的<p>标签    
	tag_ingredients = bs_foods.find_all('p',class_='ing ellipsis')    # 查找包含作者的<p>标签
	tag_authors = bs_foods.find_all('p',class_='author')    # 查找包含制作次数的<p>标签    
	tag_numbers = bs_foods.find_all('p',class_='stats green-font')    # 启动一个循环,次数等于菜名的数量
		for x in range(len(tag_name)):        # 提取信息,封装为列表。        
		list_food = [tag_name[x].text.strip(),tag_authors[x].text.strip(),tag_ingredients[x].text.strip(),tag_numbers[x].text.strip(),'http://www.xiachufang.com'+tag_name[x].find('a')['href']]        
		# 将信息添加进list_all            
		list_all.append(list_food)        
		sheet.append(list_food)
# 解析数据
wb.save('XXXXXXXX.xlsx')  
#2.定义变量
from_addr = 'XXXXXXX@qq.com'
password = 'XXXXXXXXX'  # 授权码
# 收信方邮箱# 
to_addrs = ['XXXXXXXX@qq.com','XXXXXXXX@qq.com']

# 发信服务器
smtp_server = 'smtp.qq.com'
#创建一个带附件的实例
message = MIMEMultipart()message['From'] = Header('XXX', 'utf-8')
subject = 'XXXXXXXXXX'
message['Subject'] = Header(subject, 'utf-8') 
#邮件正文内容
message.attach(MIMEText('XXXXXXXXX', 'plain', 'utf-8')) 
# 构造附件1,传送当前目录下的 XXXX.txt 文件
att1 = MIMEApplication(open('XXXX.xlsx', 'rb').read())
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1.add_header('Content-Disposition','attachment', filename='XXXXXXX.xlsx')message.attach(att1)

#3.使用方法
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr,password)
try:    
	for i in to_addrs:
	        message['To'] =  Header(i, 'utf-8')        
	        server.sendmail(from_addr, i, message.as_string())        
	        print ('邮件发送成功')     
except:    
	print ('邮件发送失败')server.quit()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值