当前位置: 首页 > 知识库问答 >
问题:

Python使用本地SMTP服务器在docker容器内发送邮件

颛孙高义
2023-03-14

我想在python上使用smtplib发送邮件。我知道它在端口号25上使用本地smtp服务。我有以下代码。这些代码在我的本地运行没有任何问题,邮件发送成功。但是当我将它们移动到docker容器时,邮件不会发送,也不会给出任何错误。

我的代码:

from_mail = 'noreply@testmail.com'
to_mail = 'to@testmail.com'

s = smtplib.SMTP('localhost')
subject = 'Test Subject'
content = 'content test'

message = f"""\
      Subject: {subject}
      To: {to_mail}
      From: {from_mail}
      {content}"""
result = s.sendmail(from_mail, to_mail, message)
s.quit()

运行这些代码后,我将空格({})作为结果值。在sendmail方法描述中有这样的:

...消息被接受传递到四个地址中的三个,其中一个被拒绝,错误代码为550。如果所有地址都被接受,则该方法将返回一个空字典。

是关于网络配置吗?我应该配置任何网络设置吗?

共有3个答案

彭令秋
2023-03-14

如果它适用于主机,请尝试使用主机IP而不是localhost

s = smtplib.SMTP(HOST_IP)

或者正如Arthur所建议的,您可以在主机网络中使用--net=host运行容器,然后继续使用localhost

沃侯林
2023-03-14

默认情况下,docker容器在单独的网络堆栈中运行,因此,localhost在docker容器中的含义与代码直接在计算机上运行时的含义不同。

根据您的SMTP服务器的设置方式,它还可能被配置为拒绝发送任何电子邮件,但直接来自您的计算机的电子邮件除外,并且docker容器可能被视为不应该通过它发送电子邮件的外部人员。

我想最简单的解决方案是使用--net=host运行docker容器。有了这个,docker容器的网络堆栈将与计算机的堆栈相同,一切都应该像代码直接在docker外部运行一样工作。

濮升
2023-03-14

您共享的代码是SMTP客户端应用程序。假设使用SMTP客户端标准库smtplib并且SMTP服务器在localhost上运行,代码将在以下条件下在Docker容器中工作:

  • --net=host启动容器,则无需更改。调用smtplib。SMTP('localhost')将连接到主机上运行的SMTP服务器
  • 不能用--net=host启动容器。然后你需要连接到主机。码头工人。如果使用Windows或MacOS,则使用内部而不是本地主机。如果使用Linux,可能需要使用另一个技巧。基本上,代码仍在连接到主机上运行的SMTP服务器
  • 在同一个Docker映像中打包SMTP服务器和python stmp客户端应用程序(您共享的代码)。这是不好的做法,应该避免。但是你可以按照文档来实现它

请分享以下内容以更好地理解这个问题:

更具体地说:

>

Dockerfile您使用的。否则,就不可能运行映像并复制您面临的问题,也不可能理解您所说的“我的容器中正在运行的sendmail服务”是什么意思

完全工作的python代码(包括导入等...)否则,不清楚您使用的smtplib

文档链接。如果使用标准库smtplib,则其文档中没有此类描述:

sendmail方法说明包含以下内容:

...消息被接受传递到四个地址中的三个,其中一个被拒绝,错误代码为550。如果所有地址都被接受,则该方法将返回一个空字典。

 类似资料:
  • 我准备了一个可以通过发送邮件的应用程序,它运行良好,但是当我使用docker运行它时,我收到一个错误-因为它无法连接到。发送邮件的功能是: 这就是错误: myapp_thirdInst |调试SMTP:尝试连接到主机“SMTP.gmail.com”,端口465,isSSL false myapp_thirdInst|javax.mail.MessagingException:未知SMTP主机:sm

  • 我一直使用ZOHO SMTP服务器发送电子邮件。但是它在localhost服务器上工作,当将我的代码部署到AWS服务器上时,它就不能工作了,它给出了如下所示的异常… javax.mail.MessagingException:无法连接到SMTP主机:SMTP.zoho.com,端口:465;嵌套异常是:javax.net.ssl.sslhandShakeException:没有合适的协议(协议被禁

  • 问题内容: 我正在尝试从PHP页面通过GMail的SMTP服务器发送电子邮件,但出现此错误: 身份验证失败[SMTP:SMTP服务器不支持身份验证(代码:250,响应:mx.google.com,为您提供服务,[98.117.99.235]大小为35651584 8位MIME STARTTLS增强的状态代码,编码方式)]] 有人可以帮忙吗?这是我的代码: 问题答案: // Pear Mail Li

  • 问题内容: 我正在使用以下方法使用SMTP从Python发送邮件。是使用的正确方法还是我缺少的陷阱? 问题答案: 我使用的脚本非常相似。我将其发布在此处,作为如何使用email。*模块生成MIME消息的示例。因此可以轻松修改此脚本以附加图片等。 我依靠ISP添加日期时间标头。 我的ISP要求我使用安全的smtp连接发送邮件,我依靠smtplib模块(可从http://www1.cs.columbi

  • 我试图发送电子邮件使用gmail smtp使用javax.mail.下面是我的代码 代码工作正常当我在本地服务器上运行它时,但当我尝试在Elastic beanstek上运行它时(我的服务器在AWS EBS上运行),身份验证失败异常即将到来注意:我已打开从Google A/c设置访问不太安全的应用程序,但我仍然收到此错误 javax.mail.身份验证失败异常:534-5.7.14请通过您的网络浏