如何使用Python直接从服务器发送电子邮件,而无需SMTP

9

我是一名PHP程序员,在PHP中,您可以直接使用服务器发送电子邮件。例如,以下代码将电子邮件发送给客户端:

<?php
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);
?> 

但在Python中,您必须使用smtplib和Gmail或Hotmail服务器来发送电子邮件。 我想知道是否有办法直接从服务器使用Python发送电子邮件?

1个回答

11

其他选项

当你在PHP中使用邮件功能时,它会使用所在主机的本地sendmail,而本地sendmail只是一个SMTP本地中继。当然,不建议局域网内发送电子邮件,因为由于DKIM、SPF和其他保护机制,这些邮件很可能没有良好的投递率。如果你关心送达率,我建议使用以下方法之一:

  1. 正确配置为发送域的外部SMTP服务器发送邮件。

  2. 像AWS SES、Mailgun或等效品这样的API。

如果你不关心送达率,那么你当然可以从Python中使用本地SendMail,SendMail也监听回环地址(127.0.0.1)的25号端口,就像任何其他SMTP服务器一样,因此你可以使用smtplib通过SendMail发送邮件,而无需使用外部SMTP服务器。

通过本地SMTP发送电子邮件

如果你有一个本地SMTP服务器,例如SendMail,请检查它是否按预期正在监听...

netstat -tuna

你应该看到它正在回环地址上的25号端口上监听。

如果它正在监听,则应该能够像以下示例代码一样从Python中发送电子邮件。

import smtplib

sender = 'no_reply@mydomain.com'
receivers = ['person@otherdomain.com']

message = """From: No Reply <no_reply@mydomain.com>
To: Person <person@otherdomain.com>
Subject: Test Email

This is a test e-mail message.
"""

try:
    smtp_obj = smtplib.SMTP('localhost')
    smtp_obj.sendmail(sender, receivers, message)         
    print("Successfully sent email")
except smtplib.SMTPException:
    print("Error: unable to send email")

1
你能给我一个使用本地SendMail的Python示例吗?或者编辑并放置一些Python代码来指导我如何从本地机器发送电子邮件。 - Mohsen Koleyni
1
当然,首先请您在使用的主机上,在终端中运行以下命令:netstat -tuna这样我们就可以检查SendMail是否按预期在本地监听。 - Robert Putt
4
我遇到了这个错误:sock.connect(sa) ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it。 - Mohsen Koleyni
1
有趣的是,看起来你正在使用Windows,因此你的PHP的php.ini文件必须已经指定了一个SMTP服务器。我建议从你的PHP环境中提取它,并在你的Python应用程序中重复使用同一个服务器。 - Robert Putt
@RobertPutt,我遇到了一个问题,就像他在这里检查的一样(https://stackoverflow.com/questions/60058165/django-send-email-from-a-form-with-the-fillers-email-as-from/60058846#60058846)。当我在我的Ubuntu服务器上尝试您的代码示例时,我遇到了这个错误“socket.error:[Errno 111] Connection refused”。我该如何解决呢?顺便说一下,当我执行“netstat -tuna”时,我没有发现任何东西在25号端口监听。 - Simou
我在smtplib.SMTP('localhost')上遇到了“拒绝连接”的错误。 - Shrike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接