发送电子邮件模块smtplib

一、简介

电子邮件是最流行的互联网应用之一。在系统管理领域,我们常常使用邮件来发送告警信息、业务质量报表等,方便运维人员第一时间了解业务的服务状态。本节通过python的smtplib模块来实现邮件的发送功能,模拟一个smtp客户端,通过与smtp服务器交互来实现邮件发送功能,这可以理解成foxmail的发送邮件功能,在第一次使用之前我们需要配置smtp主机地址、邮箱账号及密码等信息。Python自带smtplib模块,无需额外安装。下面进行详细介绍。

二、smtplib模块的常用类与方法

注:建议使用QQ邮箱作为FROM发送地址,否则可能会出现收不到发布出去的情况。

SMTP类定义:smtp.SMTP([host[,port[,local_hostname[,timeout]]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。host参数为远程smtp主机地址,比如smtp.163.com;port为连接接口,默认端口25;local_hostname的作用是在本地主机的FQDN(完整的域名)发送HELO/EHLO(标识用户身份)指令,timeout为连接或尝试在多少秒超时。SMTP类具有如下方法:

  • SMTP.connect([host[,port]])方法,连接远程smtp主机方法,host为远程主机地址,port为远程主机smtp端口,默认为25,也可以直接使用host:port形式来表示,例如:SMTP.connect(“smtp.163.com”,”25″)
  • SMTP.login(user,password)方法,远程smtp主机的校验方法,参数为用户名与密码,如SMTP.login(“python_2014@163.com”,”abcd1234″)。
  • SMTP.sendmail(from_addr,to_addr,msg[,mail_options,rcpt_options])方法,实现邮件的发送功能,参数依次为发件人、收件人、邮件内容,例如:SMTP.sendmail(“python_2014@163.com”,”demo@domail.com”,body),其中body内容定义如下:
“””
From:python_2014@163.com
To:demo@domail.com
Subject:test mail
test mail body

 

“””

  • SMTP.starttls([keyfile[,certfile]]) 方法启用TLS(安全传输)模式,所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要开启此项才能正常发送邮件,如SMTP.starttls()。
  • SMTP.quit()方法,断开smtp服务器的连接。

三、关于SMTP协议状态码的含义

220:服务就绪。

250:请求动作正确完成(HELO、MAIL FROM、RCPT TO、QUIT指令执行成功会返回此信息)。

235:认证通过。

221:正在处理。

354:开始发送邮件内容,提示以特殊行.结束邮件内容。

500:语法错误,命令不能识别。

552:中断处理

四、一个实例

下面通过一个简单的事例帮助大家理解,目的是使用163向QQ邮箱发送测试邮件,代码如下:

# 导入smtplib模块
In [1]: import smtplib
# 定义SMTP主机
In [2]: HOST = “smtp.163.com”
# 定义邮件主题

 

In [3]: SUBJECT = “这是一封由Python自动发出的邮件”

# 定义邮件发件人

In [4]: FROM = “zhangyj_public@163.com”

# 定义邮件收件人

In [5]: TO = “zhangyj_public@qq.com”

# 定义邮件正文

In [6]: text = “当你收到这封邮件的时候,这已经说明你的发送邮件脚本编写成功!”

# 组装sendmail方法的邮件主体内容,各段以”\r\n”进行分隔

In [7]: BODY = “\r\n”.join((

…: “From: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} FROM,

…: “To: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} TO,

…: “Subject: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} SUBJECT,

…: “”,

…: text))

# 创建一个SMTP()对象

In [8]: server = smtplib.SMTP()

# 通过connect方法连接smtp主机

In [9]: server.connect(HOST, “25”)

# 服务就绪,显示欢迎信息

Out[9]: (220, b’163.com Anti-spam GT for Coremail System (163com[20141201])’)

# 发送邮箱账号和密码

In [10]: server.login(“zhangyj_public@163.com”, “********(*代表你的密码)”)

# 认证通过

Out[10]: (235, b’Authentication successful’)

# 邮件发送,因为内容字符长度问题,所以要在BODY后边加上”encode(‘UTF-8’)”来确定字符集

In [11]: server.sendmail(FROM, [TO], BODY.encode(‘UTF-8’))

# 发送成功

Out[11]: {}

In [12]: server.quit()

# 退出登录,断开SMTP连接

Out[12]: (221, b’Bye’)

若发送成功,如下图所示(你发的邮件有可能会在垃圾邮件里):

附:完整的发送邮件脚本(在内网使用代理服务器连通外网的情况下)

”’

 

Author:zhangyj

”’ 

# 第一二行不解释
# !/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入socks和socket和模块是可以使用代理服务器来发送邮件
import socks
import socket
# 发送邮件模块
import smtplib

# 设置代理服务器
socks.set_default_proxy(socks.HTTP, ‘代理服务器IP’, 端口号, True)
socket.socket = socks.socksocket
# 设置发件人SMTP服务器地址
HOST = “”
# 设置邮件标题
SUBJECT = “”
# 设置发件人邮箱地址
FROM = “”
# 设置收件人邮箱地址
TO = “”
# 设置邮件内容
text = “”
# 将发件人、收件人、邮件主题、邮件内容按照格式拼在一起
BODY = “\r\n”.join((
“From: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} FROM,
“To: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} TO,
“Subject: {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b}s” {815ac408a99669c280d890a3c1592527154068adde55fb55fc5b84dc9fd9f61b} SUBJECT,
“”,
text))
# 建立SMTP会话
server = smtplib.SMTP()
# 创建SMTP连接
server.connect(HOST, “25”)
# 开始安全传输(有些邮箱不支持,若此脚本有错误,请注释或去掉注释此项
# server.starttls()
# 设置邮箱账号和邮箱密码(若使用网易、QQ等邮箱,请设置邮箱客户端授权码)
server.login(“发件人邮箱地址(账号)”, “发件人邮箱密码(授权码)”)
# 开始发送邮件(因为我们的邮件里有大量的中文内容,所以需要在BODY里边加上”.encode(‘UTF-8’)”来支持中文
server.sendmail(FROM, [TO], BODY.encode(‘UTF-8’))
# 结束发送邮件
server.quit()

posted @ 2020-08-11 14:39  星火撩原  阅读(376)  评论(0编辑  收藏  举报