2009年8月18日

用PHP寄MAIL的方法

立得國際-舊屋翻新.代客尋屋的專家


YOGO整理了一下,用PHP來發MAIL的方法給有需要的朋友參考一下

1.用PHP內建的mail()函式

一般在發信時入須要先設好您的mail-server,會有問題的大多是windows的系統.在使用這一個函式時如果出現找不到函式那就是您的mail-server相關設定沒有設好.您只要修改您的php.ini就可以了請找到這二行

SMTP = localhost ;
for win32 onlysendmail_from = me@localhost.com ;for win32 onlysmtp

必須要找一台可以提供relay的機器來發信有關主機請自己找相關文件.接下來我們開始談有關mail這一個函式在一封完整的信件中一定會有以下的幾個元件

1.收件人
2.主題
3.信件內容

以要發一封簡單的信件只要把值帶入mail()中就可以了。

例:
mail("收件人","信件主題", 信件內容[, 標頭]);

這樣即可,若須更詳細的說明可參考此篇文章(Mail函式講解 http://www.php5.idv.tw/modules.php?mod=books&act=show&shid=2516


2.mb_send_mail

基本上mb_send_mail的用法與mail類似,只是mail函式必需隨這所使用的語言,適當地設定mail的檔頭部份所宣告的charset,以及檔頭部份、本文部份的編碼方式,但mb_send_mail可以自動進行這些處理,以下為mb_send_mail的原型與用法:

原型:

bool mb_send_mail ( string $to , string $subject , string $message [, string $additional_headers= NULL [, string $additional_parameter= NULL ]] )

用法:

mb_send_mail("收件人","信件主題", 信件內容[, 標頭]);

若需進一步資料請參閱:http://tw.php.net/manual/en/function.mb-send-mail.php


3.使用PHPMailer



在 PHP 中可以使用 mail() 函式進行信件的發送,但是前提是您必須使用一個不用驗證即可寄信的 SMTP。
如果您必須使用一個需要帳號、密碼來通過驗證的 SMTP,就不能使用 mail() 函式了。 如果您不想再額外的安裝 PEAR 函式庫,建議您可以採用 opensource 的類別:phpMailer。

phpMailer 官方網站http://phpmailer.codeworxtech.com/

您可以在此下載 phpMailer 的類別: http://phpmailer.codeworxtech.com/index.php?pg=sf&p=dl 建議您依據您使用的 PHP 版本來下載適合的類別。

下載完畢後請解壓縮到指定資料夾中, 其中重要的類別檔案為:, 請將這個檔案放置與寄發信件程式同一層。 以下為使用範例:

include("class.phpmailer.php"); //匯入PHPMailer類別

$mail= new PHPMailer(); //建立新物件
$mail->IsSMTP(); //設定使用SMTP方式寄信
$mail->SMTPAuth = true; //設定SMTP需要驗證
$mail->Host = "XXX.XXX.XXX.XXX"; //設定SMTP主機
$mail->Port = 25; //設定SMTP埠位,預設為25埠。
$mail->CharSet = "big5"; //設定郵件編碼

$mail->Username = "*********"; //設定驗證帳號
$mail->Password = "*********"; //設定驗證密碼

$mail->From = XXX@XXX.XXX.XXX; //設定寄件者信箱
$mail->FromName = "測試人員"; //設定寄件者姓名

$mail->Subject = "PHPMailer 測試信件"; //設定郵件標題
$mail->Body = "大家好, 這是一封測試信件! "; //設定郵件內容
$mail->IsHTML(true); //設定郵件內容為HTML
$mail->AddAddress(
123@123, "test"); //設定收件者郵件及名稱

if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}


如此即可通過有驗證的SMTP了,另外phpMailer也可以透過Gmail 的SMTP 發信,其範例如下:


include("class.phpmailer.php"); //匯入PHPMailer類別

$mail= new PHPMailer(); //建立新物件
$mail->IsSMTP(); //設定使用SMTP方式寄信
$mail->SMTPAuth = true; //設定SMTP需要驗證
$mail->SMTPSecure = "ssl"; // Gmail的SMTP主機需要使用SSL連線
$mail->Host = "smtp.gmail.com"; //Gamil的SMTP主機
$mail->Port = 465; //Gamil的SMTP主機的SMTP埠位為465埠。
$mail->CharSet = "big5"; //設定郵件編碼

