2014-09-02 210 views
-1

对于我13年级的A级计算项目,即时消息编写电子邮件客户端,我需要模拟pythons SMTP协议如何工作并显示协议握手。我想知道的是,当我登录Gmail时,使用smtp发送邮件的邮件服务器有办法打印出这行代码的作用。协议握手Python

因此,我想要准确显示执行该行时发生了什么。

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("[email protected]", "[email protected]", msg) 

干杯家伙

+1

这是在[文件](https://开头的文档.python.org/32/library/smtplib.html#smtplib.SMTP.set_debuglevel):只需调用'SMTP.set_debuglevel(1)',你就可以得到“调试消息,用于连接以及发送到服务器和从服务器接收的所有消息“。 – abarnert 2014-09-02 18:07:23

回答

0

假设由“什么的代码行确实”你的意思是“什么协议消息被发送和从服务器接收”,smtplib.SMTP.set_debuglevel(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的,而且它还捕捉smtplib所有标准错误,而不仅仅是记录。)
  • 创建一个类文件对象,做任何你想要在其write方法,并指定sys.stderr到那。 (这适用于你想做的任何事情,包括添加到tkinter编辑窗口,但当然它仍然捕获所有stderr。)
  • 从外部包装脚本 - 例如,使用包装脚本,使用subprocess.Popen来调用实际脚本并在管道中捕获其stderr

哪一个是合适的取决于您的需求。对于你的任务,假设在你做smtplib的时候什么都没有写入stderr,但是smtplib的调试输出,我认为文件类对象的想法可能是有道理的。所以:

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__ 

显然恢复标准错误是不必要的,如果你只是将尽快就大功告成了退出,而如果你想这样做,反复你可能想将其包装在一个contextlib.contextmanager,此外,这MyDumbFakeStderr是非常愚蠢的(因此名称);它可以很好地包装代码,除了print整行代码到stderr,但对于任何更复杂的代码,您可能需要添加自己的行缓冲,或使其成为io.TextIOBase等。这仅仅是一个让你开始的想法。

+0

谢谢,它已经工作了,它现在写入了正在发生的事情。有没有一种方法可以将输出写入tkinter窗口或文件? – user3788339 2014-09-02 20:40:00

+0

@ user3788339:让我编辑答案。 – abarnert 2014-09-02 20:43:28

-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

并尝试把这两个

+0

由于您的信息可能有助于解决OP的问题,因此如果您能提供更客观的信息会更好。请看看[我如何写出一个好的答案](http://stackoverflow.com/help/how-to-answer)帮助页面,以改善您的答案。 – 2014-09-02 18:26:21