AWS Elastic Beanstalk-MAIL(发送和接收电子邮件)

Sam*_*Ben 3 email smtp amazon-ec2 amazon-web-services amazon-elastic-beanstalk

好吧,我刚刚使用Elastic beanstalk设法将Web应用程序从共享托管服务迁移到AWS。但是,我在努力使用电子邮件服务。

好了,我的应用程序在注册后(使用SMTP)发送了验证电子邮件,并且看起来用户没有收到电子邮件。(我仍在使用共享主机的SMTP帐户)

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

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

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

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

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

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

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

附言:请回答非常清楚和详细的答案,这样我就会理解,并且每个人都有同样的问题。

Mar*_*k B 5

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

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

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


小智 5

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

问题
您正在AWS Beanstalk EC2上使用PHP。您的应用程序使用PHP本机函数mail();。当您上载和部署应用程序时,它似乎不起作用。

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

  1. https://github.com/PHPMailer,下载它如果您喜欢软件包管理,Composer等,可以使用它,但是如果您喜欢我,只是想要一件小巧而干净的东西,则只需要以下文件:

    • class.phpmailer.php
    • class.smtp.php
    • PHPMailerAutoload.php
  2. 将这些文件放在您自己的文件夹结构中,例如vendor / phpmailer /%此处的三个文件%。
  3. 采取以下代码,并注意顶部是“链接”到您的PHPMailerAutoload.php。将其放在名为“ mail.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';
    }
    ?>
    
    Run Code Online (Sandbox Code Playgroud)

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

  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服务器,并且可以在以上示例中使用。

我希望这有帮助。