smtplib与email模块(实现邮件的发送)

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

1、smtplib模块

smtplib模块定义了一个简单的SMTP客户端,可以用来在互联网上发送邮件。

定义的类有如下:

class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])
class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])
class smtplib.LMTP([host[, port[, local_hostname]]])

还有一些已经定义好的异常
exception smtplib.SMTPException
exception smtplib.SMTPServerDisconnected
exception smtplib.SMTPResponseException
exception smtplib.SMTPSenderRefused
exception smtplib.SMTPRecipientsRefused
exception smtplib.SMTPDataError
exception smtplib.SMTPConnectError
exception smtplib.SMTPHeloError
exception smtplib.SMTPAuthenticationError

这么多已定义的类中,我们最常用的的还是smtplib.SMTP类用法:
  
smtp实例封装一个smtp连接,它支持所有的SMTP和ESMTP操作指令,如果host和port参数被定义,则smtp会在初始化期间自动调用connect()方法,如果connect()方法失败,则会触发SMTPConnectError异常,timeout参数设置了超时时间。在一般的调用过程中,应该遵connetc()、sendmail()、quit()步骤。

smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level):#设置是否为调试模式。默认为False,

SMTP.connect([host[, port]]):#连接到指定的smtp服务器。参数分别表示smpt主机和端口。
# 默认是本机的25端口。也可以写成hostname:port的形式。

 SMTP.docmd(cmd[, argstring]):#向smtp服务器发送指令。可选参数argstring表示指令的参数。

 SMTP.helo([hostname]) :#使用"helo"指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。

 SMTP.has_extn(name):#判断指定名称在服务器邮件列表中是否存在。
 #出于安全考虑,smtp服务器往往屏蔽了该指令。

 SMTP.verify(address) :#判断指定邮件地址是否在服务器中存在。
 #出于安全考虑,smtp服务器往往屏蔽了该指令。

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

 SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :#发送邮件。
 #这里要注意一下第三个参数,msg是字符串,表示邮件。
 #我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。
 #这个格式就是smtp协议中定义的格式。

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

2、email模块

emial模块用来处理邮件消息,其包括的类有:

    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默认值为mixed。boundary是MIMEMultipart的边界,默认边界是可数的。

    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等等。

    class email.mime.message.MIMEMessage(_msg[, _subtype]):#具体的一个message实例,使用方法如下:
    msg=mail.Message.Message()    #一个实例
    msg[‘to‘]=‘[email protected]‘      #发送到哪里
    msg[‘from‘]=‘[email protected]‘       #自己的邮件地址
    msg[‘date‘]=‘2012-3-16‘           #时间日期
    msg[‘subject‘]=‘hello world‘    #邮件主题 

smtplib.SMTP

1、利用smtplib.SMTP发送一份普通文本邮件

import smtplib
from email.mime.text import MIMEText

sender = ‘[email protected]‘  # 发件人邮箱账号
my_pass= ‘gahghfh‘  # 发件人邮箱授权码
receiver="[email protected]" #接收人邮箱
def mail():
    ret = True
    try:
        content = "hello world"# 邮件内容
        msg = MIMEText(content, ‘plain‘, ‘utf-8‘)
        msg[‘From‘] = sender  #发件人邮箱账号
        msg[‘To‘]=receiver
        msg[‘Subject‘] = "Python发送邮件测试"  # 邮件的主题
#创建连接对象并连接到服务器
        server = smtplib.SMTP("smtp.163.com")# 发件人邮箱中的SMTP服务器,端口是25
        server.login(sender, my_pass)# 发件人邮箱账号、授权码
        server.sendmail(sender, receiver, msg.as_string())
        server.quit()  # 关闭连接
    except Exception as e:
        ret = False
        print(e)
    return ret

ret = mail()
if ret:
    print("邮件发送成功")
else:
    print("邮件发送失败")

  ps:使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件

smtplib.SMTP_SSL

利用smtplib.SMTP_SSL发送qq邮件

注意要:发送QQ邮件需建立SSL安全连接。故需将smtplib.SMTP() 改成了smtplib.SMTP_SSL()

class smtplib.SMTP_SSL([host[, port[, local_hostname[, keyfile[, certfile[, timeout]]]]]])
  这是一个派生自SMTP的子类,通过SSL加密的套接字连接(使用此类,您需要使用SSL支持编译的套接字模块)。如果未指定主机,则使用“(本地主机)”。如果省略端口,则使用标准的SMTP-over-SSL端口(465)。 local_hostname和source_address与SMTP类中的含义相同。密钥文件和证书文件也是可选的 - 它们可以包含用于SSL连接的PEM格式的私钥和证书链文件。上下文也是可选的,可以包含SSLContext,是keyfile和certfile的替代方法;如果指定keyfile和certfile都必须为None。

1、发送一个普通文本邮件

QQ邮箱POP3 和 SMTP 服务器地址设置如下:

邮箱 POP3服务器(端口995) SMTP服务器(端口465或587)
qq.com pop.qq.com smtp.qq.com

注:
  1、SMTP服务器需要身份验证。
  2、如果是设置POP3和SMTP的SSL加密方式,则端口如下:
    1)POP3接收邮件服务器(端口995);
    2)SMTP发送邮件服务器(端口465或587)。

另外,用qq邮件服务器发送邮件需要先到邮箱里设开启SMTP/POP3服务。然后获取授权码, 在代码中要填写的密码是这个授权码, 而不是邮箱密码!

import smtplib
from email.mime.text import MIMEText