$mail->Username = "*********"; //設定驗證帳號
$mail->Password = "*********"; //設定驗證密碼

$mail->From = XXX@XXX.XXX.XXX; //設定寄件者信箱
$mail->FromName = "測試人員"; //設定寄件者姓名

$mail->Subject = "PHPMailer 測試信件"; //設定郵件標題
$mail->Body = "大家好,這是一封測試信件! "; //設定郵件內容
$mail->IsHTML(true); //設定郵件內容為HTML
$mail->AddAddress(
123@123, "test"); //設定收件者郵件及名稱

if(!$mail->Send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}


一般來說這樣即可完成使用 Gmail 發信的動作了,但有幾個要注意的事項敘述如下:

1.其中要注意的是Gmail 的 SMTP主機固定位址是 smtp.gmail.com,必須使用 465 埠以 SSL 的方式來連線。
2.有許多朋友可能在測試時還是無法正確連線,若要使用 SSL 的方式進行連線,PHP 必須安裝 OpenSSL 的擴充程式,如此才能正確連線並使用 Gmail 執行寄信的動作。

相關資料可參考以下這3篇文章:

1.[PHP] 線上發信如何通過驗證的SMTP(使用PHPMailer)
http://www.dreamweaver.com.tw/?fid=7&viewtopic=29672

2.[PHP] 如何利用 Gmail 的SMTP 發信(使用PHPMailer)
http://www.dreamweaver.com.tw/?fid=7&viewtopic=29692

3.[PHP] 如何利用 Pchome 的SMTP 發信(使用PHPMailer)
http://blog.yogo.tw/2009/09/php-pchome-smtp-phpmailer.html

4.PHP安裝OPENSSL的方法
http://blog.yogo.tw/2009/08/phpopenssl.html

另外下面延伸閱讀推薦的內二本書對phpmailer有詳細的介紹,有興趣的朋友可參考一下。

延伸閱讀:
最新 PHP + MySQL + Ajax 網頁程式設計
PHP + Ajax 網頁模組隨學隨用


4.PEAR - PHP Mail and Mail_Mime

這個比較複雜,以下為相關教學,給有興趣的朋友參考看看

1.[PHP] 好用的 PEAR - PHP Mail and Mail_Mime
http://blog.wu-boy.com/2007/12/18/129/

2.[PHP]解決 PEAR::Mail_Mime 標題 UTF-8 亂碼問題(不能顯示)
http://blog.wu-boy.com/2008/10/01/524/



5.使用Zend_Mail透過Google GMail來寄信


使用Zend Framework所提供的Zend_Mail來寄信,指定的SMTP就是要透過Google的Gmail來寄信, 在使用這個範例之前,由於Gmail必須透過加密傳輸,所以請確認你已經為PHP安置好OpenSSL

範例:
require_once 'Zend/Mail.php';
require_once 'Zend/Mail/Transport/Smtp.php';
$config = array('auth' => 'login','username' => '你的帳號','password' => '******','ssl' => 'tls','port' => '587');

$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
$mail = new Zend_Mail('UTF-8');
$mail->setBodyText('This is the text of the mail.');
$mail->setFrom('xxx@gmail.com', 'Some Sender');
$mail->addTo('xxx@gmail.com', 'Shen');
$mail->setSubject('Zend Mail!');
$mail->send($transport);

參考資源:
Zend_Mail - how to use Zend_Mail_Transport_Smtp for googlemail.com


6.利用 php 裡面的 libcurl 方式,把資料傳到 gmail 去,讓 gmail 當你的 smtp

這裡下載 libgmailer

範例:
require("libgmailer.php");
$gmail_acc = "帳號@gmail.com";
$gmail_pwd = "密碼";
$my_timezone = "GMT +08:00";
$gmailer = new GMailer();
if ($gmailer->created) {
gmailer->setLoginInfo($gmail_acc, $gmail_pwd, $my_timezone);// $gmailer->setProxy("proxy.company.com");
if ($gmailer->connect()) {
// GMailer connected to Gmail successfully.
// Do something with it.
$to = "收件人@gmail.com";
$subj = "主題";
$body = "測試";
$gmailer->send($to, $subj, $body, $cc="", $bcc="", $mid="", $tid="", $files=0, $draft=false, $orig_df="", $is_html=0, $from="", $attachments = array());
} else {
die("Fail to connect because: ".$gmailer->lastActionStatus()."\n");}}
else {
die("Failed to create GMailer because: ".$gmailer->lastActionStatus()."\n");
}



