我已经设置了一个服务器,其设置如下:
CentOS release 6.3 (Final)
Kernel \r on an \m
Linux version 2.6.32-279.14.1.el6.x86_64 ([email protected]) (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
有人有什么建议吗?非常感激您的帮助。
答案1
第一部分 exim 系统要求 exim 用户(进程运行的用户)可以写入 spool 目录和日志目录。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] 从技术上讲,“alternatives”系统管理并创建了一个指向 /etc/alternatives/mta 的符号链接 /usr/sbin/sendmail,而 /etc/alternatives/mta 是指向 /usr/sbin/sendmail.exim 的符号链接。而 /usr/sbin/sendmail.exim 也只是指向 /usr/sbin/exim 的符号链接。
答案2
如果您想使用内置的 mail(),您需要与服务器管理员联系。在 Windows 上可以使用外部 SMTP 服务器,但必须在 php.ini 设置中指定,并且 PHP 的内置函数不支持 SMTP 身份验证。
通常的方法是使用本地邮件服务器,该服务器可以通过身份验证与“真实”SMTP 服务器通信,或者使用像 SwiftMailer 这样的邮件包直接连接到第三方 SMTP 服务器(如 GMail)。
答案3
ln:创建符号链接‘sendmail’:文件存在
这是因为sendmail
已经有一个符号链接,/etc/alternatives/mta
不需要进一步操作。
只需使用命令删除sendmail
符号链接:
cd /usr/sbin
rm -rf sendmail
并创建一个新链接:
ln -s qmail sendmail