php 使用 cloudflare 时的邮件和 SMTP

php mail and SMTP while using cloudflare

我在我的网站上使用 cloudflare,我想将我服务器的 IP(原始 IP)保密,以避免 DDoS 攻击直接发送到我服务器的 IP。我的服务器使用 Apache,PHP,MySQL。

当使用php邮件发送邮件时(即使我使用phpmailer库通过外部SMTP发送邮件)我服务器的IP被添加到邮件headers。 它发生在 Google SMTP、Mailgun 和其他人身上,因为他们的政策可能是在 header 中写入邮件来自的 IP。

目前,我想到并需要大量努力的唯一解决方案是创建我自己的 REST API 并通过另一台服务器发送电子邮件,如下所示:

ORIGIN SERVER IP 通过我的 REST API 将文本格式的电子邮件数据发送到 MY MAIL SERVER IP,然后 MY MAIL SERVER IP 使用 php 邮件功能和 phpmailer 发送通过 SMTP 将电子邮件发送给用户。这样,我的邮件服务器的 IP 将出现在电子邮件 header 中,而不是原始服务器的 IP。

有没有更优雅的方法来做到这一点?是否有提供休息 API 的邮件服务,如果我使用他们的 API,他们不会在电子邮件 header 中显示我服务器的 IP?或者,也许有一个已经开发的 REST API / 库,用于按照我的要求远程发送电子邮件,所以我不必从头开始开发和测试我自己的?

您可以使用例如mailchimp、amazon SES 或其他邮件服务提供商,他们不应添加您的 ip。但该服务是有偿的。

很久以前,在大学里,由于防火墙规则,我无法使用 php 邮件命令,所以我自己编写了 SMTP 验证 class。 一段时间后,我开始使用 PHPMailer class 并且我再也没有遇到其他问题,即使使用 Gmail 作为发件人。 看看 https://github.com/PHPMailer/PHPMailer .

这是一个简单的例子:

<?php
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Load composer's autoloader
require 'vendor/autoload.php';

$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
try {
    //Server settings
    $mail->SMTPDebug = 2;                                 // Enable verbose debug output
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'user@example.com';                 // SMTP username
    $mail->Password = 'secret';                           // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    //Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    //Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;
}

您应该通过 mailgun(或 sendgrid、jetmail、SES 或...)通过他们的API而不是 SMTP 协议和您的IP不会公开。

例如 Mailgun SDK:https://github.com/mailgun/mailgun-php

$mg = Mailgun::create('key-example');

# Now, compose and send your message.
# $mg->messages()->send($domain, $params);
$mg->messages()->send('example.com', [
  'from'    => 'bob@example.com',
  'to'      => 'sally@example.com',
  'subject' => 'The PHP SDK is awesome!',
  'text'    => 'It is so simple to send a message.'
]);

但大多数提供商都有 SDK:

此外,我建议使用 SwiftMailer,这是处理电子邮件的强大库。很酷的事情之一是它抽象了传输,您可以使用包从 SMTP 或任何提供程序 API 切换。

从任何云提供商获取实例,向该实例发送 REST 请求或您喜欢的任何内容,然后您的原始 Web 服务器的 ip 将完全不可见。

没有 API 或优雅的方法可以在您发送的电子邮件中隐藏您的 IP。任何提供此服务的 SMTP 提供商都值得列入黑名单,并会立即被注册滥用此隐私的垃圾邮件发送者制服。

在启动 SMTP 之前,您必须使用创建内部 Web 中继系统以发送到其他 IP 的想法。但是设置它的麻烦应该比用另一个 IP 重建当前站点更 麻烦。

这听起来像是将您的服务器当作宠物而不是牛来对待的经典案例。如果在新 IP 上重建当前站点不如构建和维护自定义 Web API 以隐藏您的 IP 免于暴露那么有吸引力,则您需要研究自动化工具。