Назад | Перейти на главную страницу

Невозможно отправить почту через php скрипт

Я установил сервер со следующими настройками:

CentOS release 6.3 (Final)
Kernel \r on an \m

Linux version 2.6.32-279.14.1.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Tue Nov 6 23:43:09 UTC 2012

Я установил Qmail и Cron.

Когда я отправляю электронное письмо через интерфейс Webmin (используя Qmail), оно приходит. Однако, когда я пытаюсь отправить электронное письмо через скрипт php, я получаю следующее сообщение об ошибке в /var/log/maillog:

Failed to create spool file /var/spool/exim/input//1V8rf1-0005w0-Jx-D: Permission denied
Cannot open main log file "/var/log/exim/main.log": Permission denied: euid=93 egid=93
exim: could not open panic log - aborting: see message(s) above

И в /var/log/virtualmin/[host]_error_log:

PHP Fatal error:  <br /><strong>Uncaught Error</strong> of type [Swift_ConnectionException] with message [Sending failed using mail() as PHP's default mail() function returned boolean FALSE

Мне кажется, что это какая-то проблема с разрешением (или проблема с qmail и exim), однако я не могу решить ее после нескольких дней исследований. У меня установлены Webmin и Virtualmin.

Дополнительная информация о разрешениях:

$ ls -l /var/spool/exim/
total 32
drwxrwxrwx. 2 exim exim  4096 Oct 28  2012 db
drwxrwxrwx. 2 exim exim 24576 Aug  9 16:52 input
drwxrwxrwx. 2 exim exim  4096 Aug  9 16:52 msglog

$ ls -l /usr/sbin/exim
-rwsr-xr-x. 1 root root 1118184 Oct 28  2012 /usr/sbin/exim

Есть предложения? Помощь будет очень признательна.

Первая часть Система exim требует, чтобы каталоги спула и каталоги журналов были доступны для записи пользователем exim (пользователем, от имени которого запускается процесс). Простым исправлением для exim было бы:

chown -R exim:exim /var/spool/exim /var/log/exim

Вторая часть Обычно существует оболочка / usr / sbin / sendmail, которая на самом деле является просто символической ссылкой на то, что обеспечивает «совместимость с sendmail» в вашей системе. Когда вы устанавливаете exim, он создает символическую ссылку / usr / sbin / sendmail, которая в конечном итоге указывает на / usr / sbin / exim. [1] Когда вы удалили пакет exim, он удалил ссылку / usr / sbin / sendmail. Когда cron запускает задание, он запускает его и передает его в / usr / sbin / sendmail. Поскольку его больше нет, задание не запускается полностью.

Предпочтительным исправлением является использование системы «альтернатив» для обновления каждого из компонентов mta, которыми управляет система «альтернатив»:

# ls /etc/alternatives/ -l | grep mta
lrwxrwxrwx 1 root root 23 Aug 14 12:33 mta -> /usr/sbin/sendmail.exim
lrwxrwxrwx 1 root root 19 Aug 14 12:33 mta-mailq -> /usr/bin/mailq.exim
lrwxrwxrwx 1 root root 29 Aug 14 12:33 mta-mailqman -> /usr/share/man/man8/exim.8.gz
lrwxrwxrwx 1 root root 24 Aug 14 12:33 mta-newaliases -> /usr/bin/newaliases.exim
lrwxrwxrwx 1 root root 15 Aug 14 12:33 mta-pam -> /etc/pam.d/exim
lrwxrwxrwx 1 root root 19 Aug 14 12:33 mta-rmail -> /usr/bin/rmail.exim
lrwxrwxrwx 1 root root 19 Aug 14 12:33 mta-rsmtp -> /usr/bin/rsmtp.exim
lrwxrwxrwx 1 root root 18 Aug 14 12:33 mta-runq -> /usr/bin/runq.exim
lrwxrwxrwx 1 root root 22 Aug 14 12:33 mta-sendmail -> /usr/lib/sendmail.exim
# update-alternatives --config mta

There is 1 program that provides 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.exim

Enter to keep the current selection[+], or type selection number:

Если это не сработает для вас (поскольку qmail не сконфигурирован как часть системы "альтернатив", то самое простое решение - вручную создать эту символическую ссылку:

cd /usr/sbin; ln -s qmail sendmail

[1] Технически система «альтернатив» управляет и создает символическую ссылку / usr / sbin / sendmail, которая указывает на / etc / alternatives / mta, которая является символической ссылкой на /usr/sbin/sendmail.exim. Этот /usr/sbin/sendmail.exim также является символической ссылкой на / usr / sbin / exim.

Если вы хотите использовать встроенную почту (), вам нужно будет поговорить с администратором сервера. В Windows можно использовать внешний SMTP-сервер, но он должен быть указан в настройках php.ini, а встроенные функции PHP не поддерживают SMTP-аутентификацию.

Обычный способ - использовать локальный почтовый сервер, который, в свою очередь, может взаимодействовать с «настоящим» SMTP-сервером с аутентификацией, или использовать почтовый пакет, такой как SwiftMailer, который может напрямую подключаться к стороннему SMTP-серверу, например GMail.

ln: создание символической ссылки sendmail: файл существует

Это потому что sendmail уже является символической ссылкой на /etc/alternatives/mta что дальше не требуется.

Просто удалите sendmail символическая ссылка с помощью команды:

cd /usr/sbin
rm -rf sendmail

И создайте новую ссылку:

ln -s qmail sendmail