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()