Skip to main content
 首页 » 编程设计

python之aiosmtpd之python smtp 服务器

2025年02月15日6qq78292959

我正在尝试使用 python 和 aiosmtpd 库在我的计算机上运行我自己的 stmp 服务器。
我运行示例,一切看起来都很好,但我从未收到另一端的电子邮件。
不知道有没有日志可以看
我正在使用 visual studio 2015、python 3.5 和 windows 8.1

我看到了类似的帖子,但没有帮助。

重要提示:
在客户端代码中,我也尝试不使用 Date header

服务器.py:

 import asyncio import logging 
 
 from aiosmtpd.controller import Controller 
 from aiosmtpd.handlers import Sink 
 from smtplib import SMTP 
 
 async def amain(loop): 
     cont = Controller(Sink(), hostname='::0', port=8025) 
     cont.start() 
 
 
 if __name__ == '__main__': 
     logging.basicConfig(level=logging.DEBUG) 
     loop = asyncio.get_event_loop() 
     loop.create_task(amain(loop=loop)) 
     try: 
         loop.run_forever() 
     except KeyboardInterrupt: 
         pass 

客户端.py:

 from smtplib import SMTP import smtplib 
 
 s = SMTP('localhost', 8025) try: 
     s.set_debuglevel(True) 
     s.sendmail('andy@love.com', ['bob@hate.com'], """\ 
     Date:17/05/2017,2:18 
     From: andy@love.com 
     To: bob@hate.com 
     Subject: A test 
     testing 
     """) 
     s.quit() except smtplib.SMTPException: 
     print("Error: unable to send email") 
     import traceback 
     traceback.print_exc() 

更新
我在 Client.py 中设置了 s.set_debuglevel(True) 并收到了这个输出:

send: 'ehlo [192.168.56.1]\r\n' 
reply: b'250-mycomputername\r\n' 
reply: b'250-SIZE 33554432\r\n' 
reply: b'250-8BITMIME\r\n' 
reply: b'250-SMTPUTF8\r\n' 
reply: b'250 HELP\r\n' 
reply: retcode (250); Msg: mycomputername\nSIZE  
33554432\n8BITMIME\nSMTPUTF8\nHELP' 
send: 'mail FROM:<andy@love.com> size=122\r\n' 
reply: b'250 OK\r\n' 
reply: retcode (250); Msg: b'OK' 
send: 'rcpt TO:<myreal@email.com>\r\n' 
reply: b'250 OK\r\n' 
reply: retcode (250); Msg: b'OK' 
send: 'data\r\n' 
reply: b'354 End data with <CR><LF>.<CR><LF>\r\n' 
reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>' 
data: (354, b'End data with <CR><LF>.<CR><LF>') 
send: b'     Date:17/05/2017,2:18\r\n     From: andy@love.com\r\n     To:  
myreal@email.com\r\n     Subject: A test\r\n     testing\r\n     \r\n.\r\n' 
reply: b'250 OK\r\n' 
reply: retcode (250); Msg: b'OK' 
data: (250, b'OK') 
send: 'quit\r\n' 
reply: b'221 Bye\r\n' 
reply: retcode (221); Msg: b'Bye' 
Press any key to continue . . . 

请您参考如下方法:

在您的代码中,Controller(Sink(), hostname='::0', port=8025) 启动一个 SMTP 服务器,该服务器在端口 8025 上接收消息并将它们丢弃(Sink() 部分)。这就是邮件不会显示在您的收件箱中的原因——当您将电子邮件发送到 localhost:8025 时,它实际上从未发送到您的收件箱。

aiosmtpd 是一个 SMTP 服务器,这意味着它将接收通过 SMTP 发送的消息并以某种方式处理它们。在您的代码中,Sink() 处理程序不会以任何方式处理传入的电子邮件——它只是将传入的消息丢弃。

如果您想通过 Internet 将电子邮件发送到 bob@hate.com,那么您应该联系负责 hate.com 域的 SMTP 服务器,而不是您正在使用 aiosmtpd 运行的 SMTP 服务器。对于此任务,您不需要运行 SMTP 服务器,因为据推测在互联网上已经有一个 SMTP 服务器在为 hate.com 运行;相反,您需要一个 SMTP 客户端 组件,它在 Python 标准库的 smtplib 模块中提供。使用 SMTP 发送电子邮件与 aiosmtpd 无关,您应该了解如何使用 smtplib。

进一步阅读:Email § Operation在维基百科上。