Python操作SMTP和POP3

来源:互联网 发布:网络制式有哪些 编辑:程序博客网 时间:2024/03/29 23:28
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: <[email]MHammond@skippinet.com.au[/email]>
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 <[email]mhammond@vic.bigpond.net.au[/email]>;
          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>
原创粉丝点击