Python 协议握手

Python 协议握手,python,email,Python,Email,对于我13年的A级计算项目,我正在编写一个电子邮件客户端,我需要对pythons SMTP协议的工作方式进行建模,并展示协议握手。我想知道的是,当我登录到Gmail邮件服务器使用smtp发送电子邮件时,是否有一种方法可以打印出代码行的功能 因此,我想确切地说明执行该行时发生了什么 import smtplib server = smtplib.SMTP('smtp.gmail.com', 587) server.login("youremailusername", "password") msg

对于我13年的A级计算项目,我正在编写一个电子邮件客户端,我需要对pythons SMTP协议的工作方式进行建模,并展示协议握手。我想知道的是,当我登录到Gmail邮件服务器使用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)
干杯伙计们

假设“代码行是什么”的意思是“向服务器发送和从服务器接收什么协议消息”:

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

如果通过“代码行的作用”希望了解正在执行的Python代码,则可以在调试器中进行函数调用。或者只是阅读源代码。与stdlib中的许多模块一样,
smtplib
被设计为既可用作示例代码又可用作实用模块,因此在文档顶部有一个指向的链接


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

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

  • Fork
    smtplib
    并用更好的方法替换那些
    print
    调用
  • Monkeypatch
    smtplib
    为其提供了一个
    print
    功能,该功能将覆盖全局功能。(这只适用于Python3.x;在2.x中,
    print
    不是函数。)
  • 打开一个文本文件,只需分配
    sys.stderr=my_text_file
    。(这只适用于文件,不适用于tkinter。它还可以捕获所有stderr,而不仅仅是来自
    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__

显然,如果您打算在完成后立即退出,则恢复stderr是不必要的,而如果您想重复执行此操作,则可能需要将其包装在
contextlib.contextmanager
中,等等。此外,此
MyDumbFakeStderr
非常愚蠢(因此得名);它可以很好地将只执行
打印
整行操作的代码包装到
stderr
,但对于更复杂的代码,您可能需要添加自己的行缓冲,或者将其设置为
io.TextIOBase
,等等。这只是一个开始的想法。

您可以阅读函数的源代码

(搜索sendmail)

您还可以阅读一些有关SMTP的信息:


并尝试将这两个

联系起来:只需调用
SMTP。设置调试级别(1)
,您将获得“调试连接消息以及发送到服务器和从服务器接收到的所有消息”。由于您的信息可能有助于解决OP的问题,因此如果您能够提供更客观的信息,效果会更好。请查看帮助页面,以改进您的答案。谢谢,这已经奏效,它现在会将发生的事情写入shell。有没有办法将输出写入tkinter窗口或文件?