我在Ubuntu Desktop 10.04+PHP 5.3.2上使用phpmailer 5.1版的lib,並且以phpmailer examples中的test_smtp_gmail_basic.php做為範本直接修改,同時已透過phpinfo確認php_openssl及php_sockets都是enabled,gmail亦已經pop3功能給打開了。
以下為程式碼
error_reporting(E_STRICT);
date_default_timezone_set('America/Toronto');
require_once('../class.phpmailer.php');
$mail = new PHPMailer();
$body = file_get_contents('contents.html');
$body = eregi_replace("[\]",'',$body);
set_time_limit(2000);//設定PHP執行時間
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = "smtp.gmail.com"; // SMTP server
$mail->SMTPDebug = 1;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->Username = "account@gmail.com";
$mail->Password = "password";
$mail->SetFrom('account@gmail.com', 'account');
$mail->AddReplyTo('account@gmail.com', 'account');
$mail->Subject = "PHPMailer Test Subject via smtp (Gmail), basic";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
$mail->MsgHTML($body);
$address = "test@gmail.com";
$mail->AddAddress($address, "John Doe");
if(!$mail->Send()) {
echo "<br/>mail->host:" . $mail->Host . "<br/>";
echo "mail->port:" . $mail->Port . "<br/>";
echo "mail->SMTPSecure:" . $mail->SMTPSecure . "<br/>";
} else {
echo "Message sent!";
}
有試過好幾種不同的組合,ex.
remark SMTPSecure and Port then change host to 'ssl://smtp.gmail.com:465';
remark SMTPSecure and Port then change host to 'tls://smtp.gmail.com:465';
port defined to 25 enable/disabled ssl
account不帶@gmail.com
$mail->CharSet = 'utf-8';
.........
etc,.
但還是一直得到以下訊息
SMTP -> ERROR: Failed to connect to server: (0)
SMTP Error: Could not connect to SMTP host.
在Server中亦可以正常使用telent直接連進smtp.gmail.com
請問還有什麼地方是要注意的呢?
請開 iptables 防火牆:
<pre class="c" name="code">
iptables -A OUTPUT -p tcp --dport 465 -d 74.125.53.108 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 465 -d 74.125.53.109 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
最後一個命令是允許接收回應。
假如有安裝 SELinux 的話,就 disabled 吧:
下此命令立即生效:setenforce 0
下一次重開機生效:修改 /etc/selinux/conf 檔案令 SELINUX=disabled
他在 Console 下可以用 telnet 25 連上, 所以防火牆應該是沒有問題的....
我覺得應該查一下 PHP 對於 email function 的相關設定, 特別是 php.ini...
前兩星期才有一位網友問了一模一樣的問題
也是 telnet 可過,PHP 不能過
因為 telnet 是 root ,所以 SELinux 沒擋
而 PHP 是 apache 這個 user 身份,所以被 SELinux 擋掉
關掉 SELinux 後就解決了
樓主的問題只有 Linux 不一樣,前者是用 CentOS,預設有 SELinux
樓主用的是 Ubuntu 我沒用過,不知道它預設會不會裝 SELinux
wiseguy提到:
因為 telnet 是 root ,所以 SELinux 沒擋
恩, 這樣說也蠻有道理的, 應該先看看 SELinux 是開還是關?
前幾天臨時去出差,所以晚回應了.....
ubuntu 似乎與Suse及CentOS 架構不一樣,找不到etc/sysconfig/這個folder,試了半天只有setenforce 0這個指令有效
但執行完後,系統亦有回應SELinux disabled,再去執行test_smtp_gmail_basic.php,卻還是出現一樣的訊息......
再補充
於ubuntu上安裝了Thunderbird,使用
host:smtp.gmail.com
port:465
tls/ssl
可正常寄信,對方已收到mail
再補充
使用
<pre class="c" name="code">
if(!($server_smtp=fsockopen("ssl://smtp.gmail.com",465,$errno,$errstr,30)))
echo "error";
會出現
<pre class="c" name="code">
PHP Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/Test/TestSMTP.php on line 2
但馬上再執行telnet smtp.gmail.com 465是OK的
只剩apache or php的設定有問題是較大的可能
建議版主把貼出來的程式第十五行的
<pre class="c" name="code">$mail->Host = 'smtp.gmail.com';
改成
<pre class="c" name="code">$mail->Host = 'ssl://smtp.gmail.com:465';
試試看~ hope it's useful~
請問大大,您有裝openssl套件嗎? 沒有的話,可以裝一下試試看
請問您說的openssl套件跟在phpinfo中秀出的php_openssl是否是指一樣的東西,若是的話,那我是有安裝的
剛google了一下資料
http://www.arthurtoday.com/2009/11/ubuntu-910-openssl.html
依此資料來看,openssl在ubuntu是預設安裝的,而我在console執行
<pre class="c" name="code">openssl version
亦有出現
<pre class="c" name="code">OpenSSL 0.9.8k 25 Mar 2009
所以應該是有正常安裝的