終於可以經過phpmailer使用gmail帳號發送郵件了
phpmailer(如今的版本是1.73)是一個很好用的工具,能夠很方便的使用php語言發送郵件,支持smtp及驗證,咱們一直都用它。php
可是,因爲gmail的smtp採用了ssl鏈接:web
Outgoing Mail (SMTP) Server – requires TLS: smtp.gmail.com (use authentication)
Use Authentication: Yes
Use STARTTLS: Yes (some clients call this SSL)
Port: 465 or 587
使用phpmailer就沒法正常鏈接gmail的發信服務器了,而且這個問題一直沒有獲得phpmailer的官方解決,不過在sf.net上面的討論裏卻是找到了一點資料,採用下面這種方法就能夠鏈接gmail了。
修改class.smtp.php,第101行,把服務器
$this->smtp_conn = fsockopen($host, # the host of the server
改爲ide
$this->smtp_conn = fsockopen(’ssl://’ . $host, # the host of the server
這樣就能夠了,就是制定使用ssl協議鏈接主機,固然php的openssl模塊必須打開:函數
extension=php_openssl.dll
可是這樣就不能使用非ssl的主機了,我也不像在include目錄下面放兩份phpmailer,因而,又琢磨出了一種更好的方式:工具
打開class.phpmailer.php,在大概543行附近,函數SmtpConnect()中,找到:ui
$this->smtp->do_debug = $this->SMTPDebug;
$hosts = explode(」;」, $this->Host);
$index = 0;
$connection = ($this->smtp->Connected());this
// Retry while there is no connection
while($index Port;
}spa
這一段的部分功能就是,若是你輸入的主機名中帶有端口號,自動的識別出來,設想雖好,但就是這部分讓咱們沒法直接在調用的時候使用ssl格式的主機 名,由於「ssl://xxx」的形式會被誤認爲是主機:端口號的形式,另外端口號通常都比較固定,咱們手工設置好了,也沒必要必定要和主機一塊兒賦值,因此 在上面的代碼後面添加:.net
//Modify by Fwolf @ 2006-4-14, to enable ssl mail connection
$host = $this->Host;
$port = $this->Port;
就能夠了,使用正常smtp主機的時候,用法不變,使用gmail的時候,使用ssl://smtp.gmail.com做爲主機名就能夠了,惟一稍微麻煩一些的就是端口須要手工指定——其實也不麻煩。
按照上面的配置更改後,使用gmail帳號發送郵件時還會有一條警告信息:
Warning: fgets(): SSL: fatal protocol error in H:\php_includes\phpmailer_ssl\cla
ss.smtp.php on line 1024
這各警告信息在php的幫助裏面有,好像是在使用ssl鏈接的時候,讀文件讀到文件尾的時候出現的問題,須要手工屏蔽,或者人爲控制讀的長度,咱們用最簡 單的方式禁止警告信息顯示就能夠了,找到class.smtp.php的1024行,在fgets($this->smtp_conn,515)函 數前面加上個@就能夠了。
下面是一個完整的使用phpmailer發送郵件的函數:
function send_mail($to_address, $to_name ,$subject, $body, $attach = ‘’)
{
//使用phpmailer發送郵件
require_once(」phpmailer/class.phpmailer.php」);
$mail = new PHPMailer();
$mail->IsSMTP(); // set mailer to use SMTP
$mail->CharSet = ‘utf-8′;
$mail->Encoding = ‘base64′;
$mail->From = ‘fwolf.mailagent@gmail.com’;
$mail->FromName = ‘Fwolf’;
//$mail->Sender = ‘fwolf.mailagent@gmail.com’;
//$mail->ConfirmReadingTo = ‘fwolf.mailagent@gmail.com’; //回執?
$mail->Host = ’ssl://smtp.gmail.com’;
$mail->Port = 465; //default is 25, gmail is 465 or 587
$mail->SMTPAuth = true;
$mail->Username = 「fwolf.mailagent@gmail.com」;
$mail->Password = 「xxx」;
$mail->>ddAddress($to_address, $to_name);
//$mail->AddReplyTo(’fwolf.aide@gmail.com’, 「Fwolf」); //針對gmail無用,gmail是In-Reply-To:,phpmailer默認生成的是Reply-to:
$mail->WordWrap = 50;
if (!empty($attach))
$mail->AddAttachment($attach);
$mail->IsHTML(false);
$mail->Subject = $subject;
$mail->Body = $body;
//$mail->AltBody = 「This is the body in plain text for non-HTML mail clients」;
if(!$mail->Send()){echo 「Mail send failed.\r\n」;echo 「Error message: 」 . $mail->ErrorInfo . 「\r\n」;return false;}else{echo(」Send $attach to $to_name successed.\r\n」);return true;}//echo 「Message has been sent」;//}