利用Python发送邮件

相信我们每个人都用过邮箱,虽然其它社交聊天软件已经非常普及,并且这些社交软件大多都具有文件发送的功能,但很多时候我们仍然离不开使用邮箱。这是因为使用社交软件发送文件往往需要添加对方,而使用邮箱则不必担心这个问题。同时邮箱具有群发功能,并且支持HTML页面等,比较方便。并且如果我们使用的操作系统不一样的话,使用社交软件发送文件效果也不太好。本文手把手教你怎么利用Python发送邮件。

邮件发送过程

如果使用Windows没什么问题的话我们往往通过以下几个步骤给别人发送邮件。

小技巧-用Python发送邮件_Python

  • 首先登录邮箱,这个肯定是第一步。

  • 然后确定我们发送邮件的账号,确定是群发还是单发。

  • 添加我们想要发送的内容,一般包括对方信息标题正文附件等等。

  • 添加好发送的内容之后往往需要确认一遍信息。

  • 点击发送,发送成功就完事。

如果没什么问题的话经过这几个步骤就可以成功把邮件发出去了。

实现过程

条件准备:开通邮箱的SMTP功能

以我用的163邮箱为例,登录邮箱后找到如图所示的POP3/SMTP/IMAP栏:

小技巧-用Python发送邮件_Python_02

点击之后到达如下页面:

小技巧-用Python发送邮件_Python_03

要注意的是图中的前两栏:

  • IMAP/SMTP服务

  • POP3/SMTP服务

这两个服务我的邮箱显示已开启,不出意外的话你们的应该是关闭的。然后把这两个服务都开启即可。需要注意的是,在开启IMAP/SMTP服务之后后给你一个密匙,这个密匙只展示一次,所以一定要记好那个密匙,我们发送邮件的时候需要用到。当这两个服务都开启后,我们的条件就准备好了。

模块介绍

在Python中主要有两个和邮件发送相关的模块,分别为:

  • smtplib:这个模块是关于SMTP(简单邮件传输协议)的操作模块,在发送邮件的过程中使用这个模块来和你的发送账户的服务器建立通信。

  • email:这个模块用来编辑添加各种需要发送的内容,比如编辑正文添加附件等。

实现步骤

导入模块

导入需要的模块:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

第一个smtplib模块已经介绍过了。MIMEText是一个用来处理文本内容的模块,比如我们的正文一般是文本内容,我们也会上传文本附件等,它们可以用它来处理。MIMEImage是一个用来处理图像内容的模块,比如我们有时候会上传图片的附件等。MIMEMultipart是一个类,它代表了我们要发送的邮件对象,既然是邮件对象,我们知道邮件中包含了各部分如正文、附件等等,可以把MIMEMultipart理解为一个容器,其它的MIMETextMIMEImage等模块都包含在容器之中。那我们发送邮件的话就可以简单理解为先产生一个容器(邮件),然后把其它东西(正文、附件等)放进去,然后把这个容器发送出去就可以了。

初始化信息

要初始化的信息大概有如下几个:

  • 要与其建立通信关系的服务器:例如我们要使用163邮箱来给其它邮箱发送信息,那我们就需要给163邮箱下指令,让它按照我们的想法做事,因此要与163邮箱的服务器建立通信关系。

  • 登录邮箱的用户名和密匙:这个毋庸置疑,你要发送邮箱当然要登录呀,不过这里登录用到的password不再是你的邮箱密码,而是你开启IMAP/SMTP服务时给你的那串密匙

  • 接受你邮件的目标邮箱:这个可以单个邮箱也可以是一个邮箱列表,也就是说单发或者群发。

这部分代码如下:

# 设置建立通信的服务器信息
email_host = 'stmp.163.com'
# 设置登录邮箱的用户名和密匙
email_user = '你的用户名'
email_pass = '你的密匙'
# 发送邮件的邮箱账户
sender = '你的邮箱账户'    #这个其实就是你的用户名+@163.com
# 接收邮件的邮箱账户
receivers = ['邮箱账户1','邮箱账户2']    #这是一个邮箱列表,可以为1到多个

创建邮件对象

# 创建一个MIMEMultipart对象,这个对象就相当于一封邮件
message = MIMEMultipart()
# 设置发送方
message['From'] = sender
# 设置接收方
message['To'] = ';'.join(receivers)
# 设置邮件主题,也就是大标题,它是一个字符串
message['Subject'] = '我喜欢你'

邮件正文设置

首先对于正文来讲,你可以选择两种格式:文本形式或者HTML格式文本形式实现如下所示:

# 文本形式
content = '你好,我是goldsunC,这是我发送给你的一封情书。'
part1 = MIMEText(content,'plain','utf-8')

# HTML格式
# 因为HTML格式一般比较长,因此我们用读取文件的方法
with open('goldsunC.html','r'as f:
    content = f.read()
part1 = MIMEText(content,'html','utf-8')

如上就是两种正文的实现方法,对应的part1就是我们准备好放入“容器”内的东西了。

添加附件

附件可以选择各种形式如txt文件、图片文件、压缩包文件等等。不过不管是哪种文件,它都是一个文件。哈哈哈是不是有点拗口,既然是文件,我们就需要把它进去。示例如下:

# 添加一个txt附件
with open('text.txt','r'as f:
    content1 = f.read()
part1 = MIMEText(content1,'plain','utf-8')
# 设置其附件类型,便于发送
part1['Content-Type'] = 'application/octet-stream'
part1['Content-Disposition'] = 'attachment;filename="text.txt"'
# 添加一个图片附件
with open('picture.jpg','rb'as f:
    content2 = f.read()
part2 = MIMEImage(content2)
# 设置附件类型
part2['Content-Type'] = 'application/octet-stream'
part2['Content-Disposition'] = 'attachment;filename="picture.jpg"'

其它的附件发送形式类似,基本上只要文件名改改就行了。既然已经准备好了要放进容器内的东西,那现在就把它们放进去:

message.attach(part1)
message.attach(part2)
message.attach(part3)

只需要一个attach方法就可以把准备好的东西放进容器。这个时候一切准备就绪,现在我们就需要和服务器建立通信并发出指令了。

发送邮件

因为发送邮件的时候可能会因为各种各样的异常导致发送失败,例如邮箱把你的邮件当成垃圾邮件。因此我们就需要准备捕获这些异常:

# 与服务器建立通信并发送邮件
try:
    receivers = receivers + [sender]
    email_stmp = smtplib.SMTP()
    email_stmp.connect(mail_host,25)    #请求连接服务器
    email_stmp.login(mail_user,mail_pass)    #登录
    email_stmp.sendmail(sender,receivers,message.as_string())    #发送!
    print('success')
except smtplib.SMTPException as e:
    print('error',e)

注意这段代码中有一行:receivers = receivers + [sender]这不是把邮件接收方加上了发送方吗?为什么要给自己也发一份?原因是不加的话163邮箱会把你的邮件当作垃圾邮件,不过在发的时候给自己也发一份就没事儿了,别问我怎么知道的哈哈哈。

文章来源于goldsunC爱编程 ,作者goldsunC