PHPMailer - скрипт зависает на 20 секунд после открытия SMTP-соединения для одного запроса электронной почты

Я начну с того, что у меня нет проблем с отправкой успешных писем с помощью PHPMailer. В этом отношении он работает так, как задумано. Сценарий PHPMailer работает, и это может быть даже не проблема, связанная с PHPMailer. Однако существует 20-секундная задержка «обработки», которая происходит каждый раз, когда я пытаюсь запустить самый простой скрипт.

По сути, это портит любой внешний интерфейс, который вызывает проблему для моего предполагаемого варианта использования (контактная форма). Обратите внимание, что мое тестирование проводилось исключительно на примере кода, рекомендованного Github, никакой внешний код не добавлялся сверх необходимой конфигурации.

Сценарий отправляет базовое однократное электронное письмо. Пакетная или массовая отправка не требуется. Мой код и журнал отладки PHPMailers размещены ниже. Пожалуйста, проверьте журнал отладки - после того, как начальное соединение открыто, существует 20-секундная задержка между открытием соединения и первым статусом «220». Я недостаточно сведущ, чтобы точно понять, что это значит, и я надеялся получить некоторую ясность по этому поводу. Простой поиск в Google показывает, что 220 означает, что доменная служба готова. Но что на самом деле происходит в эти 20 секунд? Что вызывает зависание? 20 секунд слишком долго для отправки одного письма.

Я исследовал задержки по проблемам SMTP и PHPMailer уже более недели, и я не могу найти никакой хорошей информации, которая дает прямой ответ на эту проблему. Однако я нашел рекомендации:

  1. Используйте локальный хост для получения почты. (Я не могу этого сделать, у меня нет возможности запускать собственный почтовый сервер 24/7)

  2. Создайте почтовую очередь и пакетную отправку в другом потоке (задание cron и т. д.). Обратите внимание, что я делал это раньше для гораздо более крупного проекта. Но, учитывая, что этот вариант использования будет для базовой контактной формы, я чувствую, что это немного излишне. Поддержание базы данных для отправки одного электронного письма не требуется. У меня также нет необходимости в массовой рассылке. Каждое электронное письмо всегда будет единственным электронным письмом, и в идеале оно должно быть получено немедленно, а не через определенные промежутки времени, т.е. работа с хроном.

  3. Ваш веб-хостинг - мусор. (Вероятно, это плохо) У меня нет опыта в том, кто лучший, а кто худший. Я размещен через Hostinger, и, к сожалению, я фактически заблокирован на 4 года без убытков.

--

Есть ли кто-нибудь, кто понимает, что на самом деле здесь происходит? Может быть, у кого-то была похожая проблема? Кто-то, кто может принять журналы отладки более чем за чистую монету и может прояснить, что вызывает 20-секундную задержку для каждого сценария. Или любые возможные решения, которые позволят мне продолжать использовать SMTP, но без задержки. Это почти всегда ровно 20-21 секунда.

(В настоящее время при ручном отключении SMTP из сценария это устраняет 20-секундную задержку, но, по сути, возвращает код для строгого использования функции php mail(), что, как я слышал, является плохой практикой. Я хотел бы иметь возможность сохранить передовой опыт , который, как я слышал, это SMTP/PHPMailer)

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это метод защиты от спама, который называется «greetdelay», и будет осознанным выбором, реализованным вашим почтовым провайдером. Спецификация SMTP говорит, что клиенты должны дождаться ответа сервера, прежде чем начинать транзакцию SMTP. Клиенты с плохим поведением (например, спам-скрипты) не ждут, и сервер разорвет соединение и, возможно, заблокирует последующие соединения с этого IP-адреса, если они начнут говорить слишком рано.

PHPMailer хорошо себя ведет (он будет ждать, как вы видите), однако это действительно подчеркивает, что SMTP не рекомендуется использовать во время интерактивной обработки HTTP-запросов, что упоминается в документации PHPMailer.

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

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

