在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,python实现发邮件也是基于此基础上进行封装的。

1.python发邮件所需要的基础包

python发送邮件需要用到python自带的两个模块,smtplib和email。直接import导入,无需下载。  python的smtplib提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。

2.smtplib的用法

smtplib用法相对来说很简单,就是分为两步。

创建SMTP的操作对象并连接smtp目标服务器,可以是163、QQ等根据自己的账号登录目标服务器(自己的邮箱地址和邮箱授权码)调用对象中的方法,发送邮件到目标地址

python与smtp服务器之间的具体交互的通用代码:

import smtplib

server = smtplib.SMTP(mailserver, port)  # 发件人邮箱中的SMTP服务器,端口是25

server.login(sender, passwd)  # 发件人邮箱账号、邮箱授权码

# msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。

server.sendmail(sender, receive, msg.as_string())

server.quit()

具体的python连接目标服务器的代码如下:注:本文章用的是qq的smtp服务器。  常用邮箱的smtp服务器地址:  新浪邮箱:smtp.sina.com,搜狐邮箱:smtp.sohu.com,qq邮箱:smtp.qq.com

sender_maile='80617252@qq.com' # 发送方的邮箱地址

sender_pass = 'lsjdfsljdfk' # 邮箱提供的授权码,可在第三方登录,我这个是随便打的。

sftp_obj =smtplib.SMTP('smtp.qq.com', 25)

sftp_obj.login(sender_mail, sender_pass)

#三个参数分别是:发件人邮箱账号,收件人邮箱账号,发送的邮件体

sftp_obj.sendmail(sender_mail, receiver_mail, msg_root.as_string())

sftp_obj.quit()

3.email模块的详细理解和使用

email模块下的mime模块下有常用的三个模块,三个模块中有三个大类。其实就是下边这三个了,说的很绕,下边为导入方式,一目了然。

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

简单说下他们的关系,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片对象,要把多个对象组合起来,就用MIMEMultipart对象,他代表的是整个邮件。这样说应该还不是很清晰,下边就分开来说,最后会总的总结,在最后边就是完整的代码(可以发送一切内容的代码)。

A.MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码。

构造普通文本:

text_info = 'hello world '

text_sub = MIMEText(text_info,'plain', 'utf-8')

构造超文本:

url = "https://blog.csdn.net/chinesepython"

html_info = """

点击以下链接,你会去向一个更大的世界

click me

i am very glasses for you

""" % url

html_sub = MIMEText(html_info, 'html', 'utf-8')

# 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示

html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'

构造base64数据流,用于发送文件的时候使用,构造附件代码:

txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()

txt = MIMEText(txt_file, 'base64', 'utf-8')

txt["Content-Type"] = 'application/octet-stream'

# 命名发送的附件

txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')

B.MIMEImage对象中只需要把读取的文件传入就行

构造图片:

image_file = open(r'D:\python_files\images\test.png', 'rb').read()

image = MIMEImage(image_file)

image.add_header('Content-ID', '')

# 命名发送的图片

image["Content-Disposition"] = 'attachment; filename="red_people.png"'

C.MIMEMultipart对象创建的类型有三种,此模块主要是通过attach方法把上边构造的内容传入到邮件的整体内容中。

邮件类型为”multipart/alternative”的邮件正文中包括纯文本正文(text/plain)和超文本正文(text/html)。邮件类型为”multipart/related”的邮件正文中包括图片,声音等内嵌资源。邮件类型为”multipart/mixed”的邮件包含附件,图片,文本等都可以添加,所以发的内容多的话一般是用这个的,选择mixed类型,什么内容都可以发。

3.邮件头添加内容

直接上示例代码:

from email.mime.multipart import MIMEMultipart

msg_root = MIMEMultipart('mixed')

# 发件人

msg_root['From'] = 'aaa@qq.com'

# 收件人

msg_root['To'] = '666666@qq.com'

# 邮件主题

subject = 'python sendemail test successful'

msg_root['subject'] = Header(subject, 'utf-8')

