2008年2月29日 星期五

追蹤指數的 ETF 基金

今天在 Real-Blog 看到了 追蹤指數的 ETF 基金
就簡單做了個節錄
內容如下:
ETF 是 Exchange Traded Fund 的簡稱,,即透過交易所買賣的基金,買賣方法與股票一樣。而大部份 ETF 是盡量跟貼相關指數的表現,做法是 "全面複製策略" 或 "具代表性之樣本複製策略"。

傳統的基金一般會收取各項費如,例如認購費、管理費、表現費及贖回費等。而相比起傳統的基金,ETF 的最大優勢是收費。因為 ETF 的管理費一般在 1% 以下,而且因為透過交易所買賣,買賣成本也比基金低很多。而我在 Morningstar 看過各 ETF 的表現,實際上比大部份傳統基金還要好。但傳統的基金還是有優點的,就是基金經理的操盤技巧,如果基金經理表現出色的話,在計算各項雜費後,還是可以跑贏大市。而另一點就是傳統基金可選擇的市場及主題較廣泛。


這篇在 Morningstar 的文章有較詳細的 ETF 介紹:本港ETF市場有待發展
對於沒有時間研究個股的投資者,不坊考慮購買 ETF,以下是在香港上市的 ETF:

香港市場
盈富基金 <2800> (香港股票)
恆生指數 ETF <2833> (香港股票)

中國市場
A50 中國指數基金 <2823> (內地 A 股)
標智滬深300中國指數基金 <2827> (內地 A 股)
I 股 MSCI 中國指數基金 <2801> (香港股票)
恆生 H 股 ETF <2828> (香港股票)
恆生新華富時中國 25 指數上市基金 <2838> (香港股票)

商品市場
領先商品 ETF <2809> (商品)

債券市場
ABF 港債指數 <2819> (香港債券)
沛富基金 <2821> (亞洲債券)

環球市場
領先印度 ETF <2810> (印度股票)
領先環球 ETF <2812> (全球股票)
領先韓國 ETF <2813> (韓國股票)
領先亞太區 ETF <2815> (亞太區股票)
領先納指 ETF <2826> (納斯達克股票)
領先俄羅斯 ETF <2831> (俄羅斯股票)
I 股 SE SENSEX 印度指數基金 <2836> (印度股票)
今天在 Real-Blog 看到了 追蹤指數的 ETF 基金
就簡單做了個節錄
內容如下:
ETF 是 Exchange Traded Fund 的簡稱,,即透過交易所買賣的基金,買賣方法與股票一樣。而大部份 ETF 是盡量跟貼相關指數的表現,做法是 "全面複製策略" 或 "具代表性之樣本複製策略"。

傳統的基金一般會收取各項費如,例如認購費、管理費、表現費及贖回費等。而相比起傳統的基金,ETF 的最大優勢是收費。因為 ETF 的管理費一般在 1% 以下,而且因為透過交易所買賣,買賣成本也比基金低很多。而我在 Morningstar 看過各 ETF 的表現,實際上比大部份傳統基金還要好。但傳統的基金還是有優點的,就是基金經理的操盤技巧,如果基金經理表現出色的話,在計算各項雜費後,還是可以跑贏大市。而另一點就是傳統基金可選擇的市場及主題較廣泛。


這篇在 Morningstar 的文章有較詳細的 ETF 介紹:本港ETF市場有待發展
對於沒有時間研究個股的投資者,不坊考慮購買 ETF,以下是在香港上市的 ETF:

香港市場
盈富基金 <2800> (香港股票)
恆生指數 ETF <2833> (香港股票)

中國市場
A50 中國指數基金 <2823> (內地 A 股)
標智滬深300中國指數基金 <2827> (內地 A 股)
I 股 MSCI 中國指數基金 <2801> (香港股票)
恆生 H 股 ETF <2828> (香港股票)
恆生新華富時中國 25 指數上市基金 <2838> (香港股票)

商品市場
領先商品 ETF <2809> (商品)

債券市場
ABF 港債指數 <2819> (香港債券)
沛富基金 <2821> (亞洲債券)

