簡體   English   中英

AWS Elastic Beanstalk - MAIL(發送和接收電子郵件)

[英]AWS Elastic Beanstalk - MAIL (Sending and receiving emails )

我剛剛設法將我的Web應用程序從共享托管服務遷移到AWS,使用Elastic beanstalk。 但是我正在努力處理電子郵件服務。

我的應用程序在注冊時(使用SMTP)發送驗證電子郵件,並且看起來用戶沒有收到電子郵件。 (我還在使用共享主機的SMTP帳戶)

此外,在使用共享托管服務時,我曾使用我們的網站域名為其他團隊成員創建郵件帳戶,例如(noreply@domain.com)。

好吧,我試圖找到一個關於我的問題的好答案,但沒有一個問題完全滿足我的需求。

有些人建議SES只發送電子郵件和WorkMAil來接收電子郵件。

在我的情況下,我不想使用其他服務。因為我的網站非常小,所以我希望有人能夠清楚地回答以下問題:

1-如何允許彈性beanstalk應用程序使用smtp發送電子郵件。

2-如何在EC2實例上設置Webmail(接收和發送電子郵件),或者至少在ec2實例上設置郵件服務,以及使用其他客戶端(例如outlook)發送電子郵件。

3-如何使用網站的域名創建SMTP帳戶或不同的電子郵件帳戶。

PS:請回答非常明確和詳細的答案,以便我理解,並且每個人都可能遇到同樣的問題。

對於AWS上的電子郵件托管,您可以使用WorkMail或在EC2實例上配置郵件服務器。 除非您查看第三方郵件托管服務,否則這些是您唯一的選擇。 任何一個選項都有很多教程,所以我不會在這里討論。

您不希望在Elastic Beanstalk服務器實例上運行郵件服務器。 如果您的應用程序擴展,每次更新應用程序時都會刪除郵件服務器,以及通常會出現各種問題,這將導致創建重復的郵件服務器。 如果要在EC2上托管郵件服務器,您可能希望創建一個不受Beanstalk控制的單獨EC2實例。

要通過SMTP從Elastic Beanstalk服務器發送電子郵件,您可以使用您選擇和配置的任何郵件托管服務,或使用SMTP電子郵件傳遞服務(如Amazon SES)或第三方服務(如SendGrid)。

因為我最近遇到了同樣的問題(php mail()似乎沒有在Beanstalk上工作) - 我將分享一些見解。 也許已經在這里說過了,但后來把它看成是工作端的解決方案。

問題
您正在AWS Beanstalk EC2上使用PHP。 您的應用程序使用名為mail();的PHP本機函數。 當您上傳和部署應用程序時,它似乎不起作用。


1.在PHPmailer中使用SMTP。 (我將在下面解釋原因)。

  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'; } ?> 

(請注意,我注釋了一些您可能不需要的東西,但可能會很好。請訪問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。 但它指向localhost。 因此它的工作方式與localhost相同,它會將郵件發送到您的localhost。 這不是設置,所以你不會看到電子郵件(除非你使用shell來閱讀它,沒有人這樣做)。 並且,正如一些人所指出的,你不應該設置你的(至少相同的)Beanstalk EC2作為郵件服務器,因為它有縮放和其他原因,但主要是因為它很難看。 還有其他方法可以解決這個問題。 使用Amazon SES是一種經常提出的解決方案。 很公平,如果你想發送數千封郵件並確保它有效。 這也是成本,但1000張郵件的當前定價為0.10美元幾乎沒有。 所以沒有真正的爭論。 SES還可以提供SMTP服務器,可以在上面的示例中使用。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM