【问题标题】:how to send email with python directly from server and without smtp如何直接从服务器使用 python 发送电子邮件而不使用 smtp
【发布时间】:2019-06-08 15:23:18
【问题描述】:

我是 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发送电子邮件?

【问题讨论】:

    标签: python python-3.x email smtp


    【解决方案1】:

    其他选项

    当您在 PHP 中使用邮件功能时,它使用的是您所在主机的本地 sendmail,而这又只是本地的 SMTP 中继,当然不建议在本地发送电子邮件,因为这些可能没有由于 DKIM、SPF 和其他保护机制,良好的交付率。如果您关心可交付性,我建议您使用任一

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

    2. 一种 API,例如 AWS SES、Mailgun 或同等产品。

    如果您不关心可传递性,那么您当然可以使用 Python 中的本地 SendMail,SendMail 就像任何其他 SMTP 服务器一样侦听端口 25 上的环回地址 (127.0.0.1),因此您可以使用 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")
    

    【讨论】:

    • 你能给我一个例子,如何在 python 中使用本地 SendMail 吗?或编辑并放置一些python代码来指导我如何从本地机器发送电子邮件。
    • 当然,首先在您使用的主机上,请您提供来自终端的netstat -tuna 的输出,以便我们检查 SendMail 是否按预期在本地侦听。
    • 我收到此错误:sock.connect(sa) ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
    • 有趣,因为您似乎使用的是 Windows,您的 PHP 的 php.ini 必须已经指定了一个 SMTP 服务器,我建议从您的 PHP 环境中提取它并重新使用相同的服务器你的 Python 应用程序。
    • @RobertPutt 当我在我的 ubuntu 服务器中尝试您的代码示例时,我遇到了一个类似于他的检查 here 的问题,我遇到了这个错误 socket.error: [Errno 111] Connection refused 我该如何解决?顺便说一句,当我做netstat -tuna 时,我在端口 25 上找不到任何监听
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2012-06-10
    • 2016-09-07
    相关资源
    最近更新 更多