`
icqanki
  • 浏览: 14151 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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>
分享到:
评论

相关推荐

    计算机网络邮件收发 SMTP和POP3实现

    总的来说,通过这个课程设计,学生不仅能深入理解SMTP和POP3协议,还能提高实际编程和问题解决能力,同时提升软件文档编写技巧,这对于未来从事IT行业,尤其是网络通信领域的工作是非常有价值的。

    基于SMTP和POP3协议的邮箱服务器与客户端python实现源码+超详细注释.zip

    【项目介绍】基于SMTP和POP3协议的邮箱服务器与客户端python实现源码+超详细注释.zip基于SMTP和POP3协议的邮箱服务器与客户端python实现源码+超详细注释.zip基于SMTP和POP3协议的邮箱服务器与客户端python实现源码+...

    C# 实现简单邮件SMTP和POP3客户端 联系人管理

    为了实现完整的邮件客户端功能,我们需要将SMTP、POP3和联系人管理整合在一起。用户界面可以设计为允许添加、编辑和删除联系人,以及发送和接收邮件的功能。当用户选择一个联系人时,程序会自动填充SMTP发件人和POP3...

    基于smtp 和pop3协议的邮件转发器

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是互联网上用于发送和接收电子邮件的两种主要协议。了解这两种协议的工作原理对于构建一个基于SMTP和POP3的邮件转发器至关重要。 ...

    用Telnet命令收发邮件(SMTP和POP3协议)实验报告.docx

    用Telnet命令收发邮件(SMTP和POP3协议)实验报告 本实验报告介绍了使用Telnet命令收发邮件的实验过程,包括使用SMTP协议发送邮件和使用POP3协议收邮件的实验步骤。 SMTP协议发送邮件 SMTP(Simple Mail Transfer...

    利用Wirshark抓包分析SMTP协议和POP3协议.rar

    在本资源包中,我们重点关注的是如何使用Wireshark来分析SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)两种电子邮件传输协议。 SMTP是互联网上传输电子邮件的标准协议,它负责将...

    c++编写的smtp和pop3服务器实现

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是互联网上用于电子邮件传输的两个核心协议。在本文中,我们将深入探讨这两个协议的原理及其在C++编程中的实现。 首先,SMTP是用于...

    如何在 Solaris 安裝 SMTP 和 POP3

    如何在 Solaris 安裝 SMTP 和 POP3 如何在 Solaris 安裝 SMTP 和 POP3

    使用SMTP 和POP3 协议实现收发邮件

    详细介绍了SMTP和POP3发送邮件和接收邮件并有源代码,可用于学习,也可直接用在自己的项目中去

    SMTP和POP3的邮件客户端

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是电子邮件系统中的两个核心协议,它们分别处理电子邮件的发送和接收。 SMTP是一种基于TCP/IP的应用层协议,主要用于在互联网上...

    基于SMTP和POP3协议的EMAIL收发软件

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是电子邮件系统中的两个核心协议,用于处理电子邮件的发送和接收。本项目是一个基于C#编程语言的课程设计,旨在实现一个能够通过...

    SMTP和POP3协议中文版

    总结来说,SMTP和POP3是电子邮件系统中的两个关键组件,它们协同工作,使得电子邮件的发送和接收成为可能。SMTP确保邮件在网络中有效传输,而POP3则确保用户能够安全地将邮件下载到本地设备。这两个协议的中文版对于...

    10172911梁天一用Telnet命令收发邮件(SMTP和POP3协议)实验报告.docx

    ### Telnet命令与SMTP及POP3协议实验报告 #### 实验背景 随着互联网技术的发展,电子邮件成为人们日常生活中不可或缺的一部分。本实验旨在通过使用Telnet命令来收发邮件,了解SMTP(Simple Mail Transfer Protocol...

    邮件服务 smtp和pop3的结合

    SMTP (Simple Mail Transfer Protocol) 和 POP3 (Post Office Protocol version 3) 是电子邮件系统中的两个核心协议,分别用于处理邮件的发送和接收。 SMTP 主要负责邮件的传递,它使用TCP端口25来建立连接。在使用...

    SMTP、POP3收发邮件

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是互联网上用于电子邮件收发的两个主要协议。SMTP主要用于将邮件从一个服务器发送到另一个服务器,而POP3则用于从邮件服务器下载...

    使用telnet协议来收发邮件(SMTP和POP3)

    通过这个实验对SMTP和POP3有一定了解

    SMTP及pop3客户端程序代码

    SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)是互联网上用于电子邮件传输的两种核心协议。SMTP主要用于发送邮件,而POP3则用于接收邮件。 **SMTP(简单邮件传输协议)** SMTP是...

    java-mail 支持smtp pop3源码

    SMTP是用于发送邮件的协议,而POP3和IMAP则用于接收邮件。在JavaMail中,`javax.mail`和`com.sun.mail`包提供了处理这些协议的类和接口。 1. **SMTP服务**:SMTP是互联网上传输电子邮件的标准协议。使用JavaMail,...

Global site tag (gtag.js) - Google Analytics