协议握手Python

时间:2014-09-02 18:04:13

标签: python email

对于我在13年级编写电子邮件客户端的A级计算项目,我需要对蟒蛇SMTP协议的工作方式进行建模并显示协议握手。我想知道的是,当我登录gmails邮件服务器使用smtp发送电子邮件时,有一种方法可以打印出代码行的功能。

所以我想要准确显示执行该行时发生了什么。

import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.login("youremailusername", "password")
msg = "\nHello!" # The /n separates the message from the headers
server.sendmail("you@gmail.com", "target@example.com", msg)

干杯球员

2 个答案:

答案 0 :(得分:0)

假设通过"代码行做什么"你的意思是"什么协议消息被发送到服务器和从服务器收到#34;,smtplib.SMTP.set_debuglevel(level)

  

设置调试输出级别。 level的真值导致连接的调试消息以及发送到服务器和从服务器接收的所有消息。

如果通过"代码行做什么"如果您想知道正在执行的Python代码,您可以在调试器中进入函数调用。或者只是阅读来源。与stdlib中的许多模块一样,smtplib旨在用作示例代码和实用模块,因此在文档的顶部,有smtplib.py的链接。


  

有没有办法可以将输出写入tkinter窗口或文件?

如果查看上面链接的源代码,可以看到它只是使用print调用来进行调试日志记录。因此,这为您提供了一些选择:

  • 分叉smtplib并用更好的内容替换这些print来电。
  • Monkeypatch smtplib为其提供一个print函数,该函数会影响全局函数。 (这仅适用于Python 3.x;在2.x中,print不是函数。)
  • 打开文本文件,然后分配sys.stderr = my_text_file。 (这仅适用于文件,而不适用于tkinter。它还可以捕获所有 stderr,而不仅仅是smtplib的日志记录。)
  • 创建一个类似文件的对象,在write方法中执行任何操作,并为其指定sys.stderr。 (这适用于您想要做的任何事情,包括添加到tkinter编辑窗口,但当然它仍会捕获所有stderr。)
  • 从外部包装脚本 - 例如,使用包装脚本使用subprocess.Popen来调用真实脚本并在管道中捕获其stderr

哪一个适合取决于您的需求。对于您的作业,假设在您执行stderr内容期间没有任何内容写入smtplibsmtplib的调试输出,我认为类似文件的对象想法可能有意义。所以:

class MyDumbFakeStderr(object):
    def write(self, output):
        add_to_my_file_or_tkinter_thing(output)

sys.stderr = MyDumbFakeStderr()
try:
    # your smtplib code here
finally:
    sys.stderr = sys.__stderr__

显然,如果您在完成后立即退出,则无需恢复stderr,而如果您想反复执行此操作,则可能需要将其包裹在{{{} 1}}等等,此contextlib.contextmanager非常愚蠢(因此得名);它可以很好地包装除了MyDumbFakeStderr整行到print之外什么都不做的代码,但是对于任何更复杂的代码,你可能需要添加自己的行缓冲,或者使它成为stderr等这只是让你入门的一个想法。

答案 1 :(得分:-1)

您可以阅读该功能的源代码。

http://www.opensource.apple.com/source/python/python-3/python/Lib/smtplib.py(搜索sendmail)

您还可以阅读一些关于SMTP的信息:http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#SMTP_transport_example

尝试将两者联系起来