【问题标题】:What is the practical value of imaplib "close" & "logout"?imaplib“关闭”和“注销”的实用价值是什么?
【发布时间】:2018-07-12 07:01:50
【问题描述】:

我有一个 Python 脚本,它每隔几秒就会在 while 循环中检查我的电子邮件是否有新电子邮件。

我使用imaplib 库以下列方式连接到我的电子邮件服务器(以下代码位于while 循环的顶部):

import imaplib
mail = imaplib.IMAP4_SSL(IMAPSERVER)
mail.login(userName, password)
mail.select(theFolderName, True)
return_code, mail_ids = mail.search(None, 'UnSeen')

谁能告诉我以下语句的实际作用?

mail.close()
mail.logout()

根据documentation他们分别:

"关闭当前选中的邮箱"

"关闭与服务器的连接;返回服务器 BYE 响应。"

但是,“关闭”邮箱和“关闭”连接是什么意思?我的意思是,这些行动的意义或好处是什么?您能否提供一个实际需要这些陈述的示例?

我问这个问题是因为我注意到无论添加还是删除这两行,我的脚本都没有任何区别。所以,我想更好地了解他们的目的。

【问题讨论】:

    标签: python imaplib


    【解决方案1】:

    如果您在使用或不使用最后两个语句的情况下都没有注意到客户端或服务器上的任何更改,您仍然应该调用它们。 The IMAP spec 包含一个方便的图表,概述了 IMAP 连接的生命周期(从该链接向上滚动一页):

                   +----------------------+
    
                   |connection established|
                   +----------------------+
                              ||
                              \/
            +--------------------------------------+
            |          server greeting             |
            +--------------------------------------+
                      || (1)       || (2)        || (3)
                      \/           ||            ||
            +-----------------+    ||            ||
            |Not Authenticated|    ||            ||
            +-----------------+    ||            ||
             || (7)   || (4)       ||            ||
             ||       \/           \/            ||
             ||     +----------------+           ||
             ||     | Authenticated  |<=++       ||
             ||     +----------------+  ||       ||
             ||       || (7)   || (5)   || (6)   ||
             ||       ||       \/       ||       ||
             ||       ||    +--------+  ||       ||
             ||       ||    |Selected|==++       ||
             ||       ||    +--------+           ||
             ||       ||       || (7)            ||
             \/       \/       \/                \/
            +--------------------------------------+
            |               Logout                 |
            +--------------------------------------+
                              ||
                              \/
                +-------------------------------+
                |both sides close the connection|
                +-------------------------------+
    
         (1) connection without pre-authentication (OK greeting)
         (2) pre-authenticated connection (PREAUTH greeting)
         (3) rejected connection (BYE greeting)
         (4) successful LOGIN or AUTHENTICATE command
         (5) successful SELECT or EXAMINE command
         (6) CLOSE command, or failed SELECT or EXAMINE command
         (7) LOGOUT command, server shutdown, or connection closed
    

    该规范进一步详细说明了当行为不端的客户端与服务器交谈时服务器如何尝试行为,但最安全的做法是遵循规范。

    如果出于某种原因,您坚决反对手动完成 IMAP 连接,而不是仅仅退出脚本,那么您必须检查您正在与之交谈的 IMAP 服务器的实现,以确定它是如何处理这种情况的(我认为这可以概括为“优雅地”,但依赖这种行为仍然是一个坏主意)。

    【讨论】:

    • 好的,很好的信息。如果我将mail = imaplib.IMAP4_SSL(IMAPSERVER)mail.login(userName, password) 行放在之前 while 循环或里面会更好吗?换句话说,我应该在开始时简单地连接一次并在我的脚本期间(即 24/7)保持相同的连接打开,还是应该在 while 循环的每次迭代中重新连接/断开连接(每 3 秒)?
    • 每 3 秒轮询一次邮件服务器会在服务器上产生大量负载。如果你真的想经常轮询,我会尝试只在循环中调用mail.select(以避免不断创建 IMAP 会话和登录的开销)。请注意,服务器可能会在某个时候关闭您长时间运行的会话,因此您应该有一些错误逻辑,在连接关闭时尝试再次登录。
    • 1.我将遵循您关于完成 IMAP 连接和命令位置的建议。现在我考虑一下,对于大约 5% 的迭代,我观察到我的脚本将无法检查我的电子邮件,并给出Timed OutIMAP4rev1 Server logging out 的错误消息。我想知道实施您的建议是否会防止这些错误的发生。
    • 2.有问题的服务器是雅虎邮箱。对于雅虎这样的庞然大物来说,3 秒真的那么苛刻吗?任何标准电子邮件客户端应用程序(如 Outlook)不会经常轮询服务器吗?
    • 就个人而言,我的电子邮件客户端每 5 分钟到每 15 分钟轮询一次电子邮件(其中一些可能会在新邮件到达时收到推送通知,但这超出了此问题的范围)。虽然从宏观上看,每 3 秒轮询一次对雅虎来说是杯水车薪,但它们可能会因这种使用而限制或阻止您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2013-05-26
    • 1970-01-01
    • 2013-12-16
    • 2014-11-08
    • 2012-09-12
    相关资源
    最近更新 更多