IP Address: 54.147.142.16


多数应用都会用电子化消息系统同用户通信,以完成用户个性化设定工作。电子邮件也会用于这类通信,常常用于重置用户密码、确认订单以及用户验证等。电子邮件使用SMTP(Simple Mail Transfer Protocol)协议来工作,SMTP协议主要完成在不同邮件服务器间邮件收发以及邮件转发任务。

引言

Python提供了一个专门用于发送邮件的模块smtplib,这个模块定义了一个SMTP会话对象,专门用于发送SMTP邮件。要使用这个模块也很容易,直接在代码中使用以下语句进行引入:

import smtplib

现在我们进入代码部分。

首先打开IDE,创建一个python文件,文件名任意设定,方便起见,这里将该文件命名为”smtp_mail.py”。IDE的选择根据个人使用习惯,易用性来讲PyCharm比较不错,我个人使用的是Intelli J,然后再安装Python语言插件,使用效果同PyCharm类似。新建文件如下图所示:

发送SMTP邮件的前提:

  1. SMTP邮件服务器的域名及端口
  2. SMTP认证的用户名及密码
  3. 邮件人的邮件地址

我们恰好有SMTP了服务器,并且是自己搭建的,域名为”daehub.com”,端口使用25端口。有兴趣自行搭建邮件服务器的朋友可以参照邮件服务器搭建教程

现在,我们就使用这台服务器作为Python程序发送邮件的服务器,示例代码如下:

import smtplib

email_sender = 'webmaster@daehub.com'
email_receiver = 'daehub@126.com'

connection = smtplib.SMTP('mail.daehub.com', 25)
//connection.starttls()
connection.login(email_sender, 'your password')
connection.sendmail(email_sender, email_receiver, 'Hi! this email is from python...')
connection.quit()

smtplib模块专门用于发送邮件,根据SMTP邮件服务器的特性在使用时略有区别。如果SMTP服务器采用加密方式,则在”login”前需要启用加密,即调用”starttls()”方法,如果服务器未加密,则直接调用”login()”方法登录服务器。作为示例,登录密码使用了错误密码,执行代码会收到如下报错信息:

修改为正确密码后,就可以发送邮件了。

可以看到,收到的邮件内容同代码中发送的容相同。同时,我们也发现了一个问题,就是邮件没有主题,也就是邮件并没有标题,这样的邮件发给用户显然是不合适的。而单纯使用smtplib发送邮件已经不能满足我们的要求了。于是就引入了Python语言的另一个邮件相关模块email。email负责构造邮件,smtplib负责发送邮件,两个模块配合使用就可以满足大部分需求。

使用email模块构建邮件的示例代码如下:

import smtplib
import smtp_daehub
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, bytes) else addr))

email_sender = 'webmaster@daehub.com'
email_receiver = 'daehub@126.com'

msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr(u'Python爱好者 <%s>' % email_sender)
msg['To'] = _format_addr(u'管理员 <%s>' % email_receiver)
msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

connection = smtplib.SMTP('mail.daehub.com', 25)
connection.login(email_sender, smtp_daehub.PASSWORD)
connection.sendmail(email_sender, email_receiver, msg.as_string())
connection.quit()

我们编写了一个函数_format_addr()来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>,因为如果包含中文,需要通过Header对象进行编码。

再发送一遍邮件,就可以在收件人邮箱中看到正确的标题、发件人和收件人:

如果我们查看Email的原始内容,可以看到如下经过编码的邮件头:

这就是经过Header对象编码的文本,包含utf-8编码信息和Base64编码的文本。如果我们自己来手动构造这样的编码文本,显然比较复杂。

以上就是使用smtplib和email模块发送邮件的基本实例,至于发送HMTL邮件以及发送附件,都是email模块的不同使用方式,这里就不再详细讲解。

发表评论

电子邮件地址不会被公开。 必填项已用*标注