文档章节

python模块学习 ---- smtplib 邮件发送

taote
 taote
发布于 2013/05/08 11:04
字数 1414
阅读 207
收藏 1

    在基于互联网的应用中,程序经常需要自动地发送电子邮件。如:一个网站的注册系统会在用户注册时发送一封邮件来确认注册;当用户忘记登陆密码的时候,通过邮件来取回密码。smtplib模块是python中smtp(简单邮件传输协议)的客户端实现。我们可以使用smtplib模块,轻松的发送电子邮件。下面的例子用了不到十行代码来发送电子邮件:

#coding=gbk

import smtplib 

smtp = smtplib.SMTP() 
smtp.connect("smtp.yeah.net", "25") 
smtp.login('用户名', '密码') 
smtp.sendmail('from@yeah.net', 'to@21cn.com', 'From: from@yeah.net/r/nTo: to@21cn.com/r/nSubject: this is a email from python demo/r/n/r/nJust for test~_~') 
smtp.quit()

这个例子够简单吧^_^!下面详细介绍stmplib模块中的类和方法。

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

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

SMTP.set_debuglevel(level)

  设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。

SMTP.connect([host[, port]])

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

SMTP.docmd(cmd[, argstring])

  向smtp服务器发送指令。可选参数argstring表示指令的参数。下面的例子完全通过调用docmd方法向服务器发送指令来实现邮件的发送(在smtp.yeah.net邮件服务器上试验通过。其他邮件服务器没有试过):

import smtplib, base64, time
userName = base64.encodestring('from').strip()
password = base64.encodestring('password').strip()
smtp = smtplib.SMTP()
smtp.connect("smtp.yeah.net:25")
print smtp.docmd('helo', 'from')
print smtp.docmd('auth login')
print smtp.docmd(userName)
print smtp.docmd(password)
print smtp.docmd('mail from:', '<from@yeah.net>')
print smtp.docmd('rcpt to:', '<from@yeah.net>')
#data 指令表示邮件内容
print smtp.docmd('data')
print smtp.docmd('''from: from@yeah.net
to: from@yeah.net
subject: subject
email body
.
''')
smtp.quit()

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协议中定义的格式。在上面的例子中,msg的值为:

'''From: from@yeah.net
To: to@21cn.com
Subject: test

just for test'''

这个字符串的的意思表示邮件发件人为"from@yeah.net",收件人为" to@21cn.com",邮件标题为"test",邮件内容为"just for test"。细心的你可能会疑问:如果要发送的邮件内容很复杂,包含图片、视频、附件等内容,按照MIME的格式来拼接字符串,将是一件非常麻烦的事。不用担心,python已经考虑到了这点,它为我们提供了email模块,使用该模块可以轻松的发送带图片、视频、附件等复杂内容的邮件。在介绍完smtplib模块之后,我会简单介绍email模块的基本使用。

SMTP.quit()

  断开与smtp服务器的连接,相当于发送"quit"指令。

email及其相关子模块

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

class email.mime.multipart. MIMEMultipart: 多个MIME对象的集合。

class email.mime.audio. MIMEAudio: MIME音频对象。

class email.mime.image. MIMEImage: MIME二进制文件对象。

class email.mime.text. MIMEText: MIME文本对象。

  看上面的解释可能会觉得云里雾里,其实我对smtp, MIME的理解也很肤浅。但在大多数时候,我们只要会用就可以了。下面是一个简单的例子来演示如何使用这些类来发送带附件的邮件:

#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()
smtp.connect('smtp.yeah.net:25')
smtp.login('from', '密码')
smtp.sendmail('from@yeah.net', 'to@21cn.com', msg.as_string())
smtp.quit()
print '邮件发送成功'
是不是很简单。简单就是美,用最少的代码把问题解决,这就是Python。更多关于smtplib的信息,请参考Python手册  smtplib 模块。

本文转载自:http://blog.csdn.net/jgood/article/details/4329532

taote
粉丝 43
博文 74
码字总数 21848
作品 0
闵行
高级程序员
私信 提问
Python发送邮件——yagmail模块(0605)

一、使用Python的第三方库 yagmail模块 发送邮件(本文以 QQ 邮箱示例) 1、通过Python的 yagmail模块发送邮件的前提: 开启SMTP服务、开通第三方授权(需要手机短信验证、QQ安全中心验证等)...

python初雪之路
2018/06/05
0
0
邮件--import--smtplib

-- --import------import smtplib 模块---python邮件---------------------------------------------------------------------------- -- --12.4-------------import------import imaplib 模......

liapple6
2018/10/28
0
0
python 利用smtplib发邮件

!/usr/bin/env python import smtplib TO = "to**@sina.com" FROM = "from**@qq.com" PSW = "**" Serveraddr = "smtp.qq.com" msg = ["From: %s"% FROM, "To: %s"% TO, "Subject: just for t......

charlesdong1989
2012/03/19
0
0
[Python] 发送Email (可发HTML,附件)

在Python里我们可以使用smtplib模块发送email,smtp(Simple Mail Transfer Protocal),是简单邮件传输协议,通过它可以和smtp server进行通讯。 smtplib的一个简单例子 首先你要获得邮件服务...

长平狐
2013/06/03
2.2K
0
python的smtplib

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 smtp协议的基本命令包括: HELO 向服务器标识用户身份 MAIL 初始化邮件传输 mail from: RCPT 标识单个...

AlphaJay
2013/04/17
0
1

没有更多内容

加载失败,请刷新页面

加载更多

springmvc java对象转json,上传下载(未完)拦截器Interceptor以及源码解析(未完待续)

package com.atguigu.my.controller;import java.util.Collection;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Contr......

architect刘源源
今天
26
0
[日更-2019.5.24、25、26] Android系统中的Binder通信机制分析(一)--servicemanager

声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得去年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾... 最近,刚好在做...

Captain_小馬佩德罗
昨天
24
0
聊聊dubbo的DataStore

序 本文主要研究一下dubbo的DataStore DataStore dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java @SPI("simple")public interface DataStore { ......

go4it
昨天
3
0
17.windows上安装kafka并简单应用

参考:https://blog.csdn.net/yao8513277/article/details/81116718 1.单机版 1.1 安装jdk 略 1.2 安装zookeeper https://my.oschina.net/springMVCAndspring/blog/3045210 1.3 安装window上......

20190513
昨天
2
0
缓存雪崩

缓存雪崩原因:大批次的缓存数据,同一时刻过期 解决方案: 1、尽可能避免所有缓存在同一时刻过期,即:合理调整过期策略 2、对条件加锁 伪代码: public ProductselectProduct(String id){ ...

少年已不再年少
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部