复习上一章的内容。
模块相关:
项目流程是什么?
1.明确项目目标;
2.分析过程,拆解项目;
3.逐步执行,代码实现。
今天,我们要用Python来发邮件,那么就让我们从这一步开始吧!
1、明确项目目标
业务需求:
业务员小张需要在节假日给客户发祝福邮件。
根据业务需求产生的项目(学习)目标:
1.学会用python群发邮件
2.自学掌握新模块
2、分析过程,拆解项目
2.1、建立版本里程
V 1.0:找到并学习发邮件的模块,给自己发一封一句话的简单邮件
V 2.0:给自己发一封有完整邮件头和正文内容的邮件
V 3.0:群发完整邮件
3、逐步执行,代码实现
让我们按照2中的版本里程碑一步一步来吧!
V 1.0:学习模块,给自己发一封一句话的简单邮件
咋办?GOOGLE或BAIDU呗!
通过使用百度搜索我发现:
1.Python可以解决这个问题;
2.方法是smtplib,email这两个模块。
我顺便知道了::
1.smtplib是用来发送邮件用的,email是用来构建邮件内容的;
2.这两个都是Python内置模块。
3.我还找到了一张别人画的图。
决定了我需要学习的两个模块,就是负责发送邮件的smtplib
和负责构造邮件内容的email
。
我引入两个问题,并通过学习来回答这两个问题:
问题1:这两个模块分别有些什么方法?
模块1、SMTPLIB
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
Python创建 SMTP 对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
**host: **SMTP 服务器主机。 你可以指定主机的ip地址或者域名如:runoob.com,这个是可选参数。
**port: **如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下SMTP端口号为25。
**local_hostname: **如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。
Python SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
参数说明:
**from_addr: **邮件发送者地址。
**to_addrs: **字符串列表,邮件发送地址。
**msg: **发送消息
这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。
等等……
总结后,发现我们要发送邮件,就需要用到smtplib模块的以下方法:
import smtplib
server = smtplib.SMTP()
server.connect(host, port)
server.login(username, password)
server.sendmail(sender, to_addr, msg.as_string())
server.quit()
问题2:这些方法怎么用?
首先,我得有一个邮箱,并且能够使用这个邮箱发邮件,于是我想到了QQ邮箱。
在百度一番搜索
后,我找到了QQ邮箱的使用方法。
扫描后发短信生成授权码。
然后将代码拆解做引入。
import smtplib
host = 'smtp.qq.com' #邮件服务器
port = 465 #服务器端口
username = 'xx@qq.com'
password = '授权码'
from_addr = 'xx@qq.com' #发件人
to_addr = 'yy@ik.com' #收件人
server = smtplib.SMTP() #引用smtplib模块
server.connect(host, port) #服务器和端口
server.login(username, password) #邮箱账号和密码
server.sendmail(from_addr, to_addr, msg.as_string()) #由谁发给谁,邮件内容
server.quit() #退出
问题3:怎么填写邮件内容?
先回顾一下开发过程:
1、导入模块:stmplib模块,email模块
2、定义变量:发件人、密码、收件人、正文内容、服务器
3、使用方法:链接、登录、发送、退出
email 模块
:也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。
···
使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】。
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
···
MIMEText()方法需要输入三个参数:文本内容,文本类型和文本编码。
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
最终代码
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
host = 'smtp.qq.com' #邮件服务器
port = 465 #服务器端口
password = '**********' #邮箱密码(授权码)
from_addr = 'xxx@qq.com' #发信邮箱
to_addr = 'yyy@ik.com' #发信对象
#邮件正文,第一个是内容,第二个(plain代表纯文本),第三个为编码格式。
msg = MIMEText('Send by python','plain','utf-8')
#引用smtplib模块,开启发信服务,使用SSL加密传输
server = smtplib.SMTP_SSL(host)
server.connect(host, port) #服务器和端口
server.login(from_addr, password) #邮箱账号和密码
server.sendmail(from_addr, to_addr, msg.as_string()) #由谁发给谁,邮件内容
server.quit() #退出
邮箱收到的邮件信息:
V 2.0:**给自己发一封完整邮件
在上面的邮件中,我们没有邮件头,正文内容也不算丰富。
丰富邮件头
邮件头(headerr)包括主题、发件人、收件人等信息。
通过搜索关键词“python 邮件头” 找到了下述代码,再读了模块的文档,作出注释。
#导入邮件头模块
from email.header import Header
msg['From'] = Header(from_addr) #发件人
msg['To'] = Header(to_addr) #收件人
msg['Subject'] = Header('python test') #邮件标题
丰富邮件正文
我本来的邮件正文只有短短一句话。
msg = MIMEText('send by python','plain','utf-8')
如果是正式发邮件的话,我该咋整呢?
搞一个变量存正文,在把变量导到msg中去。
本版本的代码如下:
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
host = 'smtp.qq.com' #邮件服务器
port = 465 #服务器端口
password = 'xxx' #邮箱密码(授权码)
from_addr = 'xxx@qq.com' #发信邮箱
to_addr = 'xxx@xx.com' #发信对象
#邮件正文,第一个是内容,第二个(plain代表纯文本),第三个为编码格式。
text = '''朋友你好
我是一封Python发的邮件,能遇见你很开心。
希望学习Python对你来说,不是一件困难的事情!
人生苦短,我用Python
'''
msg = MIMEText(text,'plain','utf-8')
#邮件头
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('由Python编写的邮件')
#引用smtplib模块,开启发信服务,使用SSL加密传输
server = smtplib.SMTP_SSL(host)
server.connect(host, port) #服务器和端口
server.login(from_addr, password) #邮箱账号和密码
server.sendmail(from_addr, to_addr, msg.as_string()) #由谁发给谁,邮件内容
server.quit() #退出
V 3.0:群发完整邮件
在百度中找到了海量的信息,决定从2
种方式着手。
1、设置一个列表形式的变量:
to_addrs = ['xxx@qq.com','yyy@qq.com']
# msg['To'] = Header(to_addr) #因为to_addr函数会影响到发信对象,这样使用会报错,所以我们改一下msg['To']函数的代码
msg['to'] = Header(",".join(to_addrs)) #使用join函数把to_addrs编程一个字符串。
2、用while循环
通过询问“是否继续输入邮箱地址”的方式,并用while循环来实现多个收件人的功能。
to_addrs = []
while True:
a=input('请输入收件人邮箱:')
#输入收件人邮箱
to_addrs.append(a)
#写入列表
b=input('是否继续输入,n退出,任意键继续:')
#询问是否继续输入
if b == 'n':
break
print(to_addrs)
练习-做一个动态二维码
在百度中找到了很多方法,决定尝试MyQR这模块。
在cmd中使用pip install myqr
成功完成了该模块的安装,需要注意的是MyQR依赖于python3,在python2的环境下可能无法正常运行。
刚开始时出现报错:ModuleNotFoundError: No module named 'MyQR'
。
找到的解决方法为在Pycharm中添加这个模块,方法如下。
我们经常使用 MyQR 库中的一个模块 myqr 来制作二维码,引用方式为from MyQR import myqr其参数如下所示:
words:二维码内容,链接或者句子
version:二维码大小,范围为[1,40]
level:二维码纠错级别,范围为{L,M,Q,H},H为最高级,默认。
picture:自定义二维码背景图,支持格式为 .jpg,.png,.bmp,.gif,默认为黑白色
colorized:二维码背景颜色,默认为 False,即黑白色
contrast:对比度,值越高对比度越高,默认为 1.0
brightness:亮度,值越高亮度越高,默认为 1.0,值常和对比度相同
save_name:二维码名称,默认为 qrcode.png
save_dir:二维码路径,默认为程序工作路径
from MyQR import myqr#注意大小写
myqr.run(
words = 'http://www.baidu.com/', #二维码内容
version = 5, #二维码大小
level = 'M', #二维码纠错级别
picture = 'd:\\qrcode\\LOGO().png', #二维码背景图片
colorized = True, #调整颜色为彩色,默认False为黑白
save_name = 'test.png', #二维码图片命名
save_dir = 'd:\\qrcode' #二维码
)