【问题标题】:AWS Elastic Beanstalk - MAIL (Sending and receiving emails )AWS Elastic Beanstalk - 邮件(发送和接收电子邮件)
【发布时间】:2017-05-06 12:47:20
【问题描述】:

我刚刚设法使用 Elastic beanstalk 将我的 Web 应用程序从共享托管服务迁移到 AWS。但是我在电子邮件服务方面遇到了困难。

我的应用程序在注册时发送验证电子邮件(使用 SMTP),看起来用户没有收到电子邮件。 (我还在用共享主机的SMTP账号)

此外,在使用共享托管服务时,我曾经使用我们的网站域名为其他团队成员创建邮件帐户,例如 (noreply@domain.com)。

好吧,我试图为我的问题寻找一个好的答案,但没有一个问题能完全满足我的需求。

有些人建议 SES 只发送电子邮件,而 WorkMAil 只接收电子邮件。

好吧,就我而言,我不想使用其他服务。因为我的网站很小,所以我希望有人能清楚地回答以下问题:

1- 如何允许弹性beantalk 应用程序使用smtp 发送电子邮件。

2- 如何在 EC2 实例上设置 webmail(接收和发送电子邮件),或者至少在 ec2 实例上设置邮件服务,并使用其他客户端(例如 Outlook)发送电子邮件。

3- 如何使用网站的域名创建 SMTP 帐户或不同的电子邮件帐户。

PS : 请给出非常清晰详细的答案,以便我理解,以及可能遇到相同问题的每个人。

