1、电子邮件介绍
电子邮件(Electronic Mail,简称为E-mail),是—种利用电子手段提供信息交换的通信方式,是互联网应用最广的服务。电子邮件可以通过互联网或内部网络,将文字、图像、音频和视频等信息以电子形式传递给一个或多个收件人。我们既可以发送电子邮件,又能自动地接收电子邮件,同时还能对收发的邮件进行存储,但在存储邮件时,电子邮箱对邮件的大小有严格规定。
电子邮件作为互联网时代最基础也是最重要的通信工具之一,自其诞生以来,已经深深地渗透到我们的日常生活和工作中。通过网络的电子邮件系统,我们可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。电子邮件的存在,极大地方便了全世界范围内人与人之间的沟通与交流,促进了社会的发展。
—个完整的电子邮件地址格式为:用户名@主机名.域名。电子邮件地址通常由三个主要部分组成:用户名、@符号和邮箱所在的服务器域名。
用户名:它是电子邮件地址中的第一部分,通常由字母和数字组成,用户名在电子邮件服务器上必须是唯一的。
@符号:它用作分隔符,用于将用户名和邮箱所在的服务器域名分开。
邮箱所在的服务器域名:它包括电子邮件服务器的域名或IP地址,用于标识电子邮件的接收位置。
例如,一个典型的电子邮件地址可能是“example@qq.com”,其中“example”是用户名,“qq.com”是邮箱所在的服务器域名。需要注意的是,电子邮件地址中的“@”符号是半角格式,与输入法中全角格式“@”不一样。在正式场合中,用户名部分通常不包含特殊字符如“.”或“_”,以避免造成混淆。
电子邮件的运作基于电子邮件服务器,目前有很多提供邮件服务的厂商:Sina(新浪)、Sohu(搜狐)、163(网易)、QQ(腾讯)、Gmail、Yahoo、Mail等等他们都有自己的邮件服务器。用户通常通过邮件客户端软件或者网页版邮件服务(网页浏览器)撰写、发送和接收邮件。邮件客户端负责与邮件服务器进行通信,邮件服务器则承担着存储、转发和管理邮件的任务。
当用户编写一封电子邮件后,邮件首先被客户端软件打包并通过SMTP(Simple Mail Transfer Protocol)协议提交至发件人的邮件服务器。邮件服务器会根据邮件头部的收件人地址将邮件投递至目标邮件服务器,最终由目标邮件服务器将邮件放入收件人的邮箱中。
同样,用户若想从邮件服务器管理的电子邮箱中接收电子邮件,在连上邮件服务器后,也要遵循一定的通信格式,POP3协议就是用来定义这种通信格式的。因此,我们通常也把处理用户POP3请求(邮件接收请求)的服务器称为POP3服务器(邮件接收服务器)。
2、使用Python发送电子邮件
Python作为一种通用且强大的编程语言,在电子邮件处理方面展现出了显著的优势。Python的易读性、简洁性以及模块化的设计,使得电子邮件相关的代码易于编写、调试和维护。当我们需要在程序中实现自动发送和接收邮件的功能时,通过Python编写程序来实现邮件的发送和接收成为一项有趣而实用的技能。在本节中,我们将详细介绍如何使用Python发送邮件。
Python标准库提供了smtplib模块,用于实现SMTP协议发送邮件。标准库还提供email模块帮助我们便捷地构建复杂的邮件格式。
SMTP协议(全称为Simple Mail Transfer Protocol,即简单邮件传输协议),是一种用于传输电子邮件的协议。它定义了一种可靠且有效的方式来发送电子邮件,包括邮件的发送、接收和转发等。SMTP服务通常由邮件服务器提供,用于处理邮件的发送和接收请求。
Python的smtplib模块提供了一种很方便的途径发送电子邮件。它对SMTP协议进行了简单的封装。
smtplib模块中创建SMTP对象语法如下:
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
参数说明:
host: SMTP服务器主机。你可以指定主机的ip地址或者域名如:smtp.qq.com,这个是可选参数。
port:如果你提供了host参数,你需要指定SMTP服务使用的端口号,一般情况下SMTP端口号为25。
local_hostname:如果SMTP在你的本机上,你只需要指定服务器地址为localhost即可。
smtplib模块还提供了SMTP_SSL类,操作与SMTP类基本类似。SMTP类和SMTP_SSL类的区别在于,smtplib.SMTP_SSL使用安全加密的SSL协议连接到SMTP服务器,而smtplib.SMTP没有进行安全加密,所以如果待测试邮箱不允许使用非SSL通信时,则无法使用smtp.SMTP方式来创建客户端对象。
SMTP对象使用sendmail方法发送邮件,语法如下:
SMTP.sendmail(from_addr, to_addrs, message[, mail_options, rcpt_options])
参数说明:
from_addr:邮件发送者地址。
to_addrs:字符串列表,邮件发送地址。
message:发送消息,一般使用字符串。
这里需要注意的是,第三个参数“message”是一个对象,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意“message”的格式。这个格式就是SMTP协议中定义的格式。
在使用SMTP协议发送电子邮件之前,发件人的邮箱必须开启SMTP协议。这里以QQ邮箱开启SMTP协议举例说明,其他邮箱设置基本类似。首先登录QQ邮箱,可以通过浏览器访问https://mail.qq.com/进入QQ邮箱,或者在电脑版QQ的主页面上,点击页面左上脚的头像图标,然后找到并点击信封图标,即可进入QQ邮箱。成功登录QQ邮箱后,依次点击设置->账号,如下图:
在账号页面,点击鼠标下拉到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”位置,点击“开启服务”。开启服务过程会有短信验证,当短信验证成功后,会跳转到新的页面,并会自动生成一组授权码,这个授权码一定要记得复制并保存。在使用Python发送电子邮件时,发件人的邮箱密码就是该配置生成的授权码。如下图所示:
QQ邮箱配置完成后,我们就可以通过Python的smtplib模块,利用QQ邮箱账号发送邮件,例如:
动手练一练:
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
# 发件人邮箱账号
from_addres = "5********8@qq.com"
# 发件人邮箱密码,即配置生成的授权码
password = "m***********b"
# 收件人邮箱账号,你可以填任意想要发送的邮箱,也可以发送给自己
to_addres = "5********8@qq.com"
# 邮件正文
text = "在线学习Python编程,进入www.pyhint.com"
# 指定消息体使用纯文本格式
message = MIMEText(text, "plain", "utf-8")
# 发件人显式的名字
message["From"] = formataddr(["Python编程教学", from_addres])
# 收件人显式的名字
message["To"] = formataddr(["在线编程学习", to_addres])
# 邮件标题
message["Subject"] = "Python邮件发送测试"
try:
# QQ邮箱SMTP服务器,端口是25
server = smtplib.SMTP_SSL("smtp.qq.com",)
# 登录
server.login(from_addres, password)
# 发送
server.sendmail(from_addres, to_addres, message.as_string())
print("QQ邮件发送成功!")
# 退出服务器
server.quit()
except smtplib.SMTPException as e:
print("QQ邮件发送失败!", e)
执行以上代码,输出结果为:
QQ邮件发送成功
上面的例子中,你需要修改:发件人邮箱(你的QQ邮箱),密码(配置生成的授权码),收件人邮箱(可以发给自己)。QQ邮箱SMTP服务器地址:smtp.qq.com,默认端口是25。如果邮件发送成功,就会输出“QQ邮件发送成功”。接着,打开我们的QQ邮箱,就可以看到QQ邮箱里面收到一条新的邮件,邮件标题是“Python邮件发送测试”,邮件的内容是“在线学习Python编程,进入www.pyhint.com”。