首页 > 编程语言 > 详细

Python发邮件

时间:2019-11-28 12:00:18      阅读:85      评论:0      收藏:0      [点我收藏+]

前言

 

本篇博客展示了通过Python发邮件,包括通过selenium自动登录163发邮件、通过Django发邮件、通过SMTP发邮件。
但,只求会用,所以仅是示例,不会有太多的说明........

通过selenium自动登录163发邮件

 

参考另一篇

通过Django发邮件

 

参考另一篇

通过SMTP发邮件

 

首先要了解几个协议:

  • SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。它定义了邮件客户端和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
  • POP3(Post Office Protocol),邮局协议,它定义了邮件客户端软件和POP3邮件服务器的通信规则。
  • IMAP(Internet Message Access Protocol),消息访问协议,它是POP3协议的一种扩展。
  • Exchange Server 是微软公司的一套电子邮件服务组件,是个消息与协作系统。 简单而言,Exchange server可以被用来构架应用于企业、学校的邮件系统。
  • CardDAV是一种通讯录同步的开放协议。使用 CardDAV 同步的通讯录可以编辑、修改或者删除,并且你在手机上的这些操作也同样会和服务器同步,并同时同步到你的其他设备上。

下图演示了用户A从QQ邮箱发送邮件到用户B的163邮箱的过程:
技术分享图片

Python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。

一般的,可以在本地搭建支持SMTP的服务,如sendmail,但为了省事,可以使用其他的邮件服务商的SMTP服务访问,如QQ、网易等。

这里以QQ邮箱为例,首先要拿到授权码,这里登录你的QQ邮箱,在设置中,选择账号选项,下拉到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务项,获取授权码。
技术分享图片
有了授权码,开干!

发送普通文本邮件

 

代码示例:

技术分享图片
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 获取授权码
sender = 1206180814@qq.com  # 发件人账号
receivers = [1206180814@qq.com]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
send_content = Python 邮件发送测试...
message = MIMEText(send_content, plain, utf-8)  # 第一个参数为邮件内容,第二个设置文本格式,第三个设置编码
message[From] = Header("我是发件人", utf-8)  # 发件人
message[To] = Header("我是收件人", utf-8)   # 收件人

subject = 邮件大标题
message[Subject] = Header(subject, utf-8)
try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")
View Code

运行结果如下:

技术分享图片

发送HTML格式邮件

 

授权码都不变,只需将MIMEText的第二个参数的文本类型改一下即可:

技术分享图片
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = 1206180814@qq.com
receivers = [1206180814@qq.com]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
send_content = """
<h1>天不生我李淳罡</h1>
<h1>剑道万古如长夜</h1>
<p>小二上酒</p>
<img src="https://ss0.baidu.com/73t1bjeh1BF3odCf/it/u=858168512,2130327819&fm=85&s=2E4020DF1CD035FBDC9D940A0300F0F3">
<div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
"""
message = MIMEText(send_content, html, utf-8)  # 第一个参数为邮件内容
message[From] = Header("我是发件人", utf-8)  # 发件人
message[To] = Header("我是收件人", utf-8)  # 收件人

subject = 雪中悍刀行
message[Subject] = Header(subject, utf-8)

try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")

except smtplib.SMTPException:
    print("Error: 无法发送邮件")
View Code

运行结果展示:

技术分享图片

发送HTML中带本地图片的邮件

 

上一个示例中的图片,是一个远程连接,那么要发送本地的图片,就要采用下面的方式了:

技术分享图片
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = 1206180814@qq.com
receivers = [1206180814@qq.com]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEMultipart(related)
message[From] = Header("我是发件人", utf-8)  # 发件人
message[To] = Header("我是收件人", utf-8)  # 收件人

subject = 雪中悍刀行--本地图片版
message[Subject] = Header(subject, utf-8)

msg = MIMEMultipart(alternative)
message.attach(msg)


send_content = """
<h1>天不生我李淳罡</h1>
<h1>剑道万古如长夜</h1>
<p>小二上酒</p>
<img src="cid:image">
<div>阅读请&nbsp;<a href="https://www.37zw.net/0/761/">点我,点我</a></div>
"""
msg.attach(MIMEText(send_content, html, utf-8))  # 第一个参数为邮件内容

# 读取当前目录下的图片
f = open(img.jpg, rb)
img_msg = MIMEImage(f.read())
f.close()

# 定义图片在HTML文本中的位置
img_msg.add_header(Content-ID, <image>)   # 根据id定位
message.attach(img_msg)


