首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python发送邮件

python发送邮件

作者头像
爱撒谎的男孩
发布2019-12-31 12:22:37
发布2019-12-31 12:22:37
1K0
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. python发送邮件
    1. 1.1. 准备
      1. 1.1.1. smtplib
    2. 1.2. email
    3. 1.3. 普通文本邮件
    4. 1.4. 发送html邮件
    5. 1.5. 附件的发送
    6. 1.6. 将图片嵌入到正文信息中

python发送邮件

准备

python中发送邮件主要用的是smtplibemail两个模块,下面主要对这两个模块进行讲解 在讲解之前需要准备至少两个测试的邮箱,其中要在邮箱的设置中开启smtplib协议才可以进行发送和接受

smtplib

  • smtplib.SMTP( [host [, port [, local_hostname[,timeout]]]]) hostSMTP主机的服务器,其中163邮箱的是smtp.163.com,其他的可以在网上找到,port是端口号,这里默认的是25local_hostname是你主机的SMTP,如果SMTP在你的本机上,你只需要指定服务器地址为 localhost 即可。timeout是设置的连接的限制时间,如果超过这个时间还没有连接上那么就会出现错误
  • SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。如果设置为1就表示输出调试信息
  • SMTP.connect([host[, port]]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。
  • SMTP.login(user, password) 登录服务器,这里的user是邮箱的用户名,但是这里的password并不是你邮箱的密码,当你开启SMTP的时候会提示你设置一个密码,这里的密码就是对应的密码
  • SMTP.sendmail(from_addr, [to_addrs,], msg[, mail_options, rcpt_options]) 发送邮件,from_addr是发送方也就是你的邮箱地址,to_addr是接受方的地址,当然这里的可以填上多个邮箱账号发送给多个账号,如果有多个账号需要使用列表传递参数
  • SMTP.quit()断开连接

email

emial模块用来处理邮件消息,包括MIME和其他基于RFC 2822的消息文档。使用这些模块来定义邮件的内容,是非常简单的。其包括的类有(更加详细的介绍可见:http://docs.python.org/library/email.mime.html):

  • class email.mime.base.MIMEBase(_maintype, _subtype, **_params):这是MIME的一个基类。一般不需要在使用时创建实例。其中_maintype是内容类型,如text或者image。_subtype是内容的minor type类型,如plain或者gif**_params是一个字典,直接传递给Message.add_header()。
  • class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]MIMEBase的一个子类,多个MIME对象的集合,_subtype默认值为mixedboundaryMIMEMultipart的边界,默认边界是可数的。当需要发送附件的时候使用的就是这个类
  • class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])MIMEMultipart的一个子类。
  • class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])MIME音频对象
  • class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])MIME二进制文件对象。主要用来发送图片

普通文本邮件

  • class email.mime.text.MIMEText(_text[, _subtype[, _charset]])MIME文本对象,其中_text是邮件内容,_subtype邮件类型,可以是text/plain(普通文本邮件),html/plain(html邮件), _charset编码,可以是gb2312等等。
  • 普通文本邮件发送的实现,关键是要将MIMEText_subtype设置为plain。首先导入smtplibmimetext。创建smtplib.smtp实例,connect邮件smtp服务器,login后发送,具体代码如下*
代码语言:javascript
复制
# 一个格式化邮件的函数,可以用来使用
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的邮箱地址
from_password='×××××××'   #你的密码
# to_email='chenjiabing666@yeah.net'
to_email='××××××'    #要发送的邮箱地址

msg=MIMEText('乔装打扮,不择手段','plain','utf-8')  #这里text=乔装打扮,不择手段

msg['From'] = _format_addr(u'Python爱好者 <%s>' % from_addr)  #格式化发件人
msg['To'] = _format_addr(u'管理员 <%s>' % to_email)    #格式化收件人
msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()    #格式化主题

stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30s
server.login(from_addr,from_password)    #登录
server.set_debuglevel(1)        #输出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表

发送html邮件

还是用MIMEText来发送,不过其中的_subType设置成html即可,详细代码如下:

代码语言:javascript
复制
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的邮箱地址
from_password='×××××××'   #你的密码
# to_email='chenjiabing666@yeah.net'
to_email='××××××'    #要发送的邮箱地址
html="""
<p><h1 style="color:red">大家好</h1></p>
"""

msg=MIMEText(html,'html','utf-8')  #这里text=html,设置成html格式的

