PHP Почтовая команда Отправка почты

#php #email #sendmail

Вопрос:

У меня есть проблема, которая уже некоторое время ставит меня в тупик, независимо от того, куда я смотрю, я не могу найти объяснение тому, что я вижу.

У меня есть сервер, который рассылает по сценарию несколько электронных писем, основанных на определенных критериях. Если задание сталкивается с проблемой, такой как отсутствие клиентов (между двумя системами) или отсутствующие коды продуктов (между двумя системами), или если оно обновляет устаревшую систему из более новой системы с заказами. Теперь эти сценарии работают в нескольких местах по всей Европе: Хельсинки, Лулео, Стокгольме и Осло.

Моя загадка заключается в том, что для Стокгольма и для определенных событий электронные письма не рассылаются! Они предназначены для других мест и других событий, но есть два, которые уходят в самоволку. Когда я говорю «уйти в самоволку», я говорю так, как будто они отправлены, но никогда не были получены, правда в том, что на самом деле они не покидают сервер, о котором идет речь.

Почтовая команда PHP выдает ошибку при попытке отправить в Стокгольм два события, это фиксируется путем отслеживания возврата почтовой команды PHP и регистрации, если возврат является ложным. Просматривая файлы журнала sendmail для записей, как выходных данных, так и ошибок, в то же время, когда выдается неудачная почтовая команда PHP, их нет! Включив ведение журнала почты PHP, я вижу, что он выдает команду нормально, но по какой-то причине команда работает неправильно.

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

Если бы проблема была случайной, я бы ожидал увидеть сбои в других местах и других событиях, но это не так. Я считал, что строка темы была слишком длинной, но есть и более длинные, и тогда она не должна проходить через мой автономный тестовый почтовый скрипт. Я изменил порядок, в котором обрабатываются местоположения, но, опять же, он очень последователен в том, что он терпит неудачу по тем же причинам.

Итак, вкратце:

  • Одно место для двух событий не рассылает никаких электронных писем, но другие события и места рассылаются.
  • Почтовая команда PHP завершается ошибкой и возвращает ЛОЖНЫЙ код ошибки.
  • Файл почтового журнала PHP показывает вызываемую почтовую команду.
  • Файлы журнала sendmail не записывают неудачные почтовые команды ни в err, ни в обычном выводе, хотя я вижу все другие успешные электронные письма.
  • Изменение имени местоположения не имеет значения, но это не имело бы значения, так как другие события отправляются нормально.
  • Заполнение тестового сценария темой и телом неудачного сообщения электронной почты, отправляет ok (тестовый сценарий идентичен основному сценарию).
  • Изменение порядка местоположений, вызываемых сценарием, не имеет значения (сценарий имеет дело с одним местоположением за раз).

Любые идеи о том, где искать, что проверять дальше, я весь внимание и уши. Спасибо.

Комментарии:

1. Если вы используете встроенную mail функцию PHP, то извините, что нет простого способа получить фактическую проблему/ошибку, из-за которой почта не отправляется. Чтобы разобраться в вашей проблеме, не могли бы вы поделиться командой «Почта»? Кроме того, если у вас есть возможность использовать PHP Mailer , попробуйте отладить проблему

2. Может быть, это поможет mikeberggren.com/post/48826934174/sendmail-debug — вы можете попробовать создать файл журнала отладки.

3. какой транспорт вы используете для отправки почты, через логин SMTP или Sendmail или Postfix в Linux?

4. Проверьте этот пост, если что-то поможет pritthish-nath.medium.com/…

5. @JimGrant Как вы уже упоминали, письма проходят через тестовый сценарий, но не через основной сценарий, поэтому, пожалуйста, поделитесь своим почтовым сценарием как тестовым, так и фактическим

Ответ №1:

Я должен поблагодарить тех, кто ответил на мой вопрос, однако, я наконец-то добрался до сути этого вопроса (он говорит, скрестив пальцы).

В то время как почтовая команда PHP отказывала, но только для определенного местоположения, я решил посмотреть, в чем, по мнению PHP, заключалась ошибка. Это было достигнуто путем вставки кода:

         if($success === true)
            echo("Email sent @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
        else
        {
            echo("Unable to send email @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
            print_r(error_get_last());
        }
 

Печать «error_get_last()» показала, что команда sendmail не может быть выполнена:

 Array
(
    [type] => 2
    [message] => mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i '
    [file] => /var/www/html/dataloader/angleConvertClass.php
    [line] => 205
)
 

Изучая, почему это может произойти, я где-то наткнулся на сообщение, в котором говорилось об использовании памяти, и нехватка доступной памяти может привести к тому, что внешние программы не будут выполняться. Поэтому я решил посмотреть, сколько памяти потреблял PHP — скрипт непосредственно перед тем, как была выдана команда mail.

         try
        {
            print "n--> PHP Memory usage ".memory_get_usage(true)." bytes <--n";

            $success = mail($to, $subject, $body, $header_string);
            $local_db->setMessageSent($to.$body);

            if($success === true)
                echo("Email sent @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
            else
            {
                echo("Unable to send email @ ".date("Y-m-d H:i:s")." - $to, $subject".PHP_EOL);
                print_r(error_get_last());
            }
        }
        catch (Exception $exc)
        {
            echo("Email failed big time @ ".date("Y-m-d H:i:s")."! $to, $subject".PHP_EOL);
            echo $exc->getTraceAsString().PHP_EOL;
        }
 

Оставив его на некоторое время, я затем перепроверил файл журнала и обнаружил, что PHP-скрипт потребляет более 32 ГБ памяти! На сервере 32 ГБ основной памяти и 6 ГБ подкачки, поэтому я предполагаю, что этого достаточно для запуска сценария, но недостаточно для запуска исполняемых файлов.

Я хочу добавить, что это программное обеспечение, которое я унаследовал, а не написал, и мне немного не хотелось его переписывать, так как это было временное решение проблемы 2 года назад. Код загружает результаты из базы данных из устаревшей системы для сравнения с результатами из новой системы, используя очень большие массивы. Следовательно, огромный объем памяти!

Я попросил увеличить основную память сервера с 32 ГБ до 64 ГБ, так как это будет бесконечно дешевле, чем переписывать и тестировать код. Надеюсь, это решит проблему.