小朋友们好,大朋友们好!
我是猫妹,一名爱上Python编程的小学生。
欢迎和猫妹一起,趣味学Python。
今日主题
猫爸赚钱养家,细想起来真的不容易啊!
起早贪黑,都是6点早起做早饭,送我到学校后,匆匆忙忙去上班,下班忙起来时也不得不披星戴月。
有句话咋说的?
起得比鸡早,睡得比狗晚。
世人慌慌张张,不过图碎银几两,偏偏这碎银几两,能解世间惆怅。
可让父母晚年安康,呵护幼子成长入学堂。
他的工资条长这样:
猫爸自己也常常纳闷,工资条是通过邮件发送的,里面有文字和图片。
如果不小心发错怎么办?
比如把张三的工资条贴到了李四的邮件里。
这应该是程序实现的发送邮件吧?
我猜是,你呢?
咱们今天的主题就是如何用Python发送邮件,完全可以实现类似效果。
电子邮件email
电子邮件又叫email,它是一种用电子手段提供信息交换的通信方式。
通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。
电子邮件可以是文字、图像、声音等多种形式。
同时,用户可以得到大量免费的新闻、专题邮件,并轻松实现轻松的信息搜索。
咱们今天实现以下三个功能:
-
发送纯文本格式邮件
-
发送HTML格式邮件
-
发送带附件的邮件
在学习之前,需要准备两个邮箱。
这两个电子邮箱,不要属于同一家邮件服务商。
比如(和猫妹学Python)准备一个QQ邮箱、一个163邮箱。
163邮箱设置
对于163电子邮箱,需要设置客户端授权密码,不然邮件会发送失败。
具体看以下截图,如果版本有差异,操作方式也是类似的。
开启IMAP/SMTP服务
开启POP3/SMTP服务
什么是SMTP
SMTP,Simple Mail Transfer Protocol,简单邮件传输协议,一种提供可靠且有效的电子邮件传输的协议。
SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
我们不需要了解SMTP具体实现,只要会使用它就可以了。
毕竟,我们目标不是开发一套电子邮件系统,而是如果用Python来发送邮件。
smtplib
Python之所以强大,之所以被称为胶水语言。
就是因为它有许多现成的模块,可以拿来就用,简单,高效。
Python提供了smtplib模块,可以用它来发邮件。
一般需要四个步骤:
-
连接服务器
-
登录服务器
-
发送邮件
-
退出服务器
第1步
smtplib.SMTP创建一个SMTP对象。
host是服务器主机IP或域名,port是端口号。
每个公司的邮件服务商和端口号都可以不同,可以在网上查询下。
smtplib.SMTP可以用smtplib.SMTP_SSL替换。
smtplib.SMTP,非SSL端口,不加密。
smtplib.SMTP_SSL,SSL端口,加密。
建议使用smtplib.SMTP_SSL,更加安全。
smtp.ehlo()表示向服务器进行反馈,反馈成功后就表示可以登录服务器了。
第2步
登录服务器
smtp.login(sender, pwd)
sender就是登录邮箱名
pwd就是密码
第3步
发送邮件
smtp.sendmail(sender, receiver, message)
sender表示发送者的邮箱
receiver表示接收者的邮箱
message邮件内容
第4步
退出服务器
smtp.quit()
发送纯文本格式邮件
代码和效果如下图:
1~3:导入smtplib模块,并引入MIMEText和Header。
这两个类是用来构建邮件内容的。
它们都属于email模块。
要想用Python发邮件,需要用到stmplib模块和email模块。
stmplib用来发送邮件。
email用来构建邮件内容。
6~7:输入邮箱账户名和密码,这里的密码不是邮件的密码,而是授权密码,当在设置smtp时会看到。
10:接收邮件的邮箱地址,它是列表,如果同时发送多个人,这里可以多设置几个地址。
11~14:填充邮件内容。
MIMEText一共有三个参数:
-
邮件正文,如果内容较多,可以多行。
-
邮件类型,plain表示纯文本。
-
邮件编码,一般是utf-8。
17~24:采用try except实现异常处理,如果有报错,网上搜索下原因。
发送HTML格式邮件
万事开头难,有了发送纯文本邮件的经验。
再发送HTML格式邮件,就简单多了。
格式:
message=MIMEText("正文内容","html","utf-8")
发送带附件的邮件
如果想要在邮件中添加附件怎么办?
带附件的邮=邮件正文+各个附件
邮件正文使用的是MIMEText,附件呢?
一般使用的是MIMEApplication对象,然后再使用一个MIMEMultipart对象把两个对象包含进去就可以了。
MIMEMultipart=MIMEText+MIMEApplication
还记得我们之前学习的文件操作吗?
文件分为文本文件和二进制文件。
那么附件有没有类型呢?
有的,也分为文本类型和其他类型。
文本类型附件语法
message=MIMEMultipart()实例化一个MIMEMultipart对象。
MIMEText()实例化一个MIMEText对象,三个参数含义为读取文件内容、网络传输编码方式、unicode编码方式。
open这句代码表示打开文件并读取文件,rb表示二进制模式打开一个只读文件。
它等同于下面两句代码:
file=open(r"文件路径","rb")
txt=file.read()
atta["Content-Tpye"]和atta["Content-Disposition"]是固定的,暂时不需要关心其具体含义。
只需要知道,这两句代码等同于如下:
atta.add_header("Content-Type", "application/octet-stream")
atta.add_header("Content-Disposition", "attachment; filename='文件名'")
message.attach(atta)表示把上述附件添加到邮件附件中。
如果附件中有中文,可能有乱码。
atta.add_header("Content-Disposition", "attachment", filename=("test"))
可以改为
atta.add_header("Content-Disposition", "attachment", filename=("gbk","","test"))
文本类型附件语法
当附件为其他类型(如pdf、xlsx、zip、mp3等)时,我们需要用到email模块的两个类:MIMEMultipart类和MIMEApplication类。
语法:
MIMEApplication用于实例化一个MIMEApplication对象,有一个参数,用于读取文件内容。
atta.add_header()表示调用MIMEApplication对象的add_header方法。
最后,使用MIMEMultipart对象的attach将附件添加到MIMEApplication对象中。
为什么用编程方式发送邮件
如果要发100封邮件怎么办?
编程可以批量、高效,你觉得呢?
好了,我们今天就学到这里吧!
如果遇到什么问题,咱们多多交流,共同解决。
我是猫妹,咱们下次见!