iT邦幫忙

0

以phpmailer使用gmail做為SMTP無法寄信

lovex 2011-09-30 07:42:4522677 瀏覽
  • 分享至 

  • xImage

我在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

請問還有什麼地方是要注意的呢?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
4
wiseguy
iT邦超人 1 級 ‧ 2011-09-30 09:40:16
最佳解答

請開 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

看更多先前的回應...收起先前的回應...
Ray iT邦大神 1 級 ‧ 2011-09-30 10:18:05 檢舉

他在 Console 下可以用 telnet 25 連上, 所以防火牆應該是沒有問題的....

我覺得應該查一下 PHP 對於 email function 的相關設定, 特別是 php.ini...

wiseguy iT邦超人 1 級 ‧ 2011-09-30 23:03:21 檢舉

前兩星期才有一位網友問了一模一樣的問題
也是 telnet 可過,PHP 不能過
因為 telnet 是 root ,所以 SELinux 沒擋
而 PHP 是 apache 這個 user 身份,所以被 SELinux 擋掉
關掉 SELinux 後就解決了
樓主的問題只有 Linux 不一樣,前者是用 CentOS,預設有 SELinux
樓主用的是 Ubuntu 我沒用過,不知道它預設會不會裝 SELinux

Ray iT邦大神 1 級 ‧ 2011-10-01 00:16:24 檢舉

wiseguy提到:
因為 telnet 是 root ,所以 SELinux 沒擋

恩, 這樣說也蠻有道理的, 應該先看看 SELinux 是開還是關?

lovex iT邦新手 5 級 ‧ 2011-10-06 19:58:13 檢舉

前幾天臨時去出差,所以晚回應了.....

ubuntu 似乎與Suse及CentOS 架構不一樣,找不到etc/sysconfig/這個folder,試了半天只有setenforce 0這個指令有效

但執行完後,系統亦有回應SELinux disabled,再去執行test_smtp_gmail_basic.php,卻還是出現一樣的訊息......

lovex iT邦新手 5 級 ‧ 2011-10-06 22:02:53 檢舉

再補充
於ubuntu上安裝了Thunderbird,使用
host:smtp.gmail.com
port:465
tls/ssl

可正常寄信,對方已收到mail

lovex iT邦新手 5 級 ‧ 2011-10-06 23:48:04 檢舉

再補充

使用

<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的設定有問題是較大的可能

4
ccutmis
iT邦高手 2 級 ‧ 2011-09-30 11:58:07

建議版主把貼出來的程式第十五行的

<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~

lovex iT邦新手 5 級 ‧ 2011-09-30 14:44:35 檢舉

這個有試過了,也試過tls://smtp.gmail.com:465,以及ssl://smtp.gmail.com:25,tls://smtp.gmail.com,以上幾組都不行。

4
SunAllen
iT邦研究生 1 級 ‧ 2011-09-30 16:33:47

請問大大,您有裝openssl套件嗎? 沒有的話,可以裝一下試試看

lovex iT邦新手 5 級 ‧ 2011-09-30 16:37:41 檢舉

請問您說的openssl套件跟在phpinfo中秀出的php_openssl是否是指一樣的東西,若是的話,那我是有安裝的

lovex iT邦新手 5 級 ‧ 2011-09-30 16:43:08 檢舉

剛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

所以應該是有正常安裝的

我要發表回答

立即登入回答