SMTP和POP3

SMTP是Simple Mail Transfer Protocol(简单邮件传输协议)的缩写,它是一个internet标准。SMTP提供了一个将信息投递到邮箱的技术,但是它没有定义从邮箱中得到已存在信息的技术。SMTP用于发送邮件,POP3(Post Office Protocol Version3)用于得到邮件,它们都是基于行的。

1、发送一个SMTP信息
首先,我们将用Python去用SMTP协议去发送一个简单的信息。这个信息包括了最少数量的信息头、一个简单的ACSII信息体、没有附件。按照RFC-822,信息的格式包括:一个信息头列表、后跟一空行、随后是信息体。
为了完成这个任务,我们将使用一个Python模块smtplib。这个模块包含了一个单一的类SMTP,它管理与SMTP服务器的连接和提供与服务器交互的方法。SMTP类提供了如下方法:
server=smtplib.SMTP('smtp.mail.yahoo.com')  #你SMTP服务器
server.login('username','password') #用户名和密码
server.sendmail( from, to, message ) #发邮件
说明:
from:发送者的地址(字符串)
to:接收者列表(字符串)
message:依据某个RFC格式化的字符串信息

依据RFC-822,我们的信息如下设置:
msg="Subject: Hi from Python\n\nHello."
说明:
Subject: Hi from Python:信息头,说明邮件的主题
\n\n:形成一空行
Hello:信息体
完整的代码如下:
import smtplib
host="smtp.sina.com.cn"
f_address="xxx@sina.com.cn"
t_address=["xxx@sina.com.cn"]
msg="Subject: Hi from Python\n\nHello."
s=smtplib.SMTP(host)
s.login('username','password')
error=s.sendmail(f_address,t_address,msg)
说明:
sendmail将返回一个字典,字典将包含关键值对“接收方地址:错误信息”;如果成功,则字典为空。

2、POP3
POP3从远程服务器的邮箱中下载信息。下面我们用例子说明如何使用POP3来接收信息。我们将要用到一个Python模块poplib。
首先,我们要用以下步骤来建立一个到POP3邮箱的连接:
a、通过创建poplib.POP3(host)实例来连接服务器
b、用user()方法来发送邮箱帐号名
c、用pass_()方法来发送邮箱密码
通过以上步骤我们已经建立了一个有效的连接,并且邮箱已加锁,此时邮箱就不能再建立其它的连接,除非连接超时。因此,我们使用完邮箱后应用quit()方法解锁。
POP3信息从1~n计数,n是当前邮箱中的信息数。我们可以用stat()方法来确定信息的数量,然后我们就可以通过计数值n来请求我们需要的信息。下面这个例子我们仅接收第一条信息:
# DumpPop.py - Dumps the first message in a POP3 mailbox.
import sys
import poplib

def DumpAPopMessage(host, user, password):
# 建立一个到POP服务器的连接
a = poplib.POP3(host)
#显示服务器的响应
print a.user(user) #user()发送用户名,并返回响应
print a.pass_(password) #pass_()发送密码并返回响应
# 这时邮箱已加锁,记住最后解锁
try:
#stat()得到邮箱和状态。返回含有两个整数的元组(信息的数量,邮箱的尺寸)
(numMsgs, totalSize) = a.stat()
if numMsgs == 0:
print "Sorry - there are no messages in the mailbox"
else:
#retr(n)返回所要求的第n条信息。返回结果形如['response', ['line', ...], octets]。octets=bytes
(server_msg, body, octets) = a.retr(1)
print "Server Message:", server_msg
print "Number of Octets:", octets
print "Message body:"
for line in body:
print line
finally:
print a.quit()

if __name__=='__main__':
if len(sys.argv)<4:
print "Usage:", sys.argv[0], "host username password"
else:
DumpAPopMessage(sys.argv[1], sys.argv[2], sys.argv[3])

输出结果如下:
C:\Scripts>DumpPop.py pop-server mhammond topsecret
+OK Password required for mhammond
+OK mhammond's maildrop has 1 messages (1730 octets)
Server Message: +OK 1730 octets
Number of Octets: 1730
Message body:
Return-Path: <MHammond@skippinet.com.au>
Received: from mr4.vic-remote.bigpond.net.au ([24.192.1.19])
by m5.bigpond.net.au (Netscape Messaging Server 3.54) with ESMTP
id AAA26FD for <mhammond@vic.bigpond.net.au>;
Thu, 15 Jul 1999 21:01:30 +1000
...
Importance: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3

Hello
+OK m5.bigpond.net.au POP3 server closing connection

C:\Scripts>

说明:从以上结果可以看到,我们所发送的信息虽然只有很少的信息头,但接收时,邮件传送系统却使用之增加了很多。这为我们处理这些信息增加了难度。Python有一个库,它对分析和处理这种格式的数据提供了支持。最基本的支持能够在类rfc822.Message中找到,mimetools模块支持不同的MIME(Multipurpose Internet Mail Extensions)扩展,因为MIME是对基本标准的扩展,所以你可以安全的用它,即使信息不是MIME形式的。
对于行的列表, mimetools.Message() 类更期望从它包含的数据接收一个文件对象。StringIO 或cStringIO模块能够将一个字符串转换为一个文件对象;对于于字符串列表,我们可以将它合并为一个长的字符串,然后传递给StringIO或cStringIO。下面的例子将遍历邮箱中的信息,并找到相关主题的信息,然后显示信息体再删除这信息。
# DumpPop2.py - Dumps and deletes a test message from a POP3 mailbox.
import sys
import poplib
import string
import mimetools
import cStringIO

def DumpAPopMessage(host, user, password):
# 建立一个到POP服务器的连接
a = poplib.POP3(host)
#显示服务器的响应
print a.user(user)
print a.pass_(password)

try:
(numMsgs, totalSize) = a.stat()
for thisNum in range(1, numMsgs+1):
(server_msg, body, octets) = a.retr(1)

# 为了使用mimetools.Message 类,将信息体转换为文件对象
pseudo_file = cStringIO.StringIO(string.join(body, '\n'))
#一旦创建了mimetools.Message实例,所有的信息头已被读,文件的指针位于信息体的开始处
msg = mimetools.Message(pseudo_file)
#getheader("Subject")在信息头中寻找相关主题
if msg.getheader("Subject")=="Hi from Python":
print "Found our test message"
print "Body is", `pseudo_file.read()`
print a.dele(thisNum)
print "Message deleted!"
finally:
print a.quit()

if __name__=='__main__':
if len(sys.argv)<4:
print "Usage:", sys.argv[0], "host username password"
else:
DumpAPopMessage(sys.argv[1], sys.argv[2], sys.argv[3])

输出结果如下:
C:\Scripts>DumpPop2.py pop-server mhammond topsecret
+OK Password required for mhammond
+OK mhammond's maildrop has 1 messages (1243 octets)
Found our test message
Body is 'Hello'
+OK Message 1 deleted
Message deleted!
+OK m5.bigpond.net.au POP3 server closing connection
C:\Scripts>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值