4.特别的用法说明:

注:以下的msg_root为:  msg_root = MIMEMultipart(‘mixed’)

msg_root.as_string()是将msg_root对象变为str。  msg_root.attach(MIMEText或者MIMEImage对象),因为MIMEMultipart对象代表邮件本身,其他连个是代表邮件正文,所以这个方法还是很强大的,把其他的构造内容添加到MIMEMultipart对象中就可以把文本,html,附件等一起发送了。

5.发送各种内容的具体代码实现:

所有代码合到一块,发送文本,html,图片,txt内容,用的时候你可以把需要的部分摘出来,也就是把没有加入到msg_root的对象拿出来,直接通过下边命令发送,例如只发送文本。  sftp_obj.sendmail(sender_mail, receiver_mail, text_sub.as_string())。

import smtplib

from email.header import Header

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

def send_email_by_qq(to):

sender_mail = '80617252@qq.com'

sender_pass = 'aljflsjdf'#同样是乱打的

# 设置总的邮件体对象,对象类型为mixed

msg_root = MIMEMultipart('mixed')

# 邮件添加的头尾信息等

msg_root['From'] = '80617252@qq.com<80617252@qq.com>'

msg_root['To'] = to

# 邮件的主题,显示在接收邮件的预览页面

subject = 'python sendemail test successful'

msg_root['subject'] = Header(subject, 'utf-8')

# 构造文本内容

text_info = 'hello world'

text_sub = MIMEText(text_info, 'plain', 'utf-8')

msg_root.attach(text_sub)

# 构造超文本

url = "https://blog.csdn.net/chinesepython"

html_info = """

点击以下链接,你会去向一个更大的世界

click me

i am very galsses for you

"""% url

html_sub = MIMEText(html_info, 'html', 'utf-8')

# 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示

html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'

# 把构造的内容写到邮件体中

msg_root.attach(html_sub)

# 构造图片

image_file = open(r'D:\python_files\images\test.png', 'rb').read()

image = MIMEImage(image_file)

image.add_header('Content-ID', '')

# 如果不加下边这行代码的话,会在收件方方面显示乱码的bin文件,下载之后也不能正常打开

image["Content-Disposition"] = 'attachment; filename="red_people.png"'

msg_root.attach(image)

# 构造附件

txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()

txt = MIMEText(txt_file, 'base64', 'utf-8')

txt["Content-Type"] = 'application/octet-stream'

#以下代码可以重命名附件为hello_world.txt

txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')

msg_root.attach(txt)

try:

sftp_obj =smtplib.SMTP('smtp.qq.com', 25)

sftp_obj.login(sender_mail, sender_pass)

sftp_obj.sendmail(sender_mail, to, msg_root.as_string())

sftp_obj.quit()

print('sendemail successful!')

except Exception as e:

print('sendemail failed next is the reason')

print(e)

if __name__ == '__main__':

# 可以是一个列表,支持多个邮件地址同时发送,测试改成自己的邮箱地址

to = '666666@qq.com'

send_email_by_qq(to)

6.总结

为了让不是很理解发邮件的朋友能更好的理解,在这里是把所有的参数都写死了,比如说发送文件的具体内容,在真正开发使用过程中,可以把具体的内容通过预留出来参数去传入之后发送你想要发送的内容。  发邮件功能还是很实用的,在真正的开发中或者大多数场合都能用到,比如说项目中一个重要的模块如果出问题了,你需要第一时间知道,就可以加入这个功能,把项目出问题报的具体内容发到你的邮箱,也可以第一时间想下处理的对策。  下面以我通过此程序发送的邮件内容的截图做结尾吧。