Оцените ответ! Я рассмотрю решение для локального почтового сервера. Я, должно быть, не совсем понимаю, что это влечет за собой, поскольку я думал, что это означает запуск моего собственного почтового сервера (на моем личном ПК). Если бы я мог использовать свой сервер Hostinger для этого, это сработало бы. Я считаю, что Hostinger разрешает доступ для записи только за пределами public_html/*, поскольку я пытался подключиться по SSH и манипулировать файлами до этого момента, но безуспешно. Не уверен, что это вообще имеет значение. Мне придется исследовать, как получить эту настройку. Еще раз спасибо.

Corey 13.01.2023 15:17

Если у вас есть общая учетная запись хостинга (вероятно, если вы платите от 0 до ~ 3 долларов в месяц), это может быть не вариант, однако в этой ситуации хостинг-провайдер обычно предоставляет вам почтовый сервер — проверьте их документы. . Например, даже мрачный богиня делает это.

Synchro 14.01.2023 14:45

Да. Вчера я проверил ситуацию с хостингом, и да, у меня план общего хостинга без root-доступа. Похоже, мне нужно будет перейти на VPS, чтобы получить эти привилегии. Я посмотрю, есть ли у них что-то, что я могу использовать, если нет, я, скорее всего, просто выполню задание почтовой очереди/cron. Таким образом, внешний интерфейс по-прежнему в основном мгновенный и просто обрабатывается за кулисами. У меня нет большого количества системных администраторов/сетей или любой другой электронной почты, связанной со всей конфигурацией/настройкой. Хорошая работа над PHPMailer — эта часть была легкой. Я ценю помощь и понимание.

Corey 14.01.2023 16:17

Это может быть просто взлом, но будет ли это уязвимостью: [contactForm] --> (no smtp / isSendmail();) --> [[email protected]] --> (автопереадресация *, которая использует автоматический smtp с веб-хоста) --> [статический gmail владельца контактной формы]. Это будет мгновенно, а также будет защищено, пока оно находится в Gmail. Имеет ли значение, если он не был отправлен по SMTP на [[email protected]], если он все равно будет прочитан на gmail? Извините, если это глупая идея. Я имею в виду, это работает, но я не знаю, приемлемо ли это. Отличается ли этот сценарий безопасностью/удобством использования или чем-либо по сравнению с предложением локального почтового сервера/ретранслятора?

Corey 14.01.2023 22:11

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

Synchro 15.01.2023 12:32

Когда он получен из учетной записи gmail через «автопереадресацию» с почтового сервера моего домена. В нем говорится, что «Отправлено по почте» и «Подписано» являются правильным доменом и защищены TLS (согласно примечанию gmail). Я думаю, это означает, что мой DKIM работает. Мне действительно не хватает знаний об этом приключении в целом, но, похоже, это совпадает с другими электронными письмами, которые я вижу из авторитетных источников. Извините, что я не могу объяснить описанный выше процесс очень хорошо. Вероятно, результат того, что я не знаю, о чем говорю. Ненавижу возвращать вас к этому сообщению. Не нужно отвечать. Спасибо за вашу помощь!

Corey 15.01.2023 17:16

Другие вопросы по теме

Логика и безопасность электронной почты PHP/MYSQL
Найти электронную почту Outlook с помощью идентификатора электронной почты или расширенного свойства с помощью VBA
Как вставить определенное значение ячейки из листа Excel в строку темы Outlook с помощью макроса?
CSS из моих шаблонов электронной почты не работает в электронной почте Yahoo
Из кадра данных в тело электронной почты автоматически, несколько проблем с форматированием: разделитель тысяч, цвет (красный для отрицательного числа и зеленый для положительного)
Повторная обработка недоставленной почты Outlook
Как прикрепить несколько файлов к почте Laravel 8 из laravel Excel 3.1
Хотите отправить электронное письмо Outlook из Python с помощью win32com.client с другого адреса электронной почты, который используется по умолчанию
Как запустить скрипт Python при отправке электронной почты Outlook?
C# Для SMTP-сервера требуется безопасное соединение, иначе клиент не прошел проверку подлинности. Ответ сервера был: 5.7.0 Требуется аутентификация