从运行 PHP Laravel 或 Symfony 的 OVH 云服务器发送邮件到 OVH MX 邮件服务器

问题描述 投票:0回答:1

我尝试从运行 PHP Laravel (Symfony) 的 OVH Web 云服务器发送邮件。以前可以通过 SMTP 发送,但现在不再可靠了。

这是我向 OVH 支持人员翻译的问题;

我想通过 SMTP 和 OVH MX Plan 从运行 OVH Web Cloud 服务器的 PHP 发送电子邮件。 这不能可靠地工作,网络服务器和邮件服务器之间的连接通常无法建立。
为了进行测试,我使用了一个通过 SMTP 发送邮件的 php 脚本。 该脚本在强调试模式下使用 PHPMailer 库 (4) 来显示所有通信。
我在超过 10% 的情况下看到“connect() 失败”,这更像是 50% 的错误。不能用。
我发现了
https://help.ovhcloud.com/csm/en-mx-plan-email-diagnosis?id=kb_article_view&sysparm_article=KB0051869
https://help.ovhcloud.com/csm?id=kb_article_view&sysparm_article=KB0052902 作为文档。
本文档解释说这是可能的,但就我而言,它不够可靠。
能帮忙解决一下吗?

这是他们的答案:

您好 PaulH 先生,
经检查,您当前正在使用 MX Plan 软件包的 SMTP 通过共享 OVH Web 云托管发送电子邮件。此 SMTP(ssl0.ovh.net)受到发送限制:

  • 每发送电子邮件最多 100 个收件人
  • 每个帐户每小时 200 封电子邮件
  • 对于链接到同一域名的所有电子邮件地址,每个 IP 地址每小时 300 封电子邮件。

由于您的 OVHcloud 共享主机的 IP 地址在许多客户之间共享,因此列表的最后一个限制很快就会达到,与您自己的发送无关,这就是为什么我们建议您使用 PHP“mail()”函数.
以下是我们的文档,可帮助您了解有关 PHP 的“mail()”函数及其工作原理的更多信息:https://help.ovhcloud.com/csm/fr-web-hosting-monitoring-automatic-emails?id=kb_article_view&sysparm_article =KB0052902
此外,您可以通过以下链接访问我们的市场以及掌握我们 OVHcloud 产品的合作伙伴列表:

好的,我知道 mail() 函数有限制,但我不知道他们的 SMTP 上有发件人 IP 地址限制。这很奇怪:OVH MX Mail 不支持从自己的服务器接收 SMTP 邮件。

这是我向 OVH 支持人员提出的下一个问题:

感谢您的详细回复。我对这种实现感到失望,这意味着 OVH 客户所获得的服务不如在其他地方拥有 PHP 脚本主机的客户。您真的希望我将站点移至 IP 地址不太繁忙的另一台主机吗?
我使用 Laravel 作为我的 PHP 框架,并且不支持 mail() 函数:“Laravel 和 Symfony Mailer 提供通过 SMTP、Mailgun、Postmark、Amazon SES 和 sendmail 发送电子邮件的驱动程序”。 PHP可以通过sendmail发送吗?

这就是答案

您好 PaulH 先生,
我刚刚检查了你们的服务运行是否顺利,我可以确认在我们的层面上没有发生涉及我们基础设施的事件。
我理解您的担忧和您面临的问题。但是,由于您的请求超出了我们为客户提供的服务范围,我想通知您,我们的支持团队无法在此事上为您提供帮助。

我建议您联系可以在这方面为您提供帮助的网站管理员。此外,我还通过以下链接向您提供我们的市场以及掌握我们 OVHcloud 产品的合作伙伴列表:

如果您需要帮助,OVHcloud 开发者和用户社区会积极参与我们的论坛:https://community.ovh.com。如果您有任何其他问题或疑虑,我们将很乐意为您提供与我们服务相关的任何帮助。感谢您的理解并祝您度过愉快的一天。

好的。那没有帮助。 我为 Laravel 寻找了 mail() 驱动程序,但 Laravel 仅支持外部服务或 sendmail。 OVH Web 云托管不允许调用 sendmail。 谁能给我指点 Laravel 的 mail() 自定义传输驱动程序?

php laravel email smtp ovh
1个回答
0
投票

这是一个实现 https://laravel.com/docs/10.x/mail#custom-transports实现

namespace App\Services;

use Symfony\Component\Mailer\SentMessage;
use Symfony\Component\Mailer\Transport\AbstractTransport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\MessageConverter;

/**
 * Send mail via mail()
 * Laravel natively supports SMTP, Mailgun, Postmark, Amazon SES and sendmail but not PHP mail()
 * mail() is 'recommended' by OVH (SMTP is subject to IP quota and often fails when OVH webserver -> OVH mail)
 * https://laravel.com/docs/10.x/mail#custom-transports
 * Note: ChatGPT thinks there is a 'mail' driver, proposes to use 'sendmail', or define a Mailable. All not helping.
 */
class NativeMail extends AbstractTransport
{
    protected function doSend(SentMessage $message): void
    {
        $email = MessageConverter::toEmail($message->getOriginalMessage());

        // tried to use headers directly, but it is no added value
        // $headers = $email->getHeaders(); //  from, subject, to
        // $headers = $email->getPreparedHeaders(); // clone with From, Subject, To, MIME-Version, Date, Message-ID
        // dump($headers, $headers->toString(), $headers->toArray());
        // $headers->remove('subject'); // mail() fails if subject is present in headers
        // $headers->remove('to'); // mail() fails if subject is present in headers
        // dd($headers, $headers->toString(), $headers->toArray(), $email->getFrom());

        $success = mail(
            to: collect($email->getTo())->map(fn (Address $email) => $email->toString())->implode(', '),
            subject: $email->getSubject(),
            message: $email->getTextBody(),
            additional_headers: ['from' => $email->getFrom()[0]->toString()],
            // additional_headers: $headers->toString(),
        );

        if (!$success) {
            throw new \Exception('ERROR. Could not send mail. Call to PHP mail() function returned false.');
        }
    }

    public function __toString(): string
    {
        return 'nativemail';
    }
}

App\Providers\AppServiceProvider::boot()

Mail::extend('nativemail', function (array $config = []) {
   return new NativeMail();
});

在config\mail.php中

'mailers' => [
    ...
    'nativemail' => [
        'transport' => 'nativemail',
    ],

.env

MAIL_MAILER=nativemail
© www.soinside.com 2019 - 2024. All rights reserved.