msg['From'] = _format_addr(u'Python爱好者 <%s>' % from_addr)  #格式化发件人
msg['To'] = _format_addr(u'管理员 <%s>' % to_email)    #格式化收件人
msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()    #格式化主题

stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30s
server.login(from_addr,from_password)    #登录
server.set_debuglevel(1)        #输出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表

附件的发送

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送,具体实力如下:

代码语言:javascript
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的邮箱地址
from_password='×××××××'   #你的密码
# to_email='chenjiabing666@yeah.net'
to_email='××××××'    #要发送的邮箱地址


msg=MIMEMultipart()   #创建实例
text=MIMEText('<h2 style="color:red">陈加兵</h2><br/><p>大家好</p>','html','utf-8')
msg.attach(text)   #添加一个正文信息,这里实在正文中显示的信息

#创建一个文本附件,这里是从指定文本中读取信息,然后创建一个文本信息
att1=MIMEText(open('/home/chenjiabing/文档/MeiZi_img/full/file.txt','rb').read(),'plain','utf-8')
att1["Content-Type"] = 'application/octet-stream'  #指定类型
att1["Content-Disposition"] = 'attachment; filename="123.txt"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)     #向其中添加附件

img_path='/home/chenjiabing/文档/MeiZi_img/full/file.jpg'  #图片路径
image=MIMEImage(open(img_path,'rb').read())     #创建一个图片附件
image.add_header('Content-ID','<0>')   #指定图片的编号,这个会在后面用到
image.add_header('Content-Disposition', 'attachment', filename='test.jpg')        
image.add_header('X-Attachment-Id', '0')
msg.attach(image)    #添加附件


stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30s
server.login(from_addr,from_password)    #登录
server.set_debuglevel(1)        #输出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表

将图片嵌入到正文信息中

代码语言:javascript
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((
        Header(name, 'utf-8').encode(),
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

from_addr='××××××××'   #你的邮箱地址
from_password='×××××××'   #你的密码
# to_email='chenjiabing666@yeah.net'
to_email='××××××'    #要发送的邮箱地址


msg=MIMEMultipart()   #创建实例
html="""
<html>
<head></head>
<body>
<p>下面演示嵌入图片</p>
<section>
<img src='cid:0' style='float:left'/>
<img src='cid:1' style='float:left'/>
</setcion>
</body>
</html>
"""

text=MIMEText('<h2 style="color:red">陈加兵</h2><br/><p>大家好</p>','html','utf-8')
msg.attach(text)   #添加一个正文信息,这里实在正文中显示的信息

#创建一个文本附件,这里是从指定文本中读取信息,然后创建一个文本信息
att1=MIMEText(open('/home/chenjiabing/文档/MeiZi_img/full/file.txt','rb').read(),'plain','utf-8')
att1["Content-Type"] = 'application/octet-stream'  #指定类型
att1["Content-Disposition"] = 'attachment; filename="123.txt"'#这里的filename可以任意写,写什么名字,邮件中显示什么名字
msg.attach(att1)     #向其中添加附件


## 创建一个图片附件
img_path='/home/chenjiabing/文档/MeiZi_img/full/file.jpg'  #图片路径
image=MIMEImage(open(img_path,'rb').read())     #创建一个图片附件
image.add_header('Content-ID','<0>')   #指定图片的编号,
image.add_header('Content-Disposition', 'attachment', filename='test.jpg')        
image.add_header('X-Attachment-Id', '0')
msg.attach(image)    #添加附件

#创建第二个图片附件
img_path_1='/home/chenjiabing/文档/MeiZi_img/full/test.jpg'  #图片路径
image1=MIMEImage(open(img_path,'rb').read())     #创建一个图片附件
image1.add_header('Content-ID','<1>')   #指定图片的编号,这个就是在上面对应的cid:1的那张图片,因此这里的编号一定要对应
image1.add_header('Content-Disposition', 'attachment', filename='img.jpg')        
image1.add_header('X-Attachment-Id', '0')
msg1.attach(image)    #添加附件



stmp='smtp.163.com'
server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30s
server.login(from_addr,from_password)    #登录
server.set_debuglevel(1)        #输出所有的信息
server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • python发送邮件
    • 准备
      • smtplib
    • email
    • 普通文本邮件
    • 发送html邮件
    • 附件的发送
    • 将图片嵌入到正文信息中
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档