msg_from = ‘6666666@qq.com‘  # 发送方邮箱
passwd = ‘aczbvlbtrsaadjda‘  # 填入发送方邮箱的授权码
msg_to = ‘888888@qq.com‘  # 收件人邮箱
mail_host="smtp.qq.com" #发送人邮件的stmp服务器
port= 465 #端口号
#邮件
subject = "python邮件测试"  # 主题
content = "Hello World"# 正文
msg = MIMEText(content)
msg[‘Subject‘] = subject
msg[‘From‘] = msg_from
msg[‘To‘] = msg_to
#创建连接对象并连接到服务器
s = smtplib.SMTP_SSL(mail_host,port)  # 邮件服务器及端口号,SMTP_SSL默认使用465端口号,端口号可省略
# 登录服务器
s.login(msg_from, passwd)
try:
    s.sendmail(msg_from, msg_to, msg.as_string())
    print("发送成功")
except s.SMTPException as e:
    print(e)
    print("发送失败")
finally:
    s.quit()
    

2、发送HTML格式的邮件

  在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:

import smtplib
from email.mime.text import MIMEText
msg_from = ‘[email protected]‘  # 发送方邮箱
passwd = ‘qfzgdumpeswjdjic‘  # 填入发送方邮箱的授权码
# tolist=["[email protected]","[email protected]"]
msg_to = "[email protected]" # 收件人邮箱 ,可以一次发给多个人
mail_host="smtp.qq.com" #服务器
port= 465 #端口号
#邮件
subject = "python邮件测试"  # 主题
content = """"
<p>Python 邮件发送测试...</p>
<p><a href="http://www.cnblogs.com/freely/">戳它</a></p>
"""#内容
msg = MIMEText(content,"html",‘utf-8‘)#三个参数:第一个为文本内容,第二个MIME的subtype,设置文本格式,传入‘plain‘,最终的MIME就是‘text/plain‘,第三个 utf-8 设置编码
#plain 页面上原样显示这段代码
msg[‘Subject‘] = subject
msg[‘From‘] =  msg_from
msg[‘To‘] = msg_to
#创建连接对象并连接到
s = smtplib.SMTP_SSL(mail_host,port)  # 邮件服务器及端口号
# 登录服务器
s.login(msg_from, passwd)
try:
    s.sendmail(msg_from,msg_to, msg.as_string())
    print("发送成功")
except Exception as e:
    print(e)
    print("发送失败")
finally:
    s.quit()

附:如何获取授权码?

1、登陆发送方邮箱

2、开启服务

时间: 2024-11-07 00:28:35

smtplib与email模块(实现邮件的发送)的相关文章

Python_使用smtplib和email模块发送邮件

[http://blog.csdn.net/menglei8625/article/details/7721746] SMTP (Simple Mail Transfer Protocol) 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用来接收邮件.大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议.SMTP协议的默认TCP端口号是25. SMTP协

Python3 使用smtplib和email模块发送邮件

SMTP (Simple Mail Transfer Protocol) 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用来接收邮件.大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议.SMTP协议的默认TCP端口号是25. SMTP协议的一个重要特点是它能够接力传送邮件.它工作在两种情况下:一是电子邮件从客户机传输到服务器:二是从某一个服务器传输到另

利用Python imaplib和email模块 读取邮件文本内容及附件内容

#! encoding:utf8 ''' 环境: Win10 64位 Python 2.7.5 参考: http://www.pythonclub.org/python-network-application/email-format http://blog.sina.com.cn/s/blog_4deeda2501016eyf.html ''' import imaplib import email def parseHeader(message): """ 解析邮件首部

Python+request+ smtplib 测试结果html报告邮件发送(下)《六》

配置与实现代码分隔编写,详见如下: 目录结构如下: 1.cfg.ini的配置信息写法如下: [email] ;--------------------------使用腾讯企业邮箱作为发件人的操作如下--------------------- smtp_server = smtp.qq.com Port = 465 Sender = 请写你自己的QQ邮箱 psw = 请写你自己的QQ授权码 Receiver = [email protected] (注:请写你的邮件收件人邮箱) 2.readCon

使用python中的smtplib库,写一个简单的发送qq邮件程序,速成!!

#-*-coding:utf-8-*- import smtplib from  smtplib import SMTP_SSL from email.mime.text import MIMEText from email.header import Header #定义一个字典存储发送和接收,邮箱账号密码主题.内容及编码相关信息 mail_info = {     "from": "[email protected]",  #发件人     "to&q

使用python调用email模块实现附件发送

  摘要:              平时运行一些脚本,需要把结果发送到邮箱,可以用python来处理. 需要模块: import datetime import time import sys import mimetypes import smtplib import email.MIMEMultipart import email.MIMEText from email.mime.text import MIMEText from email.mime.multipart import M

python学习笔记[3]-邮件的发送

本文摘抄自:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html 一.相关模块介绍 发送邮件主要用到了smtplib和email两个模块,这里首先就两个模块进行一下简单的介绍:    1.smtplib模块 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行

python实现邮件的发送

今天尝试实现了利用python,编写程序来发送邮件,以下为实现过程: 一:关于邮件传输的简介 SMTP (Simple Mail Transfer Protocol) 邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器.SMTP协议只能用来发送邮件,不能用来接收邮件.大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议.SMTP协议的默认TCP端口号是25. SMTP协议的一个重要特点是它能够

Python使用SMTP模块、email模块发送邮件

smtplib模块: 主要通过SMTP类与邮件系统进行交互.使用方法如下: 1.实例化一个SMTP对象: s = smtplib.SMTP(邮件服务地址,端口号) s = smtplib.SMTP_SSL(邮件服务地址,端口号) 2.登陆邮件,权限验证: s.login(用户名,密码) 3.发送邮件: s.sendmail(发件人邮箱,收件人邮箱,发送内容) 4.断开连接: s.close() email模块: email模块:支持发送的邮件内容为纯文本.HTML内容.图片.附件.email模块