◆ 狀況敘述
原本程式建在fedora 14之上,使用PHPMailer 以sendmail 方式發信,可以正常
發出。系統毀損之後,重新安裝在Scientific 6.0之上,同樣程式卻不再能發信,
改成用smtp直接發信,卻也一樣不能發出。我找過許多中英文參考資料,但一直找不
出真正原因在哪裡?不得已,只好來向高手們求救!
◆ 系統環境
▶ OS 版本:Scientific 6.0 x86_64 (測試過i686版本的反應也一樣不能寄信)
▶ Apache 版本:httpd-2.2.15-9.sl6.2.x86_64
▶ OpenSSL 版本:openssl-1.0.0-10.el6.x86_64
▶ PHP 版本:php-5.3.2-6.el6_0.1.x86_64
▶ firewall 已開25,tcp 465,udp 465
▶ SELinux 已停用
▶ 修改 php.ini [mail function]
只設定 sendmail_path = /usr/sbin/sendmail -t -i
▶ 修改 /etc/pki/tls/openssl.cnf 二個參數
(1) countryName_default = TW
(2) stateOrProvinceName_default = Taipei
◆ 測試過程
▶ 錯誤訊息
Warning: fsockopen(): unable to connect to smtp.googlemail.com:465
(Permission denied)
in /var/www/html/PHPMailer/class.smtp.php on line 109
errorno => 13
errstr => Permission denied
▶ telnet 成功
在Linux 上安裝VM OS (windows 2003)做telnet 測試 mail server 可以
成功 => telnet smtp.googlemail.com 465
▶ Thunderbird 可以正常收發信
◆ Source Code
include_once("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = "smtp.googlemail.com";
$mail->Port = 465;
$mail->CharSet = "utf-8";
$mail->Encoding = "base64";
$mail->Username = "XXX@gmail.com";
$mail->Password = "XXX";
$mail->From = "XXX@gmail.com";
$mail->FromName = "系統測試";
$mail->Subject = "寄信測試標題";
$mail->Body = "這是一封測試信件!";
$mail->IsHTML(true);
$mail->AddAddress("xxx@gmail.com", "xxx收信人");
if(!$mail->Send()) echo "Mail error: ".$mail->ErrorInfo;
else echo "Mail sent";
◆ 疑問
查看/etc/httpd/modules 之下只有libphp5.so 而沒有類似 mod_openssl.so
的程式,這是正常的嗎?
◆ 結論
依照上述的描述,我個人的猜測應該是少設定某些參數,或少安裝某些套件,但不知
倒底是什麼? 乃至是意料外的問題!
在此先向回覆的大大們致謝!
▶ firewall 已開25,tcp 465,udp 465
studentie提到:
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:urd
ACCEPT udp -- anywhere anywhere state NEW udp dpt:igmpv3lite
php 是用 apache runner 身份在執行
telnet 是用 root 身份在執行
既然 root 行而 apache 不行
可以確定是被 SELinux 擋掉了
請修改 /etc/selinux/config 檔案裡面的
SELINUX=enforcing
變成
SELINUX=disabled
再重開機就行了
不想重開機要立刻生效,就執行
setenforce 0
看錯誤訊息有顯示「Permission denied」,可試著查看是檔案權限、使用者權限、還是其他權限問題所造成的。如果將sendmail的log level加大,或許亦可提供更多進一步的除錯參考訊息。謝謝。
如果是用本機當smtp host卻發不出信
應該是預設smtp server都會擋relay的問題
sendmail跟postfix都會擋這個避免變成垃圾信主機
所以檢查一下smtp server的relay設定
把對localhost連線的權限打開就好
可不要全部打開,不然就很可能會變垃圾信主機了
使用root 去執行程式後 , 使用 ps 去觀察是是否 chgowner 到另一個 uid , port <1024 需要 root 執行,所以,你的程序如果需要改變owner , 必須在 sendmail 執行後