Python语言技术文档

微信小程序技术文档

php语言技术文档

jsp语言技术文档

asp语言技术文档

C#/.NET语言技术文档

html5/css技术文档

javascript

点击排行

python中使用smtplib和email模块发送邮件实例

来源:中文源码网    浏览:306 次    日期:2024-04-19 11:48:44
【下载文档:  python中使用smtplib和email模块发送邮件实例.txt 】


python中使用smtplib和email模块发送邮件实例
SMTP模块这么多已定义的类中,我们最常用的的还是smtplib.SMTP类,就具体看看该类的用法:smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间。在一般的调用过程中,应该遵connetc()、sendmail()、quit()步骤。
SMTP模块主要方法
下面我们来看看该类的方法:复制代码 代码如下:SMTP.set_debuglevel(level)设置输出debug调试信息,默认不输出调试信息。SMTP.docmd(cmd[, argstring])发送一个command到smtp服务器,SMTP.connect([host[, port]])连接到指定的smtp服务器,默认是本机的25端口。也可以写成hostname:port的形式。SMTP.helo([hostname])使用helo指令向smtp服务器确认你的身份。SMTP.ehlo([hostname])使用ehlo指令向esmtp服务器确认你的身份。SMTP.ehlo_or_helo_if_needed()如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法调用ehlo()或者helo()。SMTP.has_extn(name)判断指定的名称是否在smtp服务器上。SMTP.verify(address)判断邮件地址是否在smtp服务器上存在。SMTP.login(user, password)登陆需要验证的smtp服务器,如果之前没有提供ehlo或者helo指令,则会先尝试ESMTP的ehlo指令。SMTP.starttls([keyfile[, certfile]])使smtp连接运行在TLS模式,所有的smtp指令都会被加密。SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])发送邮件,该方法需要一些邮件地址和消息。SMTP.quit()终止smtp会话并且关闭连接。
经过搜索学习发现网上大多都是用smtp类的sendmail这个方法来发邮件,那就先看看这个例子:
使用sendmail发送邮件复制代码 代码如下:import smtplibimport timefrom email.message import Messagefrom time import sleepimport email.utilsimport base64smtpserver = 'smtp.gmail.com'username = 'username@gmail.com'password = 'password 'from_addr = 'from@gmail.com'to_addr = 'tooooooo@qq.com'cc_addr = 'ccccccccc@qq.com'time = email.utils.formatdate(time.time(),True)message = Message()message['Subject'] = 'Mail Subject'message['From'] = from_addrmessage['To'] = to_addrmessage['Cc'] = cc_addrmessage.set_payload('mail content '+time)msg = message.as_string()sm = smtplib.SMTP(smtpserver,port=587,timeout=20)sm.set_debuglevel(1)sm.ehlo()sm.starttls()sm.ehlo()sm.login(username, password)sm.sendmail(from_addr, to_addr, msg)sleep(5)sm.quit()
Email模块如果想在邮件中携带附件、使用html书写邮件,附带图片等等,就需要使用email模块及其子模块。下面来看看email包,email包是用来管理email信息的,它包括MIME和其他基于RFC 2822的消息格式。email包的主要特征是在它内部解析和生成email信息是分开的模块来实现的。
MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。
邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。在email的包里面包含了很多模块:复制代码 代码如下:email.messageemail.parseremail.generatoremail.mime 创建email和MIME对象email.headeremail.charsetemail.encodersemail.ereorsemail.utilsemail.iterators
主要来看看email.mime,在邮件中携带附件、图片、音频时,主要使用的是该模块。一般情况下,你通过解析一个文件或者一段text来生成一个消息对象结构,你也可以从头开始建立一个消息结构,实际上,你可以给一个已经存在的消息结构追加一个新的消息对象。你可以通过创建message实例来创建一个对象结构,然后给该结构追加附件和头部信息。email包提供了一些子类使得该操作变得很容易。模拟在邮件内容中携带图片,如下:
邮件内容中携带图片复制代码 代码如下:from email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.mime.image import MIMEImageimport smtplibfrom_mail = 'froooooooom@gmail.com'to_mail = 'toooooooooo@qq.com'msg = MIMEMultipart()msg['From'] = from_mailmsg['To'] = to_mailmsg['Subject'] = 'python mail test'body = 'test img send'con = MIMEText('%s' % body,'html')msg.attach(con)img = MIMEImage(file('D:\\10535-102.jpg','rb').read())img.add_header('Content-ID','D:\\10535-102.jpg')msg.attach(img)server = smtplib.SMTP('smtp.gmail.com')server.docmd('ehol','tooooooo@gmail.com')server.starttls()server.login('username@gmail.com','password')server.sendmail(from_mail,to_mail,msg.as_string())server.quit()
邮件中携带附件
发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送模拟在 邮件中携带附件 ,如下:复制代码 代码如下:from email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartimport smtplib#创建一个带附件的实例msg = MIMEMultipart()txt = MIMEText("这是中文的邮件内容哦",'plain','gb2312') msg.attach(txt)#构造附件1att1 = MIMEText(open('d:\\drcom.rar', 'rb').read(), 'base64', 'gb2312')att1["Content-Type"] = 'application/octet-stream'att1["Content-Disposition"] = 'attachment; filename="drcom.rar"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(att1)#构造附件2att2 = MIMEText(open('d:\\123.txt', 'rb').read(), 'base64', 'gb2312')att2["Content-Type"] = 'application/octet-stream'att2["Content-Disposition"] = 'attachment; filename="123.txt"'msg.attach(att2)#加邮件头msg['to'] = 'tooooooo@qq.com'msg['from'] = 'frommmmmmm@gmail.com'msg['subject'] = 'hello world' #发送邮件try: server = smtplib.SMTP() server.connect('smtp.gmail.com') server.starttls() server.login('xxxxx@gmail.com','xxxxxxxxx')#XXX为用户名,XXXXX为密码 server.sendmail(msg['from'], msg['to'],msg.as_string()) server.quit() print '发送成功'except Exception, e: print str(e)

相关内容