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

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

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' #二维码
    )
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容