python发送电子邮件模块smtplib初探

python struggling 2182次浏览 0个评论

u=2424262100,643537951&fm=21&gp=0

python的smtplib模块是一个强大的电子邮件处理模块,Python 2.3或更高版本默认自带smtplib模块,无需额外安装。

SMTP类定义:smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]),作为SMTP的构造函数,功能是与smtp服务器建立连接,在连接成功后,就可以向服务器发送相关请求,比如登录、校验、发送、退出等。host参数为远程smtp主机地址,比如smtp.163.com;port为连接端口,默认为25;local_hostname的作用是在本地主机的FQDN(完整的域名)发送HELO/EHLO(标识用户身份)指令,timeout为连接或尝试在多少秒超时。SMTP类具有如下方法:

SMTP.connect([host[, port]])方法,连接远程smtp主机方法,host为远程主机地址,port为远程主机smtp端口,默认25,也可以直接使用host:port形式来表示,例如:SMTP.connect(“smtp.163.com”,“25”)。

SMTP.login(user, password)方法,远程smtp主机的校验方法,参数为用户名与密码,如SMTP.login(“python_2014@163.com”,“sdjkg358”)。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])方法,实现邮件的发送功能,参数依次为是发件人、收件人、邮件内容,例如:SMTP.sendmail(“python_2014@163.com”,“demo@domail.com”,body),其中body内容自定义。

SMTP.starttls([keyfile[, certfile]])方法,启用TLS(安全传输)模式,所有SMTP指令都将加密传输,例如使用gmail的smtp服务时需要启动此项才能正常发送邮件,如SMTP.starttls()。

SMTP.quit()方法,断开smtp服务器的连接。

MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)作为一种新的扩展邮件格式支持在邮件主体中会包含HTML、图像、声音以及附件格式等。

下面介绍几个Python中常用的MIME实现类:

email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]),作用是生成包含多个部分的邮件体的MIME对象,参数_subtype指定要添加到”Content-type:multipart/subtype”报头的可选的三种子类型,分别为mixed、related、alternative,默认值为mixed。定义mixed实现构建一个带附件的邮件体;定义related实现构建内嵌资源的邮件体;定义alternative则实现构建纯文本与超文本共存的邮件体。

email.mime.audio.MIMEAudio (_audiodata[, _subtype[, _encoder[, **_params]]]),创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。

email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。

email.mime.text.MIMEText (_text[, _subtype[, _charset]]),创建包含文本数据的邮件体,_text是包含消息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。

下面以示例进行说明,以下都是在python3下测试过:

1,纯文本格式的邮件

<code>
#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.text import MIMEText

'''
    发送纯文本格式的邮件
    www.tianfeiyu.com 
'''

From = 'xxxxxx@163.com'    
To = 'xxxxxx@qq.com'         
subject = 'python email test'   
username = 'xxxxxx@163.com'    #邮箱用户名
password = 'xxxxxx'              #邮箱密码
                                    #邮件内容
msg = MIMEText('''                  
        你好, 这是一封自动发送的邮件。 
        www.tianfeiyu.com     
''') 

msg['Subject'] = subject        #邮件主题
msg['From'] = From              #发件人,邮件头部可见
msg['To'] = To                  #收件人,邮件头部可见

try:
    smtp = smtplib.SMTP()           #创建一个smtp对象
    smtp.connect('smtp.163.com')    #通过connect方法连接smtp主机    
    #smtp.starttls()                #启动安全传输模式,使用gmail需要
    #smtp.set_debuglevel(1)         #打印出和SMTP服务器交互的所有信息
    smtp.login(username, password)  #邮件账号登录校验
    smtp.sendmail(From, To, msg.as_string())    #邮件发送
    smtp.quit()                     #断开smtp连接
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))

</code>

2,html格式的邮件

<code>
#!/usr/bin/python
#coding: utf-8
import smtplib
from email.mime.text import MIMEText

'''
    定义html格式并进行邮件群发
    www.tianfeiyu.com 
'''

