Я пытаюсь реализовать функцию сброса пароля на моем веб-сайте компании, где, если пользователь должен восстановить свой пароль, она может нажать на ссылку, и новый, случайно сгенерированный пароль будет отправлен в ее почтовый ящик.
Я использую функцию PHP mail()
. Теперь я запускаю PHP5 на машине Ubuntu. В php.ini я объявил SMTP как IP-адрес машины, на которой запущен почтовый сервер, а smtp_port – 25. Далее я попытался подключиться telnet к почтовому серверу на порт 25 и отправить почту – он работает (мой рабочий терминал – Windows) ,
Проблема в том, что почта не отправляется / не принимается – скрипт PHP, вызывающий mail()
зависает около 1 минуты, в конце которого mail()
возвращает true
.
Хуже всего то, что я не в курсе, как узнать, где лежит проблема – с PHP, с Ubuntu, с почтовым сервером или с кодом!
Может ли кто-нибудь помочь?
Я недавно не смотрел php.ini, но не говорит:
[mail function] ; For Win32 only. ;SMTP =
Акцент делается только на Win32 .
Возможно, вы захотите посмотреть на PEAR :: Mail . Когда pear.php.net действительно отвечает, то есть.
Можете ли вы проверить файлы mail.err и mail.log?
Возможно, вашему почтовому серверу требуется аутентификация («POP before SMTP» или ASMTP – аутентифицированный SMTP). Поскольку вы, вероятно, недавно проверили свою электронную почту с вашего компьютера Windows, ваш IP-адрес будет аутентифицирован и разрешен для отправки электронной почты в течение короткого времени: с вашей машины Ubuntu, вероятно, нет.
На машине Ubuntu проверьте, не можете ли вы использовать IP-адрес своего SMTP-сервера: PHP должен решить, как отправить сообщение по электронной почте в любом случае. В противном случае вам нужно будет узнать, как аутентифицироваться на сервере электронной почты и внедрять его в PHP.
Попробуйте отправить электронное письмо с почтовой программой из оболочки. Сначала посмотрите, работает ли это.
Проблема с вашим интернет-провайдером. Порт 25 часто блокируется интернет-провайдерами для предотвращения массового спама. Попробуйте перейти на нестандартный порт и посмотрите, поможет ли это.
Изменить: И вот что-то детализирует проблему (хотя их решение заключается в передаче на почтовый сервер ISP, а не на изменении портов).
Вам нужен почтовый класс SMTP Zend Framework, например, потому что эта глупая версия php-интерфейса Braindead не работает с портами SMTP в Unix.
Подпишитесь на рассылку PHP Core и жалуйтесь на нее – возможно, они меняют ее, если все больше и больше людей приходят, и они видят, что не все, что такое sendmail.
Также можно обойти функцию mail () php с помощью почтовой библиотеки. Например, SwiftMailer ( http://swiftmailer.org/ ) Это действительно хороший класс для безопасной отправки электронной почты (plain / html).
С помощью этого класса вы можете напрямую подключиться к SMTP-серверу и, таким образом, обойти конфигурацию сервера.