【问题讨论】:

    标签: email amazon-web-services amazon-ec2 smtp amazon-elastic-beanstalk


    【解决方案1】:

    因为我最近遇到了同样的问题(php mail() 似乎不适用于 Beanstalk) - 我将分享一些见解。也许它已经在这里说过了,但是将其视为最终解决方案。

    问题
    您在 AWS Beanstalk EC2 上使用 PHP。您的应用程序使用名为 mail(); 的 PHP 原生函数。上传和部署应用时,它似乎不起作用。

    解决方案
    1. 将 SMTP 与 PHPmailer 一起使用。 (我将在下面解释原因)。

    1. https://github.com/PHPMailer,喜欢的话就下载吧 management, Composer 等,你可以使用它,但如果你喜欢我,就 想要小而干净的东西,你只需要 以下文件:

      • class.phpmailer.php
      • class.smtp.php
      • PHPMailerAutoload.php
    2. 把这些文件放到你自己的文件夹结构中,比如vendor/phpmailer/%这三个文件%。
    3. 获取以下代码并注意顶部“链接”到您的 PHPMailerAutoload.php。把它放在一个名为“ma​​il.php”(或任何你想要的)的文件中:

      <?php
      
      require '../vendor/phpmailer/PHPMailerAutoload.php';
      
      $mail = new PHPMailer;
      
      //$mail->SMTPDebug = 3;                               // Enable verbose debug output
      
      $mail->isSMTP();                                      // Set mailer to use SMTP
      $mail->Host = 'smtp.hostname.com';  // Specify main and backup SMTP servers
      $mail->SMTPAuth = true;                               // Enable SMTP authentication
      $mail->Username = 'username';                 // SMTP username
      $mail->Password = 'password';                           // SMTP password
      $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
      $mail->Port = 587;                                    // TCP port to connect to
      
      $mail->SMTPOptions = array(
      'ssl' => array(
      'verify_peer' => false,
      'verify_peer_name' => false,
      'allow_self_signed' => true
      )
      );
      
      $mail->setFrom('hello@example.com', 'Name');
      $mail->addAddress('to@example.com', 'To Name');     // Add a recipient                              // Name is optional
      $mail->addReplyTo('hello@example.com', 'Name');
      //$mail->addCC('cc@example.com');
      //$mail->addBCC('bcc@example.com');
      
      //$mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
      //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
      $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';
      
      if(!$mail->send()) {
      echo 'Message could not be sent.';
      echo 'Mailer Error: ' . $mail->ErrorInfo;
      } else {
      echo 'Message has been sent';
      }
      ?>
      

    (请注意,我注释掉了一些您可能不需要但可能很好的东西。请查看https://github.com/PHPMailer/PHPMailer/wiki 上的 PHPmailer git hub 网站以获取更多调整)。

    1. 现在您只需要运行“mail.php”,它就会发送一封电子邮件。当然,您必须使用真正的 SMTP 服务器(也可以使用 Gmail,但请检查 PHPmailer)。一旦你看到它在运行,你可以调整它以在你的整个 php 应用程序中工作。您必须构建一个新函数来代替 PHP mail() 使用。为什么?我将在下一段中继续讨论

    背景/说明
    在许多线程中都假设 PHP 的名为 Sendmail 或 mail() 的本机函数在 EC2(或 Beanstalk)上不起作用。不对。它确实有效。它只是坐在那里,不知道该做什么。运行 phpinfo.php 并查找 Sendmail。但它指向本地主机。所以它的工作方式与您的本地主机相同,它将邮件发送到您的本地主机。哪个没有设置,所以无论如何你都看不到电子邮件(除非你使用 shell 来阅读它,没有人这样做)。 而且,正如一些人指出的那样,由于扩展和其他原因,您不应该将(至少相同的)Beanstalk EC2 设置为邮件服务器,但主要是因为它很难看。 还有其他方法可以解决问题。使用 Amazon SES 是一种经常被推荐的解决方案。很公平,如果您想发送数千封邮件并确保它正常工作。它也有成本,但对于 1000 封邮件的当前定价为 0.10 美元,这几乎没有什么价值。所以没有真正的争论。 SES 还可以提供 SMTP 服务器,并且可以在上面的示例中使用。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      对于 AWS 上的电子邮件托管,您可以使用 WorkMail 或在 EC2 实例上配置邮件服务器。除非您寻求第三方邮件托管服务,否则这些是您唯一的选择。这两种方法都有很多教程,所以我不会在这里讨论。

      您不想在 Elastic Beanstalk 服务器实例上运行邮件服务器。如果您的应用程序扩展,这将导致创建重复的邮件服务器,每次更新应用程序时都会删除邮件服务器,并且通常会出现各种问题。如果您想在 EC2 上托管邮件服务器,则需要创建一个不受 Beanstalk 控制的单独 EC2 实例。

      要通过 SMTP 从您的 Elastic Beanstalk 服务器发送电子邮件,您可以使用您选择和配置的任何邮件托管服务,或者使用 SMTP 电子邮件递送服务(例如 Amazon SES)或第三方服务(例如 SendGrid)。

      【讨论】:

      • 嗯,非常感谢您的回答,但我认为您并没有回答我所有的问题。我也很清楚我不想使用 Workmail 或 SES,因为它们的成本很高。无论如何,正如我所说,我对发送和接收电子邮件感兴趣,而不仅仅是发送。我也可以将邮件服务器放在弹性 beanstalk 使用的同一个 EC2 实例上,因为我使用 SSH 更新应用程序,所以它
      • @SamBen 如果您不使用 ElasticBeanstalk 来部署软件更新,为什么还要使用它?您是否也将其限制为始终只有 1 台服务器?如果是这种情况,那么您没有使用 Beanstalk 的任何功能,而应该使用标准 EC2 实例。如果您只想了解在 EC2 实例上设置邮件服务器的详细说明,那么快速的 Google 搜索将为您提供所需的一切。
      • @mbraird,谢谢你的回答,我真的理解你的担心,现在我只是想熟悉弹性豆茎,一旦我成功正确设置一切,我将使用弹性豆茎应该如何使用它(顺便说一下,我没有将我的应用程序限制在一台服务器上,我使用的是负载均衡器,最多有 5 台服务器。到目前为止,我已经在服务器上安装了 postfix,我可以发送电子邮件,但我无法接收电子邮件(我已经打开了 smtp 端口)。无论如何,如果您能解释更多我应该做什么的步骤或至少将我推荐给有用的 Tutos,我将不胜感激
      • @SamBen 那么您绝不应该使用 ElasticBeanstalk 来托管邮件服务器。如果你不喜欢这个答案,我很抱歉,但我只是告诉你真相。如果您想要有关在 EC2 实例上设置邮件服务器的教程,请尝试搜索。
      • 我知道这是一个旧答案......但我想澄清一下,elasticbeanstalk 不能用作邮件服务器是不正确的,因为它会创建“重复的邮件服务器”,你只需要一个可以通过集群支持多个主机/服务器的邮件服务器。这并不“难”,但也不像使用mail() 那样容易。
      猜你喜欢
      • 2022-01-18
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多