代码之家  ›  专栏  ›  技术社区  ›  NVG

使用cloudflare时的php邮件和SMTP

  •  5
  • NVG  · 技术社区  · 6 年前

    我在我的网站上使用cloudflare,我希望保持我服务器的IP(源IP)私有,以避免DDoS攻击直接发送到我服务器的IP。我的服务器使用Apache、PHP、MySQL。

    当使用php mail发送电子邮件时(即使我使用phpmailer库通过外部SMTP发送电子邮件),我的服务器的IP会添加到邮件头中。 谷歌SMTP、Mailgun和其他公司都会出现这种情况,因为他们的政策可能是在邮件头中写入邮件来自的IP。

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

    源服务器IP通过我的REST API将文本格式的电子邮件数据发送到我的邮件服务器IP,然后我的邮件服务器IP使用带有phpMail的php邮件功能通过SMTP将电子邮件发送给用户。这样,我的邮件服务器的IP将显示在电子邮件标题中,而不是源服务器的IP。

    有没有比这更优雅的方法?有没有提供rest API的邮件服务,如果我使用他们的API,他们不会在邮件头中显示我服务器的IP?或者,可能有一个已经开发的REST API/库可以根据我的要求远程发送电子邮件,这样我就不必从头开始开发和测试自己的邮件了?

    5 回复  |  直到 6 年前
        1
  •  8
  •   magnetik    6 年前

    您应该通过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切换。

        2
  •  0
  •   Armen    6 年前

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

        3
  •  0
  •   mFontolan    6 年前

    很久以前,在大学里,由于防火墙规则,我不能使用php mail命令,所以我编写了自己的SMTP认证类。 后来,我开始使用PHPMailer类,我再也没有遇到过问题,甚至使用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;
    }
    
        4
  •  0
  •   Allen    6 年前

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

        5
  •  0
  •   chugadie    6 年前

    没有API或优雅的方式来隐藏您的IP,使其不受您发送的电子邮件的影响。任何提供此服务的SMTP提供商都值得被列入黑名单,并将立即被注册滥用此隐私的垃圾邮件发送者所攻克。

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

    这听起来像是把你的服务器当作宠物而不是牛来对待的经典案例。如果在新IP上重建当前站点 不太吸引人 除了构建和维护自定义Web API以隐藏IP以防暴露之外,您还需要研究自动化工具。