From = 'xxxxxx@163.com'    
To = [ 'xxxxxx@qq.com', 'xxxxxx@qq.com' ]         #定义群组
subject = 'python email test'   
username = 'xxxxxx@163.com'    
password = 'xxxxxx'  
msg = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8') #html格式
msg['Subject'] = subject 
msg['From'] = From 
for to in To:   
    msg[to] = to
    
    try:
        smtp = smtplib.SMTP()
        smtp.connect('smtp.163.com')
        smtp.login(username, password)
        smtp.sendmail(From, To, msg.as_string())
        smtp.quit()
        print('邮件发送成功!')
    except Exception as e:
        print('邮件发送失败!'+str(e))
</code>

3,带图片的邮件

<code>
#!/usr/bin/python
#coding: utf-8 

'''
    带图片的邮件
    www.tianfeiyu.com 
'''
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

From = 'xxxxxx@163.com'    
To = 'xxxxxx@qq.com'         
subject = 'python email test'   
username = 'xxxxxx@163.com'   
password = 'xxxxxx'  

msg = MIMEMultipart('related')  #默认为fixed,创建MIMEMutipart对象,采用related定义的内嵌资源的邮件体 
msgtxt = MIMEText('</pre><h1>你好</h1><pre>','html','utf-8') 
msg.attach(msgtxt)
msg['Subject'] = subject 
msg['From'] = From    
msg['To'] = To

fp = open('/tmp/centos.jpg','rb')
msgimage = MIMEImage(fp.read())
fp.close() 
msgimage.add_header('Content-ID','')  #指定图片文件的Content-ID,<img>标签src用到,此处为空
msg.attach(msgimage)

try:
    smtp = smtplib.SMTP()
    smtp.connect('smtp.163.com')
    smtp.login(username, password)
    smtp.sendmail(From, To, msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))

</code>

4,带附件的邮件

<code>
#!/usr/bin/python
#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

'''
    带附件(图片和文件)的邮件
    www.tianfeiyu.com
'''

From = 'xxxxxx@163.com'    
To = 'xxxxxx@qq.com'         
subject = 'python email test'   
username = 'xxxxxx@163.com'   
password = 'xxxxxx'  

msg = MIMEMultipart('related')  #默认为fixed,创建MIMEMutipart对象,采用related定义的内嵌资源的邮件体 
html = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8')  #html格式 
msg.attach(msgtxt)
msg['Subject'] = subject 
msg['From'] = From    
msg['To'] = To

image = MIMEText(open('/tmp/centos.jpg','rb').read(),'base64','utf-8')
image["Content-Type"] = 'application/octet-stream'   #指定文件格式类型
image["Content-Disposition"] = 'attachment; filename="centos.jpg"'  #指定Content-Disposition值为
                                                #attachment则出现下载保存对话框,保存的默认文件名使用
                                                #filename指定
image["Content-Disposition"] = 'attachment; filename="file"'                                                
msg.attach(image)

try:
    smtp = smtplib.SMTP()
    smtp.connect('smtp.163.com')
    smtp.login(username, password)
    smtp.sendmail(From, To, msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))

</code>

5,多种格式混合都包含的

<code>
#!/usr/bin/python
#coding:utf-8

'''
    包含各种元素的邮件
    www.tianfeiyu.com
'''

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

From = 'xxxxxx@163.com'    
To = 'xxxxxx@qq.com'         
subject = 'python email test'   
username = 'xxxxxx@163.com'   
password = 'xxxxxx'  

msg = MIMEMultipart('alternative')

text = MIMEText('你好,我是田飞雨! www.tianfeiyu.com','plain','utf-8') #文件格式
html = MIMEText('<h1>你好,我是田飞雨!<br/>www.tianfeiyu.com</h1>','html','utf-8')  #html格式 
msg.attach(text)
msg.attach(html)

msg['From'] = From
msg['To'] = To
msg['subject'] = subject

file = MIMEText(open('/tmp/file','rb').read(),'base64','utf-8') #文件附件
file['Content-Type'] = 'application/octet-stream'
file['Content-Disposition'] = 'attachment;filename=file'

image = MIMEImage(open('/tmp/centos.jpg','rb').read()) #图片
image.add_header('Content-ID','')
msg.attach(file)
msg.attach(image)

try:
    smtp = smtplib.SMTP()
    smtp.connect('smtp.163.com','25')
    smtp.login(username,password)
    smtp.sendmail(From,To,msg.as_string())
    smtp.quit()
    print('邮件发送成功!')
except Exception as e:
    print('邮件发送失败!'+str(e))
</code>

DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址