try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")

except smtplib.SMTPException:
    print("Error: 无法发送邮件")
View Code

运行结果:

技术分享图片

发送带各式类型附件的邮件

 

发送带附件的邮件,首先要创建MIMEMultipart实例,然后在构建附件,如果有多个附件的话,可依次构建,最后利用smtplib.smtp发送:

技术分享图片
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = 1206180814@qq.com
receivers = [1206180814@qq.com]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 创建一个带附件的实例
message = MIMEMultipart()
message[From] = Header("我是发件人", utf-8)  # 发件人
message[To] = Header("我是收件人", utf-8)   # 收件人

subject = Python发送带附件的邮件示例
message[Subject] = Header(subject, utf-8)

# 邮件正文内容
send_content = hi man,你收到附件了吗?
content_obj = MIMEText(send_content, plain, utf-8)  # 第一个参数为邮件内容
message.attach(content_obj)

# 构造附件1,发送当前目录下的 t1.txt 文件
att1 = MIMEText(open(t1.txt, rb).read(), base64, utf-8)
att1["Content-Type"] = application/octet-stream
# 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字
att1["Content-Disposition"] = attachment; filename="t1.txt"
message.attach(att1)

# 构造附件2,发送当前目录下的 t2.py 文件
att2 = MIMEText(open(t2.py, rb).read(), base64, utf-8)
att2["Content-Type"] = application/octet-stream
att2["Content-Disposition"] = attachment; filename="t2.py"
message.attach(att2)
try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")

except smtplib.SMTPException:
    print("Error: 无法发送邮件")
View Code

运行结果如下:

技术分享图片

 

如果要发送其他类型的,如果PDF、doc、xls、MP3格式的,都可以通过MIMEApplication来完成,MIMEApplication默认子类型是application/octet-stream,而application/octet-stream表明这是个二进制文件,但愿接收方知道怎么处理!!!,然后客户端收到这个声明后会根据文件扩展名来猜测。

技术分享图片
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header

# 第三方 SMTP 服务
mail_host = "smtp.qq.com"  # 设置服务器
mail_user = "1206180814@qq.com"  # 用户名
mail_pass = "dfpcglacrjbybafa"  # 口令

sender = 1206180814@qq.com
receivers = [1206180814@qq.com]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 创建一个带附件的实例
message = MIMEMultipart()
message[From] = Header("我是发件人", utf-8)  # 发件人
message[To] = Header("我是收件人", utf-8)   # 收件人

subject = Python发送带附件的邮件示例
message[Subject] = Header(subject, utf-8)

# 邮件正文内容
send_content = hi man,你收到附件了吗?
content_obj = MIMEText(send_content, plain, utf-8)  # 第一个参数为邮件内容
message.attach(content_obj)

# 构造附件1,发送当前目录下的 t1.txt 文件
part1 = MIMEApplication(open(t1.txt, rb).read())
part1.add_header(Content-Disposition, attachment, filename=t1.txt)
message.attach(part1)


# 构造附件2,发送当前目录下的 bg.mp3 文件
part2 = MIMEApplication(open(bg.mp3, rb).read())
part2.add_header(Content-Disposition, attachment, filename=bg.mp3)
message.attach(part2)


# 构造附件3,发送当前目录下的 t3.xls 文件
part3 = MIMEApplication(open(t3.xls, rb).read())
part3.add_header(Content-Disposition, attachment, filename=t3.xls)
message.attach(part3)

# 构造附件4,发送当前目录下的 t4.doc 文件
part4 = MIMEApplication(open(t4.doc, rb).read())
part4.add_header(Content-Disposition, attachment, filename=t4.doc)
message.attach(part4)


# 构造附件5,发送当前目录下的 t5.pdf 文件
part5 = MIMEApplication(open(t5.pdf, rb).read())
part5.add_header(Content-Disposition, attachment, filename=t5.pdf)
message.attach(part5)

# 构造附件6,发送当前目录下的 img.jpg 文件
part6 = MIMEApplication(open(img.jpg, rb).read())
part6.add_header(Content-Disposition, attachment, filename=img.jpg)
message.attach(part6)

try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")

except smtplib.SMTPException:
    print("Error: 无法发送邮件")
View Code

结果如下:

技术分享图片

see also:Python SMTP发送邮件 | python - 发送带各种类型附件的邮件

Python发邮件

原文:https://www.cnblogs.com/sundawei7/p/11948961.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!