python中使用smtplib和email模块发送邮件实例
SMTP模块 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 smtplib import time from email.message import Message from time import sleep import email.utils import base64 smtpserver = '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_addr message['To'] = to_addr message['Cc'] = cc_addr message.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模块 MIME消息由消息头和消息体两大部分组成,在邮件里就是邮件头和邮件体。邮件头与邮件体之间以空行进行分隔。 邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。 邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed,multipart/related和multipart/alternative。 复制代码 代码如下: email.message email.parser email.generator email.mime 创建email和MIME对象 email.header email.charset email.encoders email.ereors email.utils email.iterators 主要来看看email.mime,在邮件中携带附件、图片、音频时,主要使用的是该模块。一般情况下,你通过解析一个文件或者一段text来生成一个消息对象结构,你也可以从头开始建立一个消息结构,实际上,你可以给一个已经存在的消息结构追加一个新的消息对象。你可以通过创建message实例来创建一个对象结构,然后给该结构追加附件和头部信息。email包提供了一些子类使得该操作变得很容易。 邮件内容中携带图片 复制代码 代码如下: from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage import smtplib from_mail = 'froooooooom@gmail.com' to_mail = 'toooooooooo@qq.com' msg = MIMEMultipart() msg['From'] = from_mail msg['To'] = to_mail msg['Subject'] = 'python mail test' body = 'test img send' con = MIMEText('<b>%s</b> <img alt="" src="cid:D:10535-102.jpg" /> ' % 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 MIMEText from email.mime.multipart import MIMEMultipart import smtplib #创建一个带附件的实例 msg = MIMEMultipart() txt = MIMEText("这是中文的邮件内容哦",'plain','gb2312') msg.attach(txt) #构造附件1 att1 = 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) #构造附件2 att2 = MIMEText(open('d:123.txt','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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |