Python-十四、发邮件

复习上一章的内容。

模块相关:

模块相关语句
模块三问

项目流程是什么?

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.我还找到了一张别人画的图。

PYTHON发送邮件流程图

决定了我需要学习的两个模块,就是负责发送邮件的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 = '[email protected]'
password = '授权码'
from_addr = '[email protected]'  #发件人
to_addr = '[email protected]'  #收件人

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内容、图片、附件等多种形式。

Email模块

···

使用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 = '[email protected]'   #发信邮箱
to_addr = '[email protected]'     #发信对象
#邮件正文,第一个是内容,第二个(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 = '[email protected]'   #发信邮箱
to_addr = '[email protected]'     #发信对象
#邮件正文,第一个是内容,第二个(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 = ['[email protected]','[email protected]']

# 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中添加这个模块,方法如下。

1
2
3

MyQR教程入口

我们经常使用 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' #二维码
    )

你可能感兴趣的:(Python-十四、发邮件)