python stmplib与email模块邮箱详解

简介: python stmplib与email模块邮箱详解

python stmplib与email 模块 发送邮箱

文章目录

python stmplib与email 模块 发送邮箱

1. stmplib 简介

2. stmplib类与方法

2.1 发送txt格式邮件

3. email 简介

4. 类与方法

4.1 实现HTML格式邮件

4.2 实现接受多个图片格式邮件

4.3 实现接受单个图片格式邮件

4.4 实现发送附件与图片格式的邮件

1. stmplib 简介

简单邮件传输协议 (SMTP) 是一种协议,用于处理在邮件服务器之间发送电子邮件和路由电子邮件。


Python 提供了smtplib模块,该模块定义了一个 SMTP 客户端会话对象,该对象可用于将邮件发送到具有 SMTP 或 ESMTP 侦听器守护程序的任何 Internet 机器。

2. stmplib类与方法

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]

作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。


host参数为远程smtp主机地址,比如smtp.163.com;

port为连接端口,默认为25;

local_hostname的作用是在本地主机的FQDN(完整的域名)发送HELO/EHLO(标识用户身份)指令;

timeout为连接或尝试在多少秒超时。

smtplib模块还提供了SMTP_SSL类和LMTP类,对它们的操作与SMTP基本一致。

smtplib.SMTP提供的方法:


SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。例如:SMTP.connect(“smtp.163.com”,“25”)。

SMTP.docmd(cmd[, argstring]):向smtp服务器发送指令。可选参数argstring表示指令的参数。

SMTP.helo([hostname]) :使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。

SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。

SMTP.login(user, password):登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options,rcpt_options]):方法,实现邮件的发送功能,参数依次为是发件人、收件人、邮件内容,例如:SMTP.sendmail(“python_2014@163.com”,“demo@domail.com”,body),其中body内容自定义。

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

SMTP.quit() :断开与smtp服务器的连接,相当于发送"quit"指令。

smtp.close()

2.1 发送txt格式邮件

  • 连接 SMTP 服务器,并使用用户名、密码登录服务器。
  • 创建 mailMessage 对象,该对象代表邮件本身。
  • 调用代表与 SMTP 服务器连接的对象的 sendmail() 方法发送邮件。

示例:

#!/usr/bin/python
#coding=gbk 
import smtplib 
import string
HOST = "smtp.xxx.com"
SUBJECT = "test email from Python"
TO = "xxx@163.com"
FROM = "xxxx@xxx.com"
text = "Python rules them all"
BODY = string.join((
        "From: %s" % FROM,
        "To: %s" % TO,
        "Subject: %s" % SUBJECT,
        "",
        text
        ), "\r\n")
server = smtplib.SMTP()
server.connect(HOST,"25")
server.starttls()
server.login("xxxx@xxx.com","paswd")
server.sendmail(FROM, [TO],BODY)
server.quit()
[root@localhost stmplib]$ python stmp1.py

1832b220aa754cd18c504acc7686a560.png

3. email 简介

email 模块,使用该模块可以轻松的发送带图片、视频、附件等复杂内容的邮件。

4. 类与方法

email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[,_params]]]]),作用是生成包含多个部分的邮件体的MIME对象,参数_subtype指定要添加到”Content-type:multipart/subtype”报头的可选的三种子类型,分别为mixed、related、alternative,默认值为mixed。定义mixed实现构建一个带附件的邮件体;定义related实现构建内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮件体。

email.mime.audio.MIMEAudio (_audiodata[, _subtype[, _encoder[, **_params]]]),创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。

email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[,**_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。

email.mime.text.MIMEText (_text[, _subtype[,_charset]]),创建包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。

4.1 实现HTML格式邮件

#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.text import MIMEText
Host = "smtp.xxx.com"
From = "xxx@xxx.com"    
To = [ 'xxx@163.com', 'xxxx@qq.com' ]         #定义群组
#To = [ 'xxxx@163.com' ]         #定义个体
subject = u"官网流量数据报表"   
username = "xxxx@xxx.com"
password = "xxxx"
msg = MIMEText("""
     <table width="800" border="0" cellspacing="0" cellpadding="4">
     <tr>
        <td bgcolor="#CECFAD" height="20" style="font-size:14px">*官方数据 <a
 href="monitor.domain.com"> 更多>></a></td>
     </tr>
     <tr>
         <td bgcolor="#EFEBOE" height="100" style="font-size:13px">
          1)日访问量:<font color=red>153433</font> 访问次数: 23651 页面浏览量: 45322 点击数: 45353 数据流量: 454Mb<br>
          2) 状态码信息<br>
          3) 访问浏览器信息<br>
          4) 页面信息<br>
          &nbsp;&nbsp;/index.php 42153<br>
          &nbsp;&nbsp;/view.php 21451<br>
          &nbsp;&nbsp;/login.php 5112<br>
          </td>
      </tr>
    </table>""","html","utf-8")
msg['Subject'] = subject 
msg['From'] = From 
#msg['To'] = To
for to in To:   
    msg[to] = to
try:
    smtp = smtplib.SMTP()
    smtp.connect(Host,"25")
    smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(From, To, msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))
[root@localhost stmplib]# python stmp3.py 
邮件发送成功!

1832b220aa754cd18c504acc7686a560.png

4.2 实现接受多个图片格式邮件

