Python 发送邮件

来源:互联网 发布:不亦说乎 不亦悦乎 编辑:程序博客网 时间:2024/05/22 12:17

用Python来发送邮件还是蛮有趣的一件事,python为我们提供了这样一个模块,可以方便的发送电子邮件,先来总结一下

 

1.      SMTP和HTTP类似。都是头里面有一些相关信息,content-type ,encoding等。Message是基类。用字典映射的方式可以读取和设置head中选项的值。MIMEText,MIMEImage,MIMEAudio等MIME类型继承自MIMEBase,MIMEBase继承自Message。他们都没有自己定义方法,都是用Message的。MIMEMultipart可以通过attach添加多个MIME的文件。所以用它添加附件

2.      不同附件文件类型不同,head里面有个Content-Disposition的选项,可以设置文件类型。要上传不同文件类型,就要让python通过mimestypes.guess_type()识别文件类型

3.      读取二进制文件的时候,打开方式要为"rb",因为可能会有和EOF编码相同的字节。这样python认为找到了文件的结尾,停止读入。

4.      lambda: 随时定义一个函数,避免许多单行的函数定义


下面看代码吧

__author__ = 'MrChen'import smtplib, mimetypesfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.image import MIMEImagemsg = MIMEMultipart('alternative')msg['From'] = "xxxxxxxx@163.com"msg['To'] = 'xxxxxxxx@qq.com'msg['Subject'] = 'Email for testing'#添加邮件内容text = MIMEText('content')msg.attach(text)#添加二进制附件fileName = r'C:\Users\a\Pictures\lovewallpaper\001.jpg'#选择你自己的文件fileType, encoding = mimetypes.guess_type(fileName)if fileType is None or encoding is not None:    fileType = 'application/octet-stream'print(fileType, encoding)maintype, subtype = fileType.split('/', 1)att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype)#发送的文件名需要把路径去掉,给别人的邮件没必要让别人看到自己的文件路径att1.add_header('Content-Disposition', 'attachment', filename = fileName[fileName.rfind('\\')+1:])msg.attach(att1)server = smtplib.SMTP()server.connect('smtp.163.com')#163邮箱的SMTP服务器地址server.login('xxxxxxxx@163.com','xxxxxxxx')#输入邮箱用户名和密码server.set_debuglevel(1)server.sendmail('xxxxxxxx@163.com', 'xxxxxxxx@qq.com', msg.as_string())server.quit()print('发送成功')


下面介绍一下SMTP类都有哪些函数吧

 

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

  SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接我们可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件)。该类提供了许多方法,将在下面介绍。它的所有参数都是可选的,其中host参数表示smtp服务器主机名,上面例子中的smtp主机为"smtp.yeah.net";port表示smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数,在初始化的时候会自动调用connect方法去连接服务器。

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

 

SMTP.set_debuglevel(level)

  设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

 

SMTP.connect([host[, port]])

  连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。默认的端口号是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])

  发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。

  如果要发送的邮件内容很复杂,包含图片、视频、附件等内容,按照MIME的格式来拼接字符串,将是一件非常麻烦的事。不用担心,python已经考虑到了这点,它为我们提供了email模块,使用该模块可以轻松的发送带图片、视频、附件等复杂内容的邮件。在介绍完smtplib模块之后,我会简单介绍email模块的基本使用。

 

SMTP.quit()

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

 

下面介绍一下email模块

 

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822的消息文档。使用这些模块来定义邮件的内容,是非常简单的。下面是一些常用的类:

class email.mime.multipart. MIMEMultipart: 多个MIME对象的集合。

class email.mime.audio. MIMEAudio: MIME音频对象。

class email.mime.image. MIMEImage: MIME二进制文件对象。

class email.mime.text. MIMEText: MIME文本对象。

 

 

补充:

 

说下MIME类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

 

在把输出结果传送到浏览器上的时候,浏览器必须启动本机的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header中。

 

例如,架设你要传送一个Microsoft Excel文件到客户端。那么这时的MIME类型就是“application/vnd.ms-excel”。在大多数实际情况中,这个文件然后将传送给Execl来处理(假设我们设定Execl为处理特殊MIME类型的应用程序)。在ASP中,设定MIME类型的方法是通过Response对象的ContentType属性。

 

多媒体文件格式MIME

 

最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。

 

MIME意为多用途Internet邮件扩展,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。

 

每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。

 

常见的MIME类型

 

超文本标记语言文本 .html,.html text/html

普通文本 .txt text/plain

RTF文本 .rtfapplication/rtf

GIF图形 .gif image/gif

JPEG图形 .ipeg,.jpgimage/jpeg

au声音文件 .au audio/basic

MIDI音乐文件 mid,.midiaudio/midi,audio/x-midi

RealAudio音乐文件 .ra, .ramaudio/x-pn-realaudio

MPEG文件 .mpg,.mpegvideo/mpeg

AVI文件 .avivideo/x-msvideo

GZIP文件 .gzapplication/x-gzip

TAR文件 .tarapplication/x-tar


0 0
原创粉丝点击