環球市場
領先印度 ETF <2810> (印度股票)
領先環球 ETF <2812> (全球股票)
領先韓國 ETF <2813> (韓國股票)
領先亞太區 ETF <2815> (亞太區股票)
領先納指 ETF <2826> (納斯達克股票)
領先俄羅斯 ETF <2831> (俄羅斯股票)
I 股 SE SENSEX 印度指數基金 <2836> (印度股票)

用PHP函數解決SQL injection

轉錄自
用PHP函数解决SQL injection

SQL injection問題在ASP上可是鬧得沸沸揚揚當然還有不少國內外著名的PHP程式“遇難”。
如果你網站空間的php.ini文件的magic_quotes_gpc設成了off,
那麽PHP就不會自動在敏感字元前加上反斜符號(\),由於表單提交的內容可能含有敏感字元,
如單引號('),就導致了SQL injection的漏洞。
在這種情況下,我們可以用addslashes()來解決問題,它會自動在敏感字元前添加反斜符號。
但是,上面的方法只適用於magic_quotes_gpc=Off的情況。
作爲一個開發者,你不知道每個用戶的magic_quotes_gpc是On還是Off,
如果把全部的資料都用上addslashes(),那不是“濫殺無辜”了?
假如magic_quotes_gpc=On,並且又用了addslashes()函數,那讓我們來看看:


//如果從表單提交一個變數$_POST['message'],內容爲 Tom's book
//這此加入連接MySQL資料庫的代碼,自己寫吧
//在$_POST['message']的敏感字元前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由於magic_quotes_gpc=On,所以又一次在敏感字元前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//發送請求,把內容保存到資料庫內
$query = mysql_query($sql);

//如果你再從資料庫內提取這個記錄並輸出,就會看到 Tom\'s book
?>

這樣的話,在magic_quotes_gpc=On的環境,所有輸入的單引號(')都會變成(\')……
其實我們可以用get_magic_quotes_gpc()函數輕易地解決這個問題。
當magic_quotes_gpc=On時,該函數返回TRUE;當magic_quotes_gpc=Off時,返回FALSE。
至此,肯定已經有不少人意識到:問題已經解決。請看

//如果magic_quotes_gpc=Off,那就爲提單提交的$_POST['message']的敏感字元加反斜杠
//magic_quotes_gpc=On的情況下,則不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其實說到這,問題已經解決。下面再說一個小技巧。
有時表單提交的變數不止一個,可能有十幾個,幾十個。
那麽一次一次地複製/粘帖addslashes(),是否麻煩了一點?
由於從表單或URL獲取的資料都是以陣列形式出現的,如$_POST、$_GET
那就自定義一個可以“橫掃千軍”的函數:

function quotes($content)
{
//如果magic_quotes_gpc=Off,那麽就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否爲陣列
if (is_array($content)) {
//如果$content是陣列,那麽就處理它的每一個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是陣列,那麽就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那麽就不處理
}
//返回$content
return $content;
}
?>



轉錄自
用PHP函数解决SQL injection

SQL injection問題在ASP上可是鬧得沸沸揚揚當然還有不少國內外著名的PHP程式“遇難”。
如果你網站空間的php.ini文件的magic_quotes_gpc設成了off,
那麽PHP就不會自動在敏感字元前加上反斜符號(\),由於表單提交的內容可能含有敏感字元,
如單引號('),就導致了SQL injection的漏洞。
在這種情況下,我們可以用addslashes()來解決問題,它會自動在敏感字元前添加反斜符號。
但是,上面的方法只適用於magic_quotes_gpc=Off的情況。
作爲一個開發者,你不知道每個用戶的magic_quotes_gpc是On還是Off,
如果把全部的資料都用上addslashes(),那不是“濫殺無辜”了?
假如magic_quotes_gpc=On,並且又用了addslashes()函數,那讓我們來看看:


//如果從表單提交一個變數$_POST['message'],內容爲 Tom's book
//這此加入連接MySQL資料庫的代碼,自己寫吧
//在$_POST['message']的敏感字元前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由於magic_quotes_gpc=On,所以又一次在敏感字元前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//發送請求,把內容保存到資料庫內
$query = mysql_query($sql);

//如果你再從資料庫內提取這個記錄並輸出,就會看到 Tom\'s book
?>

這樣的話,在magic_quotes_gpc=On的環境,所有輸入的單引號(')都會變成(\')……
其實我們可以用get_magic_quotes_gpc()函數輕易地解決這個問題。
當magic_quotes_gpc=On時,該函數返回TRUE;當magic_quotes_gpc=Off時,返回FALSE。
至此,肯定已經有不少人意識到:問題已經解決。請看

//如果magic_quotes_gpc=Off,那就爲提單提交的$_POST['message']的敏感字元加反斜杠
//magic_quotes_gpc=On的情況下,則不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其實說到這,問題已經解決。下面再說一個小技巧。
有時表單提交的變數不止一個,可能有十幾個,幾十個。
那麽一次一次地複製/粘帖addslashes(),是否麻煩了一點?
由於從表單或URL獲取的資料都是以陣列形式出現的,如$_POST、$_GET
那就自定義一個可以“橫掃千軍”的函數:

function quotes($content)
{
//如果magic_quotes_gpc=Off,那麽就開始處理
if (!get_magic_quotes_gpc()) {
//判斷$content是否爲陣列
if (is_array($content)) {
//如果$content是陣列,那麽就處理它的每一個單無
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是陣列,那麽就僅處理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那麽就不處理
}
//返回$content
return $content;
}
?>



2008年2月24日 星期日

電子郵件的範例定稿

Dear XXX,

Excuse me! 本文...


Any questions, please feel free to contact us

Thanks & Best Regards!


Cheng-Yuan Chiang / PHP Engineer
Advantage Digital Corportation
Tel:04-24518172
Fax:04-24512372
Mobile:0932-245064
E-Mail:chiang@e-rent.com.tw
E-Mail:cychiang719@gmail.com
MSN:cychiang719@hotmail.com Dear XXX,

Excuse me! 本文...


Any questions, please feel free to contact us

Thanks & Best Regards!


Cheng-Yuan Chiang / PHP Engineer
Advantage Digital Corportation
Tel:04-24518172
Fax:04-24512372
Mobile:0932-245064
E-Mail:chiang@e-rent.com.tw
E-Mail:cychiang719@gmail.com
MSN:cychiang719@hotmail.com

2008年2月13日 星期三

PHP 程式效能優化的 40 條建議

引用自 PHP 程式效能優化的 40 條建議
使用 str_replace > preg_replace, 但是 strstr 又比 str_replace 快, $row['id'] 比 $row[id] 快 7 倍, 雖然有些龜毛了點, 偶爾注意一下也不錯~ :)

原文: 40 Tips for optimizing your php code

轉載自翻譯: 優化PHP程式的40條建議

  1. 如果一個方法可靜態化,就對它做靜態聲明。速率可提升至4倍
  2. echo 比 print 快
  3. 使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接
  4. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值
  5. 註銷那些不用的變量尤其是大數組,以便釋放內存
  6. 盡量避免使用__get,__set,__autoload
  7. require_once()代價昂貴
  8. 在包含文件時使用完整路徑,解析操作系統路徑所需的時間會更少
  9. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()
  10. 函數代替正則表達式完成相同功能
  11. str_replace函數比preg_replace函數快,但strstr函數的效率是str_replace函數的四倍
  12. 如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換程式,使得每次傳遞參數是一個字元,而不是只寫一行程式接受數組作為查詢和替換的參數
  13. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句
  14. 用@屏蔽錯誤消息的做法非常慢
  15. 打開apache的mod_deflate模塊
  16. 資料庫連接當使用完畢時應關掉
  17. $row['id']的效率是$row[id]的7倍
  18. 錯誤訊息代價昂貴
  19. 盡量不要在for循環中使用函數,比如for ($x=0; $x <>
  20. 在function中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度相當
  21. 遞增一個全局變量要比遞增一個局部變量慢2倍
  22. 遞增一個物件屬性(如:$this->prop++)要比遞增一個局部變量慢3倍
  23. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍
  24. 僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量
  25. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化
  26. 派生類中的方法運行起來要快於在基類中定義的同樣的方法
  27. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作
  28. 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量,單引號則不會。當然,只有當你不需要在字元串中包含變量時才可以這麼做
  29. 輸出多個字元串時,用逗號代替句點來分隔字元串,速度更快。注意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)
  30. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本
  31. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷
  32. 盡量做緩存,可使用memcached。memcached是一款高性能的內存物件緩存系統,可用來加速動態Web應用程式,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯
  33. 當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫),會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的程式
    舉例如下:
    if (strlen($foo) <>
  34. 當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的網際網路服務提供商(ISPs)和服務器
  35. 並不是所有都要使用OOP,面向物件往往開銷很大,每個方法和物件調用都會消耗很多Memory
  36. 並非要用 class 實現所有的數據結構,數組也很有用
  37. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些程式?
  38. 當你需要時,你總能把程式分解成方法
  39. 盡量採用大量的PHP內置函數
  40. 如果在程式中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們
  41. 評估檢驗(profile)你的程式。檢驗器會告訴你,程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式,評估檢驗總體上可以顯示出程式的瓶頸
  42. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%
  43. 另一篇優化PHP的精彩文章,由John Lim撰寫

引用自 PHP 程式效能優化的 40 條建議
使用 str_replace > preg_replace, 但是 strstr 又比 str_replace 快, $row['id'] 比 $row[id] 快 7 倍, 雖然有些龜毛了點, 偶爾注意一下也不錯~ :)

原文: 40 Tips for optimizing your php code

轉載自翻譯: 優化PHP程式的40條建議

  1. 如果一個方法可靜態化,就對它做靜態聲明。速率可提升至4倍
  2. echo 比 print 快
  3. 使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接
  4. 在執行for循環之前確定最大循環數,不要每循環一次都計算最大值
  5. 註銷那些不用的變量尤其是大數組,以便釋放內存
  6. 盡量避免使用__get,__set,__autoload
  7. require_once()代價昂貴
  8. 在包含文件時使用完整路徑,解析操作系統路徑所需的時間會更少
  9. 如果你想知道腳本開始執行(譯註:即服務器端收到客戶端請求)的時刻,使用$_SERVER['REQUEST_TIME']要好於time()
  10. 函數代替正則表達式完成相同功能
  11. str_replace函數比preg_replace函數快,但strstr函數的效率是str_replace函數的四倍
  12. 如果一個字元串替換函數,可接受數組或字元作為參數,並且參數長度不太長,那麼可以考慮額外寫一段替換程式,使得每次傳遞參數是一個字元,而不是只寫一行程式接受數組作為查詢和替換的參數
  13. 使用選擇分支語句(譯註:即switch case)好於使用多個if,else if語句
  14. 用@屏蔽錯誤消息的做法非常慢
  15. 打開apache的mod_deflate模塊
  16. 資料庫連接當使用完畢時應關掉
  17. $row['id']的效率是$row[id]的7倍
  18. 錯誤訊息代價昂貴
  19. 盡量不要在for循環中使用函數,比如for ($x=0; $x <>
  20. 在function中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度相當
  21. 遞增一個全局變量要比遞增一個局部變量慢2倍
  22. 遞增一個物件屬性(如:$this->prop++)要比遞增一個局部變量慢3倍
  23. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍
  24. 僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量
  25. 方法調用看來與類中定義的方法的數量無關,因為我(在測試方法之前和之後都)添加了10個方法,但性能上沒有變化
  26. 派生類中的方法運行起來要快於在基類中定義的同樣的方法
  27. 調用帶有一個參數的空函數,其花費的時間相當於執行7至8次的局部變量遞增操作。類似的方法調用所花費的時間接近於15次的局部變量遞增操作
  28. 用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變量,單引號則不會。當然,只有當你不需要在字元串中包含變量時才可以這麼做
  29. 輸出多個字元串時,用逗號代替句點來分隔字元串,速度更快。注意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是真正的函數,故把函數加上了雙引號)
  30. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本
  31. 除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷
  32. 盡量做緩存,可使用memcached。memcached是一款高性能的內存物件緩存系統,可用來加速動態Web應用程式,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯
  33. 當操作字元串並需要檢驗其長度是否滿足某種要求時,你想當然地會使用strlen()函數。此函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用於存儲PHP變量)中存儲的已知字元串長度。但是,由於strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯註:指函數名小寫化,PHP不區分函數名大小寫),會跟隨被調用的函數一起執行。在某些情況下,你可以使用isset() 技巧加速執行你的程式
    舉例如下:
    if (strlen($foo) <>
  34. 當執行變數$i的遞增或遞減時,$i++會比++$i慢一些。這種差異是PHP特有的,並不適用於其他語言,所以請不要修改你的C或Java程式並指望它們能立即變快,沒用的。++$i更快是因為它只需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上會產生一個臨時變量,這個臨時變量隨後被遞增。而前置遞增直接在原值上遞增。這是最優化處理的一種,正如Zend的PHP優化器所作的那樣。牢記這個優化處理不失為一個好主意,因為並不是所有的指令優化器都會做同樣的優化處理,並且存在大量沒有裝配指令優化器的網際網路服務提供商(ISPs)和服務器
  35. 並不是所有都要使用OOP,面向物件往往開銷很大,每個方法和物件調用都會消耗很多Memory
  36. 並非要用 class 實現所有的數據結構,數組也很有用
  37. 不要把方法細分得過多,仔細想想你真正打算重用的是哪些程式?
  38. 當你需要時,你總能把程式分解成方法
  39. 盡量採用大量的PHP內置函數
  40. 如果在程式中存在大量耗時的函數,你可以考慮用C擴展的方式實現它們
  41. 評估檢驗(profile)你的程式。檢驗器會告訴你,程式的哪些部分消耗了多少時間。Xdebug調試器包含了檢驗程式,評估檢驗總體上可以顯示出程式的瓶頸
  42. mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%
  43. 另一篇優化PHP的精彩文章,由John Lim撰寫

PHPMailer郵件函式庫

參考資料來源:實作PHPMailer郵件函式庫


PHPMailer是一個提供電子郵件相關功能的PHP函式庫,功能相當完整,可以讓你很輕鬆的發送郵件。它提供的功能包括:

  • 在發送郵時指定多個收件人,寄送副本,寄送密件副本和回復Email
  • 支援多種郵件編碼包括:8bit,base64,binary和quoted-printable
  • 支持SMTP驗證
  • 支援冗餘SMTP伺服器
  • 支援帶附件的郵件和Html格式的郵件
  • 自定義郵件頭
  • 支援在郵件中嵌入圖片
  • 調試靈活
  • 經測試相容的SMTP伺服器包括:Sendmail,qmail,Postfix,Imail,Exchange等
  • 可運行在任何平臺之上


官方網站
http://phpmailer.sourceforge.net/

下載位址
http://sourceforge.net/project/showfiles.php?group_id=26031

下載下來後,只要引入就可以使用。

以下是一簡單範例及說明:

< ? php //引入文件 require_once("phpmailer/class.phpmailer.php"); //宣告一個PHPMailer物件 $mail = new PHPMailer(); //設定使用SMTP發送 $mail->IsSMTP();
//指定SMTP的服務器位址
$mail->Host = "so-net.net.tw";
//設定SMTP服務的POST
$mail->Port = 25;
//設定為安全驗證方式
$mail->SMTPAuth = true;
//SMTP的帳號
$mail->Username = "xuhao";
//SMTP的密碼
$mail->assword = "********";
//寄件人Email
$mail->From = "xuhao@so-net.net.tw";
//寄件人名稱
$mail->FromName = "大鼻子";
//收件人Email
$mail->AddAddress("bignostriltao@yahoo.com.tw");
//設定收件人的另一種格式("Email","收件人名稱")
$mail->AddAddress("justin@recyclesources.com","阿豪");
//設定密件副本
$mail->AddBCC("bignostriltao@gmail.com");
//回信Email及名稱
$mail->AddReplyTo("xuhao@so-net.net.tw", "大鼻子");
//設定信件字元編碼
$mail->CharSet="utf-8";
//設定信件編碼,大部分郵件工具都支援此編碼方式
$mail->Encoding = "base64";
//設置郵件格式為HTML
$mail->IsHTML(true);
//每50自斷行
$mail->WordWrap = 50;
//傳送附檔
$mail->AddAttachment("upload/temp/filename.zip");
//傳送附檔的另一種格式,可替附檔重新命名
$mail->AddAttachment("upload/temp/filename.zip", "newname.zip");
//郵件標題
$mail->Subject="測試郵件";
//郵件內容
$mail->Body ="這是一封HTML格式的測試信。";
//附加內容
$mail->AltBody = '這是附加的信件內容';
//寄送郵件
if(!$mail->Send()){
echo "郵件無法順利寄出!";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "郵件已經順利寄出!";
?>

參考資料來源:實作PHPMailer郵件函式庫


PHPMailer是一個提供電子郵件相關功能的PHP函式庫,功能相當完整,可以讓你很輕鬆的發送郵件。它提供的功能包括:

  • 在發送郵時指定多個收件人,寄送副本,寄送密件副本和回復Email
  • 支援多種郵件編碼包括:8bit,base64,binary和quoted-printable
  • 支持SMTP驗證
  • 支援冗餘SMTP伺服器
  • 支援帶附件的郵件和Html格式的郵件
  • 自定義郵件頭
  • 支援在郵件中嵌入圖片
  • 調試靈活
  • 經測試相容的SMTP伺服器包括:Sendmail,qmail,Postfix,Imail,Exchange等
  • 可運行在任何平臺之上


官方網站
http://phpmailer.sourceforge.net/

下載位址
http://sourceforge.net/project/showfiles.php?group_id=26031

下載下來後,只要引入就可以使用。

以下是一簡單範例及說明:

< ? php //引入文件 require_once("phpmailer/class.phpmailer.php"); //宣告一個PHPMailer物件 $mail = new PHPMailer(); //設定使用SMTP發送 $mail->IsSMTP();
//指定SMTP的服務器位址
$mail->Host = "so-net.net.tw";
//設定SMTP服務的POST
$mail->Port = 25;
//設定為安全驗證方式
$mail->SMTPAuth = true;
//SMTP的帳號
$mail->Username = "xuhao";
//SMTP的密碼
$mail->assword = "********";
//寄件人Email
$mail->From = "xuhao@so-net.net.tw";
//寄件人名稱
$mail->FromName = "大鼻子";
//收件人Email
$mail->AddAddress("bignostriltao@yahoo.com.tw");
//設定收件人的另一種格式("Email","收件人名稱")
$mail->AddAddress("justin@recyclesources.com","阿豪");
//設定密件副本
$mail->AddBCC("bignostriltao@gmail.com");
//回信Email及名稱
$mail->AddReplyTo("xuhao@so-net.net.tw", "大鼻子");
//設定信件字元編碼
$mail->CharSet="utf-8";
//設定信件編碼,大部分郵件工具都支援此編碼方式
$mail->Encoding = "base64";
//設置郵件格式為HTML
$mail->IsHTML(true);
//每50自斷行
$mail->WordWrap = 50;
//傳送附檔
$mail->AddAttachment("upload/temp/filename.zip");
//傳送附檔的另一種格式,可替附檔重新命名
$mail->AddAttachment("upload/temp/filename.zip", "newname.zip");
//郵件標題
$mail->Subject="測試郵件";
//郵件內容
$mail->Body ="這是一封HTML格式的測試信。";
//附加內容
$mail->AltBody = '這是附加的信件內容';
//寄送郵件
if(!$mail->Send()){
echo "郵件無法順利寄出!";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "郵件已經順利寄出!";
?>