使用 SwiftMailer 發送電子郵件時,Digital Ocean 出現錯誤 500
當聯繫表格送出到我的網站時,我正嘗試從我的輔助電子郵件地址向我的主電子郵件地址發送一封電子郵件。我正在使用Swiftmailer來實現這一點。當我在電腦上的 XAMPP 伺服器上離線使用該程式碼時,該程式碼執行良好,但是當我嘗試在執行 LAMP 堆棧的 Digital Ocean Droplet 上執行它時,這與我的離線設置幾乎相同,它不起作用並返回錯誤 500。
我調查了一下,結果發現,SMTP 被禁用以防止垃圾郵件,如果我聯繫支持,它可以被解除。在我聯繫他們之後,他們告訴我他們無法解除對埠 25 的限制,但告訴我嘗試其他埠,並且 SMTP 不適用於浮動 IP。我刪除了我的浮動 IP 來幫助解決這個問題,我目前正在嘗試將埠 578 與 Hotmail 電子郵件地址一起使用,但它仍然無法正常工作。
到目前為止我已經嘗試過:
我使用此命令打開了 Digital Ocean Support 建議的 587埠。
sudo iptables -A INPUT -p tcp --dport 587 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 587 -m conntrack --ctstate ESTABLISHED -j ACCEPT
之後,我的伺服器就可以在 587 埠連接到 smtp.office365.com,如下面的命令所示:
nc -vz smtp.office365.com 587 Connection to smtp.office365.com 587 port [tcp/submission] succeeded!
命令“ufw status”顯示埠 587 在 ipv4 和 ipv6 上都是打開的:
To Action From -- ------ ---- 22/tcp LIMIT Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere 3306/tcp ALLOW Anywhere 587/tcp ALLOW Anywhere 22/tcp (v6) LIMIT Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443/tcp (v6) ALLOW Anywhere (v6) 3306/tcp (v6) ALLOW Anywhere (v6) 587/tcp (v6) ALLOW Anywhere (v6)
但是,當我嘗試執行聯繫表單時,它最終無法在 droplet 上執行,而它確實可以離線執行,並且我按預期收到了電子郵件。
有什麼我想念的嗎?
我將在下面附上我的 swiftmailer 部分的程式碼,以防它有助於辨識我似乎遺漏的程式碼中的任何潛在錯誤。
include_once 'private/pass.inc.php'; //These fields usually get the data using a a form using POST method and PHP but left with placeholders here for the sake of simplicity. $name = 'name'; $email = 'email'; $phone = 'phone'; $subject = 'subject'; $message = 'message'; // Send Email // Create the Transport $transport = (new Swift_SmtpTransport('smtp.office365.com', 587, 'tls')) ->setUsername($emailusername) ->setPassword($emailpassword); // Create the Mailer using your created Transport $mailer = new Swift_Mailer($transport); function sendVerificationEmail($name, $email, $phone, $subject, $message) { global $mailer; $sentfrom = "secondary@example.com"; $sentto = "primary@example.com"; $body = 'Message From:' . $name . '<br>' . $email . '<br>' . $phone . '<br>' . $subject . '<br>' . $message; // Create a message $message = (new Swift_Message("A New Message From " . $name)) ->setFrom([$sentfrom]) ->setTo([$sentto]) ->setBody($body, 'text/html'); // Send the message $result = $mailer->send($message); } sendVerificationEmail($name, $email, $phone, $subject, $message); echo "<script> window.location.assign('./contactformsuccess'); </script>";
編輯:添加日誌
[Sun Aug 15 07:34:58.851255 2021] [php:warn] [pid 182629] [client 162.158.167.91:37848] PHP Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php on line 94 [Sun Aug 15 07:34:58.851487 2021] [php:error] [pid 182629] [client 162.158.167.91:37848] PHP Fatal error: Uncaught Swift_TransportException: Unable to connect with TLS encryption in /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php:349\nStack trace:\n#0 /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php(148): Swift_Transport_EsmtpTransport->doHeloCommand()\n#1 /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php(65): Swift_Transport_AbstractSmtpTransport->start()\n#2 /var/www/site.com/html/includes/cf2.inc.php(39): Swift_Mailer->send()\n#3 /var/www/site.com/html/includes/cf2.inc.php(42): sendVerificationEmail()\n#4 {main}\n thrown in /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php on line 349
我解決了。我將我的 Microsoft 身份驗證器應用程序連接到我嘗試使用的輔助帳戶,因此它拋出了錯誤。我沒有啟用 2 因素身份驗證,但它仍然導致問題,所以我斷開了它。
我還用這個更新了 swiftmailer 傳輸:
// Create the Transport $transport = (new Swift_SmtpTransport('smtp.live.com', 587, 'tls')) ->setUsername($emailusername) ->setPassword($emailpassword) ->setStreamOptions(array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false, 'verify_peer_name' => false)));
兩者結合,解決了我的問題。電子郵件現在按預期通過。