#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
Host = "smtp.xxxx.com"
From = "xxx@xxxx.com"    
To = [ 'xxxx@163.com', 'xxxxxxxx@qq.com' ]         #定义群组
To = [ 'xxxx@163.com' ]         #定义群组
subject = u"官网流量数据报表"   
username = "xxx@xxxx.com"
password = "xxx123."
def addimg(src, imgid):
    fp = open(src, 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID', imgid)
    return msgImage
msg = MIMEMultipart('related')
msgtext = MIMEText("""
     <table width="1200" border="0" cellspacing="0" cellpadding="4">
     <tr>
        <td bgcolor="#CECFAD" height="10" style="font-size:14px">*官方数据 <a
 href="monitor.domain.com"> 更多>></a></td>
     </tr>
     <tr>
         <td bgcolor="#EFEBOE" height="100" style="font-size:13px">
            <img src="cid:greenday1"></td><td>
            <img src="cid:greenday2"></td>
     </tr>
     <tr>
         <td bgcolor="#EFEBOE" height="100" style="font-size:13px">
            <img src="cid:greenday3"></td><td>
            <img src="cid:greenday4"></td>
     </tr>
    </table>""","html","utf-8")
msg.attach(msgtext)
msg.attach(addimg("/root/python/stmplib/photo/12.jpg","greenday1"))
msg.attach(addimg("/root/python/stmplib/photo/13.jpg","greenday2"))
msg.attach(addimg("/root/python/stmplib/photo/14.jpg","greenday3"))
msg.attach(addimg("/root/python/stmplib/photo/15.jpg","greenday4"))
msg['Subject'] = subject 
msg['From'] = From 
#msg['To'] = To
for to in To:   
    msg[to] = to
try:
    smtp = smtplib.SMTP()
    smtp.connect(Host,"25")
    smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(From, To, msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))
[root@localhost stmplib]# python stmp4.py
邮件发送成功!

image.png

4.3 实现接受单个图片格式邮件

......
#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
HOST = "smtp.xxxx.com" 
From = "xxx@xxxx.com"    
To = 'xxxx@163.com'      #定义群组
subject = "官网流量数据报表"   
username = "xxx@xxxx.com"
password = "xxxxx"
msg = MIMEMultipart('related') 
msg['Subject'] = subject 
msg['From'] = From 
msg['To'] = To
msgtext = MIMEText('</pre><h1>你好</h1><pre><img src="cid:greenday1"></td>','html','utf-8') 
msg.attach(msgtext)
fp = open('/root/python/stmplib/photo/12.jpg','rb')
msgimage = MIMEImage(fp.read())
fp.close() 
msgimage.add_header('Content-ID','greenday1')
msg.attach(msgimage)
try:
    smtp = smtplib.SMTP()
    smtp.connect(HOST)
    smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(From, [To], msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))

1832b220aa754cd18c504acc7686a560.png

4.4 实现发送附件与图片格式的邮件

#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
Host = "smtp.xxxx.com"
From = "xxx@xxxx.com"    
To = [ 'xxxx@163.com', 'xxxxxxxxx@qq.com' ]         #定义群组
To = [ 'xxxx@163.com' ]         #定义群组
subject = u"2020年4月日报"   
username = "xxx@xxxx.com"
password = "xxxxxx"
def addimg(src, imgid):
    fp = open(src, 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    msgImage.add_header('Content-ID', imgid)
    return msgImage
msg = MIMEMultipart('related')
msgtext = MIMEText("<font color=red>xxxx2020年4月日报:<br><img src=\"cid:greenday1\" border=\"1\"></br>详细内容见附件。</font>","html","utf-8")
msg.attach(msgtext)
msg.attach(addimg("/root/python/stmplib/photo/12.jpg","greenday1"))
attach = MIMEText(open("/root/python/stmplib/2020年工作日报.xlsx", "rb").read(), "base64", "utf-8")
attach["Content-Type"] = "application/octet-stream"
attach["Content-Disposition"] = "attachment; filename=\"my_daily.xlsx\"".decode("utf-8").encode("gb18030")
msg.attach(attach)
msg['Subject'] = subject 
msg['From'] = From 
#msg['To'] = To
for to in To:   
    msg[to] = to
try:
    smtp = smtplib.SMTP()
    smtp.connect(Host,"25")
    smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(From, To, msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))

参考:


Python - Sending Email using SMTP

Three Ways to Send Emails Using Python With Code Tutorials

Sending Email using Python in 5 statements

Python smtplib

Python smtplib 教程


相关文章
|
10月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
296 62
|
5月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
199 14
|
9月前
|
Python
Python Internet 模块
Python Internet 模块。
201 74
|
6月前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
75 8
|
6月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 &quot;hello world!&quot; 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
91 5
|
10月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
237 63
|
7月前
|
Python API 监控
将Python CLI工具发布为pip模块的完整指南
注册PyPI账户 访问PyPI官网注册账户 推荐使用双因素认证增强安全性 生成API令牌 访问PyPI账户管理 生成具有"Upload packages"权限的令牌,妥善保存 确保模块名唯一性 在PyPI搜索页面验证模块名未被使用 建议使用小写字母和连字符的组合(如my-cli-tool)
129 9
|
10月前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
210 61
|
10月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
10月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。

热门文章

最新文章

推荐镜像

更多