python是什么邮箱_python发邮件详解,smtplib和email模块详解相关推荐

  1. python发邮件详解 -- smtplib和email模块

    文章目录 python发邮件详解,-->smtplib和email模块 1.python发邮件所需要的基础包 2.smtplib的用法 3.email模块的详细理解和使用 A.MIMEText对 ...

  2. python发邮件详解,smtplib和email模块详解

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

  3. python邮件发送哪个好_python发邮件(一)

    复习模块 如果我们要发送邮件,就需要用到smtplib模块的以下方法: 1.import smtplib       #引入smtplib模块 2.server = smtplib.SMTP()    ...

  4. 使用Python登录QQ邮箱发送QQ邮件

    这真是黑科技啊,原来推送的广告邮件就是这样产生的.好人用来发节日贺卡,给女朋友纪念邮件:坏人会学着发广告,垃圾邮件.我希望大家能学会了做些有趣的有意义的事情. 今天我带大家实现下简单的发邮件功能.我们 ...

  5. phpmail通过qq发邮箱失败_PHP中利用PHPMailer配合QQ邮箱实现发邮件

    phpmailer实现给网站用户发送邮件,WordPress好像禁用了mail()函数,也不能直接使用自带的发送邮件,以防止暴露IP PHPMailer的介绍: 可运行在任何平台之上 支持SMTP验证 ...

  6. 邮箱如何发邮件,邮箱如何清理发信,VIP邮箱靓号是什么?

    邮箱如何发邮件,邮箱如何清理发信量,vip邮箱发信量有上限吗?关于上述问题,是我们在发邮件时常遇到的,今天小编给大家整理了相关资料,一起说说吧! 邮箱如何发邮件? 这个问题看你要发多少数量,登陆邮箱点 ...

  7. 安装了email模块还是报错_科普:利用Python smtplib和email模块实现自动发送邮件功能...

    概要 我们都知道SMTP(简单邮件传输协议),是一组用于从原地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP规定电子邮件应该如何格式化.如何加密,以及如何在邮件服务器之间传递.SMT ...

  8. python发送邮件群发_Python发邮件脚本,Python调用163邮箱SMTP服务实现邮件群发

    邮件营销,一个昔日辉煌,如今没落的广告营销方式,曾经的恶意广告邮件群发,到现在还存留着的大站协议群发,可能还是有不少人能够做到正常群发邮件,但大概率很多人都不会点开邮件查看邮件内容吧,除非是很许可的, ...

  9. python发邮件有什么意思_python发邮件要装什么

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理.SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目 ...

最新文章

  1. 懂点 Nginx 反向代理与负载均衡,是面试加分项没有之一
  2. 润乾V5手机报表说明文档
  3. oracle改字体大小_oracle数据库字体大小
  4. mysql数据库的安装
  5. Express全系列教程之(五):Express的中间件
  6. TypeScript里对数组元素的自定义属性排序的实现原理
  7. .NET 运行时设置
  8. JavaScript设计模式-10.工厂模式实例xhr
  9. Oracle 统计信息备份/表分析
  10. WebSocket跨域问题解决
  11. 什么?云数据库也能C位出道?
  12. html选择区域高亮,css+js实现部分区域高亮可编辑遮罩层
  13. Android 四大组件学习之ContentProvider二
  14. 使用软件测试路由器性能报告,路由器软件测试报告.doc
  15. 六年级计算机课件,六年级信息技术上册课件.ppt
  16. react梳理之redux
  17. 利用CA证书配置安全Web站点
  18. 百度西雅图开设AI实验室 总裁张亚勤称AI是时代变革之能
  19. 杰理之优化电脑长时间播放没声音【篇】
  20. 逆向分析CrackMe系列——CrackMe004之注册码算法分析

热门文章

  1. 中国电视企业逆势增长,助推中国制造走向世界
  2. C4996 ‘scanf‘: This function or variable may be unsafe. Consider using scanf_s instead.
  3. 程序人生 - 程序员学习新技术是要看书还是看视频?
  4. Android音视频方向进阶路线及资源合集
  5. 微信调整小程序和公众号流量主收入分成比例
  6. 【代码随想录】-动态规划专题
  7. SDHK_Tool.Dynamic.SD_Motor_Angle 角度旋转电机
  8. web学习笔记——一个简单的HTML
  9. 一款自用的翻译小工具,开源了
  10. html5学习之多媒体播放