使用 SwiftMailer 發送電子郵件時 Digital Ocean 出現錯誤 500

使用 SwiftMailer 發送電子郵件時 Digital Ocean 出現錯誤 500

當聯絡表單提交到我的網站時,我試圖從我的輔助電子郵件地址向我自己發送一封電子郵件到我的主電子郵件地址。我在用斯威夫特梅勒為了達成這個。當我在電腦上的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 = "[email protected]";
    $sentto = "[email protected]";
    $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

答案1

我解決了。我將我的 Microsoft 身份驗證器應用程式連接到我嘗試使用的輔助帳戶,因此它拋出錯誤。我沒有啟用兩因素身份驗證,但它仍然導致問題,所以我斷開了它。

我還用以下內容更新了 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)));

兩者結合起來,解決了我的問題。電子郵件現在按預期進行。

相關內容