以上為YOGO整理的一些方法,希望能對各位朋友有所幫助

延伸閱讀:
挑戰Dreamweaver CS4互動網站百寶箱--使用PHP
挑戰PHP5/MySQL程式設計樂活學 

如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。

11 則留言:

調色の女人 提到...

嗨~~版主大大:

感謝你這幾天的教學與指導~~
能遇到你這位大好人,真是三生有幸!

我的問題已解決了,用了主機的信箱才成!!
但gmail信箱測試一樣出現那個問題~~
總之,你不厭其煩的幫我說明與解決~~
讓我很感動!!

真的很謝謝您~~~

法蘭西絲上

YOGO 提到...

恭喜你囉^^,以後也歡迎常來這邊逛逛喔

家瑋 提到...

不好意思我用了
phpMailer也可以透過Gmail 的SMTP 發信,其範例如下
這個範例的程式碼
然後出現
Parse error: syntax error, unexpected '@' in C:\wamp\www\aaa\register_finish.php on line 15

我第15行是這樣
$mail->From =fishnum@gmail.com ; //設定寄件者信箱

我有把extension=php_openssl.dll前方的;去掉了

可是不知道為什麼還是還是出現這樣@@

YOGO 提到...

你應該是照抄我的程式碼下去改成你的帳號而已對吧

請把
$mail->From =fishnum@gmail.com; //設定寄件者

改成
$mail->From ="fishnum@gmail.com"; //設定寄件者

家瑋 提到...

哈哈

現在可以寄出信件了

好開心~~

謝謝你啦^^

提到...

我寫了一個 請輸入信箱:
輸入完它會自動轉到寄信的程式
我用Gmail那個程式碼
地址這部分我不知道怎麼改
$email = $_POST['email'];
$mail->AddAddress("", "test");
我改這樣會出現錯誤寄不出去
$mail->AddAddress("$email", "test");

YOGO 提到...

要請你說明錯誤代碼為何?或po出你的程式碼,不然用猜的,我真的也愛莫能助

伊雯 提到...

版大你好!
想要向你請教,
http://acutedesign.zxq.net/
我的網頁整個問題就出在最後contact的地方信件都寄不出去,
程式碼如下:
<?PHP
$sendto = "acutedesign2010@gmail.com";
$subject = "Website Contact Form";
$e = $_POST['email_txt'];
$message = "Name: " . $_POST['name_txt'];
$message .= "\nE-mail: " . $e;
$message .= "\nPhone: " . $_POST['phone_txt'];
$message .= "\n\nMessage: " . $_POST['message_txt'];
$headers = "From: $e";
$headers .= "\nReply-To: $e";
$sentOk = mail($to,$subject,$message,$headers);
echo "sentOk=" . $sentOk;
?>
這網頁模組我改了好幾天,改連結改中文@@
還有上傳!
第一次自己做網頁真的很有成就感呢!
因為自己沒有學這方面的東西
改到最後剩這個問題就很想把它搞懂
麻煩你批評指教了

球滾滾 提到...

你好,
最近的Mantis若有新增以及異動都不會發Mail通知(以前都會),但是我最近沒有更動設定,只有前陣子MIS有開通外部連線功能,
請問是否因為這樣有更動到SMTP?我應該要檢查哪些地方呢?

謝時榮 提到...

你好 請問一下 我用libgamiler 這段程式語法 寄信 可是他出現 Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR) in C:\xampp\htdocs\mail.php on line 8 請問是哪裡出錯了呢

YOGO 提到...

要請你PO出完整的程式碼才能幫你,不然的話訊息有限,實在愛莫能助

寺廟巡禮免費廟宇開站即將開放

讓各位久等了, 寺廟巡禮系統目前正火速趕製中, 目前先釋出最新進度的樣板 本系拱採永久免費製, 供有興趣的朋友參考, 可至下方網頁預約申請   寺廟巡禮系統線上說明 http://www.iwa.com.tw/   寺廟巡禮系統線上樣板 http://...