Python 发送Email

来源:互联网 发布:淘宝二手威图手机 编辑:程序博客网 时间:2024/05/19 18:10

这里介绍smtplib模块来实现发送Email,smtplib模块是python中smtp(简单邮件传输协议)的客户端实现。来看一个简单的代码:

'''
Created on 2010-9-26
 
@author: www.leyond.info
'''
import smtplib
from email.mime.text import MIMEText
 
fromaddr = 'from@gmail.com'
toaddrs  = 'to@qq.com'
msg = MIMEText('hello world')
msg['Subject'] = 'I miss you'
msg['From'] = 'from@gmail.com'
msg['To'] = 'to@qq.com'
 
# Credentials (if needed)
username = 'fromName'
password = 'password'
 
# The actual mail send
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg.as_string())
server.quit()

就这么简单。简要看看几个简单的函数:

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

SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。

SMTP.login(user, password) :登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。详细见代码中msg内容。但是这里只是发送文本,如果发送附件,比如文本、视频等,需要使用python为我们提供的email模块(后续介绍)。

SMTP.quit() :断开与smtp服务器的连接,相当于发送”quit”指令。

如果想要群发又如何呢?看看源码:

import smtplib
from email.mime.text import MIMEText
#############
 
mailto_list=["to1@gmail.com","to2@yeah.net"]
#####################
 
mail_host="smtp.163.com"
mail_user="from"
mail_pass="li90"
mail_postfix="163.com"
######################
def send_mail(to_list,sub,content):
    '''
    to_list: hello
    sub:Test
    content: I love you baby
    send_mail("aaa@126.com","sub","content")
    '''
    me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content)
    msg['Subject'] = sub
    msg['From'] = me
    msg['To'] = ";".join(to_list)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me, to_list, msg.as_string())
        s.close()
        return True
    except Exception, e:
        print str(e)
        return False
if __name__ == '__main__':
    if send_mail(mailto_list,"Mail From leyond.info","welcome"):
        print "OK"
    else:
        print "Fail"


Python发送带附件的Email

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

  1. email.mime.multipart. MIMEMultipart: 多个MIME对象的集合
  2. email.mime.audio. MIMEAudio: MIME音频对象。
  3. email.mime.image. MIMEImage: MIME二进制文件对象。
  4. email.mime.text. MIMEText: MIME文本对象

通过上面几个类,我们来看一个发送带附件的Email例子,这样有助于理解,代码来自JGood的python模块学习,你同时也可以参考Send email with attachment(s) in Python这篇文章。

两篇代码都极为类似:

#coding=gbk  
import smtplib, mimetypes  
from email.mime.text import MIMEText  
from email.mime.multipart import MIMEMultipart  
from email.mime.image import MIMEImage  
   
msg = MIMEMultipart()  
msg['From'] = "from@yeah.net" 
msg['To'] = 'to@21cn.com' 
msg['Subject'] = 'email for tesing' 
   
#添加邮件内容  
txt = MIMEText("这是邮件内容~~")  
msg.attach(txt)  
    
#添加二进制附件  
fileName = r'e:\PyQt4.rar' 
ctype, encoding = mimetypes.guess_type(fileName)  
if ctype is None or encoding is not None:  
    ctype = 'application/octet-stream' 
maintype, subtype = ctype.split('/', 1)  
att1 = MIMEImage((lambda f: (f.read(), f.close()))(open(fileName, 'rb'))[0], _subtype = subtype)  
att1.add_header('Content-Disposition', 'attachment', filename = fileName)  
msg.attach(att1)  
    
#发送邮件  
smtp = smtplib.SMTP()  
mtp.connect('smtp.yeah.net:25')  
smtp.login('from', '密码')  
smtp.sendmail('from@yeah.net', 'to@21cn.com', msg.as_string())  
smtp.quit()  
print '邮件发送成功'


原创粉丝点击