Ошибка 500 в Digital Ocean при использовании SwiftMailer для отправки электронной почты

Я пытаюсь отправить себе электронное письмо со своего второго адреса электронной почты на мой основной адрес электронной почты, когда на мой веб-сайт отправляется контактная форма. Для этого я использую Swiftmailer . Код работает отлично, когда я использую его в автономном режиме на моем сервере XAMPP на моем компьютере, но когда я пытаюсь запустить его на моем Digital Ocean Droplet, работающем со стеком LAMP, который почти идентичен моей автономной настройке, он не работает и возвращается ошибка 500.

Я изучил это, и оказалось, что SMTP отключен для предотвращения спама, и его можно отменить, если я свяжусь со службой поддержки . После того, как я связался с ними, они сказали мне, что не могут снять ограничение на порт 25, но посоветовали мне попробовать альтернативные порты и что SMTP не работает с плавающими IP-адресами. Я удалил свой плавающий IP-адрес, чтобы помочь с этим, и в настоящее время пытаюсь использовать порт 578 с адресом электронной почты Hotmail, но он все еще не работает.

Что я пробовал до сих пор:

Я использовал эту команду, чтобы открыть порт 587, как было предложено Digital Ocean Support здесь .

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

После этого мой сервер может подключаться к smtp.office365.com на порту 587, как показано следующей командой:

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)

Но когда я пытаюсь запустить контактную форму, она не работает в конец на капле, в то время как он отлично работает в автономном режиме, и я получил электронные письма, как и предполагал.

Что-то мне не хватает?

Я приложу код для моей части 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>";

РЕДАКТИРОВАТЬ: добавлены журналы

[Вс, 15 августа, 07:34: 58.851255 2021] [php: warn] [pid 182629] [client 162.158.167.91:37848] Предупреждение PHP: stream_socket_enable_crypto (): операция SSL завершилась неудачно с кодом 1. Ошибка OpenSSL messages: \ nerror: 1416F086: Процедуры SSL: tls_process_server_certificate: проверка сертификата не удалась в /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php в строке 94 [вс, август 15 07: 34: 58.851487 2021] [php: error] [pid 182629] [client 162.158.167.91:37848] Неустранимая ошибка PHP: Uncaught Swift_TransportException: невозможно подключиться с шифрованием TLS в /var/www/site.com/html/ vendor / swiftmailer / swiftmailer / lib / classes / Swift / Transport / EsmtpTransport.php: 349 \ n Трассировка стека: \ n # 0 /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/ Транспорт / AbstractSmtpTransport.php (148): Swift_Transport_EsmtpTransport-> doHeloCommand () \ n # 1 /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php_65) ort-> 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 добавлено в /var/www/site.com/html/vendor/swiftmailer/swiftmailer/lib/classes/ Swift / Transport / EsmtpTransport.php в строке 349

0
задан 15 August 2021 в 07:27
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)));

Оба этих решения решили мою проблему. Теперь электронная почта проходит, как и предполагалось.

0
ответ дан 15 August 2021 в 08:26

Теги

Похожие вопросы