您的位置:首页 > 编程语言 > Python开发

python学习笔记之使用smtplib模块发送邮件

2018-01-30 18:56 941 查看

本篇记录使用python内置模块email发送邮件的相关知识。

注意事项:本篇使用的是网易邮箱进行的测试

具体代码如下:

基础版本:

import smtplib  #导入smtplib模块

HOST='smtp.163.com' #网易邮箱主机地址
#HOST='smtp.qq.com'#QQ邮箱主机地址

PORT=25#网易邮箱端口号
#PORT=465#QQ邮箱端口号

TO=xxxxxxx@qq.com #收件人邮箱

#TO=[XXXXX@qq.com,xxxxx@qq.com]#给多个收件人发邮件

SUBJECT='This is a test email'#邮件的标题

TEXT='This is a test email!HAHAHAHA!'#邮件的内容

smtp_obj=smtp.SMTP()#创建邮件客户端对象SMTP:传输过程不加密,网易默认

#smtp_obj=smtp.SMTP_SSL()#SMTP_SSL()传输过程加密,QQ邮箱默认

smtp_obj.connect(host=HOST,port=PORT)#通过主机地址HOST以及端口号PORT与QQ邮箱建立连接

result=smtp_obj.login(user=FROM,password='xxxxxx')#用户user就是发件人的邮箱,密码使用授权码!当前创建的邮箱客户端对象属于第三方客户端,要求使用授权码代替密码进行登录验证

print '登录结果:',result

message_content='\n'.join(['From:%s' % FROM, 'To:%s' % TO, 'Subject:%s'
% SUBJECT, '', TEXT])#From: To: Subject:这三个是发送邮件必填参数,且不能修改

smtp_obj.sendmail(from_addr=FROM, to_addrs=TO, msg=message_content)

加强版本:

1.发送纯文本文件

import smtplib
from email.mime.text import MIMEText
HOST='smtp.163.com'
SUBJECT='This is a test email'
FROM='xxxxx@163.com'
TO='xxxxx@qq.com'
#注意给多个发送邮件使用方法与上面不一样
方法一:#TO=['xxxxx@qq.com','xxxx@qq.com']
#TO=','.join(TO)
#email_click.sendmail(from_addr=FROM,to_addrs=TO,msg=message.as_string())该行代码见下文
方法二:#TO='xxxxx@qq.com,xxxx@qq.com'
#email_click.sendmail(from_addr=FROM,to_addrs=TO.split(','),msg=message.as_string())该行代码见下文

#参数:1.发送的消息的内容,MIMEText必须是字符串;2.信息内容的类型,默认是'plain'表示是一个纯文本,没有格式的文本。3.编码方式,默认是ascii编码
message=MIMEText('我爱你','plain','utf-8')
message['From']=FROM
message['To']=TO
message['Subject']=SUBJECT

email_click=smtplib.SMTP()
email_click.connect(HOST,25)
result=email_click.login(FROM,'xxxxx')
print '登录结果:',result
email_click.sendmail(from_addr=FROM,to_addrs=TO,msg=message.as_string())
email_click.quit()

2.发送图片和附件

import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
HOST='smtp.163.com'
SUBJECT='This is a test email'
FROM='xxxx@163.com'
TO=['xxxxx@qq.com','xxxx@qq.com']
TO=','.join(TO)

message=MIMEMultipart()#创建一个带附件的实例
message['From']=FROM
message['To']=TO
message['Subject']=SUBJECT

#注意以下的文件都是存在当前目录中
#添加图片
image_message=MIMEText(open('1.jpg','rb').read(),'base64','utf-8')
image_message['Content-Disposition'] = 'attachment;filename="image1.jpg"'.decode('utf-8').encode('gb18030')
message.attach(image_message)

#添加附件
#将一个xls的excel文档作为邮件的附件进行发送
#读取excel文件时,是以rb的形式读取的,是一个二进制文件内容,对于二进制文件需要设置默认的编码,如果对于二进制文件,没有设置base64编码,则附件的内容就是乱码。
message_xls = MIMEText(open('test.xlsx', 'rb').read(), 'base64', 'utf-8')
#配置附件显示的文件名称,默认使用的是所保存的文件名
#gb18030是xx邮箱默认采用的编码方式,所以需要将附的内容转化为gb18030编码,和xx邮箱保持一致。
message_xls['Content-Disposition'] = 'attachment;filename="test111.xlsx"'.decode('utf-8').encode('gb18030')
message.attach(message_xls)

email_click=smtplib.SMTP()
email_click.connect(HOST,25)
result=email_click.login(FROM,'xxxxx')
print '登录结果:',result
email_click.sendmail(from_addr=FROM,to_addrs=TO,msg=message.as_string())
email_click.quit()

3. 发送HTML格式并且带附件的邮件

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

HOST='smtp.163.com'
SUBJECT='test email'
FROM  = 'xxxx@qq.com'
# TO ='xxxx@qq.com,xxxx@qq.com,xxxx@qq.com'

#创建用于发送邮件内容及附件的对象
#related:使用内嵌资源的形式,用该种形式可以将附件中的图片等嵌入到文本中
message = MIMEMultipart('releted')
#'html',表示发送的内容是html代码
message_html = MIMEText('<h1 style="text-aline:center">恭喜你查收该邮件</h1><span style="color:red">详情如下:</span><br><img src="cid:smail">','html','utf-8')
#将html的文本附件 添加到message附件对象当中
message.attach(message_html)
def add_img(path,image_id):
img_data = open(path,'rb')
message_img = MIMEImage(img_data.read())
# 关闭图片文件
img_data.close()
#指定message_img对象的Content_ID
message_img.add_header('Content-ID',image_id)
return message_img
#将img图片附件也添加到message对象中,放在html文本的img标签中
message.attach(add_img('1.jpg','smail'))
message['From']=FROM
message['To']=TO
message['Subject']=SUBJECT
email_client = smtplib.SMTP_SSL()
email_client.connect(HOST,25)
result=email_client.login(FROM,'xxxxx')
print '登录结果:',result
email_client.sendmail(from_addr=FRO
a1cf
M,to_addrs=TO.split(,'),msg=message.as_string())
email_client.quit()

附:

1.QQ邮箱获取授权码:

第一步:进入账户设置

第二步:开启以下服务,即可获得授权码

2.网易邮箱获取授权码:授权码可以自己设置

疑惑点:

为什么一个可以直接传列表,另一个不可以直接传列表?而是要分割一下?

注:本篇的错误之处,还望指正,多多包涵。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: