星期三, 4月 10, 2013

修改yii建立網站的認證方式

修改位於 /protected/components/UserIdentity.php 中的 authenticate() method。

標籤: ,

星期六, 11月 15, 2008

[PHP PEAR]mail 功能

如果要使用PHP 來發送信件, PEAR 中的 Mail 模組是一個不錯的選擇
首先要 Include PEAR mail
require_once("/usr/share/pear/Mail.php"); //看你安裝 PEAR 的實際位置
$smtp = Mail::factory('smtp', array('host' => 'mailserver.domain.com', 'port' => '25', 'auth' => true, 'username' => 'yourname', 'password' =>'yourpassword')); // 產生 mail instance
$mail = $smtp->send($receivers, $headers, $content); // 送出信件

其中, create mail instance 時, 有三個主要參數可以選擇送信的方法
1. mail: 將寄信的工作交給 PHP 內建的 mail function 來送信
2. sendmail: 將寄信的工作交給本機的 sendmail 程式, 有兩個可設定的參數
$params["sendmail_path"]: 設定本機 sendmail 的實際路徑
$params["sendmail_args"]: 要傳給 sendmail 的參數
3. smtp: 將寄信的工作交給實際能送信的郵件伺服器, 此參數有很多子參數可設定, 介紹幾個常用的
$params["host"]: 設定實際能幫你送信的主機
$params["port"]: 設定傳送信件的通訊埠, 通常是 25
$params["auth"]: 現在非常多郵件伺服器, 不幫忙送信, 因為垃圾郵件太猖獗, 因此很多郵件伺服器是要認證, 才可幫忙送信, 如果你的郵件伺服器要認證, 此參數要設 true
$params["username"]: 如果 $params["auth"] 是 true, 那此參數和下一個參數分別要給定帳號及密碼
$params["password"]: 設定認證的密碼

如果以上的送信方法設定了, 接下來就是要傳送信件了
$smtp->send($receivers, $headers, $content);
send function 有三個參數
第一個參數設定收件者(一個或多個, 中間以 "," 分隔收件者)
第二個參數信件表頭, 表頭的參數非常多, 主要是 RFC-2822 定義的信件表頭, 以下介紹幾個常用的
$headers["From"]: 定義送件者
$headers["To"]: 定義收件者
$headers["Cc"]: 定義副本收件者 CC(Carbon Copy)
$headers["Bcc"]: 定義密件收件者 BCC(Blind Carbon Copy)
$headers["Subject"]: 定義信件標題
$headers["Reply-To"]: 定義回信收件人地址(可和From 不同)
$headers["Content-Type"]: 定義郵件本文格式 "text/html; charset=big5" 定義此郵件為 html 格式, 中文字以 Big5 編碼
這裡要特別強調一點 To, Cc, Bcc 這三個都只是讓你的 mail 裡, 收件者, 副本及密件副本欄位依照你指定的顯示, 實際上你的 Mail 送給哪些人是根據第一個參數所給的地址, 這個在我寫程式時沒搞清楚, 以為放在 Cc 和 Bcc 中的程式也會幫我送, 一直以為程式有錯, 後來 google 才知道真正原因

第三個參數是你郵件的本文, 記得要跟 header 中 Content-Type 相符合, 才不會是亂碼

標籤: ,

星期五, 10月 20, 2006

[PHP] 用 curl 來抓網路上的資料(四)

前面三篇我大概把一般會用到的基本 curl 介紹完了, 接下來我們會
介紹一些比較特殊的功能, 首先我要示範如果你的 瀏覽器是透過
proxy 來存取Internet 網頁的話, 如何用 curl 來達到同樣的效果呢?
PHP 4.x 版和 5.x 版的用法不太一樣, 由於我使用的環境是 4.3.9 因此
我只介紹 4.x 版的用法, 其實 5.x 版也可以用等下我介紹的方法, 只是
5.x 提供了更方便的方法讓使用者容易使用

以下假設我們透過 proxy.hinet.net port:3128 來連上我們的目的地
http://www.test.com.tw/testpage.html

1. 如果 proxy 不需密碼:
$ch = curl_init("http://www.test.com.tw/testpage.html");
curl_setopt($ch, CURLOPT_PROXY, "http://proxy.hinet.net:3128");
curl_exec($ch);
即可, 其中 curl_setopt 即是設定我們的程式要透過 proxy 去存取
我們的目的地網站

2. 如果 proxy 需要密碼:
$ch = curl_init("http://www.test.com.tw/testpage.html");
curl_setopt($ch, CURLOPT_PROXY, "http://proxy.hinet.net:3128");
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "user:password");
curl_exec($ch);
即可, 其中 第二個 curl_setopt 即是設定我們的程式要透過 proxy 去存取
我們的目的地網站所需的帳號(user)及密碼(password), 如果帳號密碼
沒錯應該就可以透過 proxy 存取了

標籤: ,

星期二, 10月 17, 2006

[PHP] 用 curl 來抓網路上的資料(三)

post 的方法跟 get 的方法也很相近, 但因為他的參數部份(即 get方法中
問號後面"變數名稱=值" 的部份),在傳遞的時候我們無法看到, 因此我們
無法知道它傳的參數為何 , 幸好, 有些工具可以使用。
在此我介紹 httpwatch, httpwatch 是一套商業軟體, 不是 freeware 所
以請購買合法軟體, 如果網友有人知道有功能相近的 freeware 可以介
紹給我, 我會把 httpwatch 換掉,此外 httpwatch 必須跟 IE 搭配使用
(Firefox 目前無法使用)。

安裝完 httpwatch 後, 在 IE 的瀏覽器列就會出現如下圖所示的按鈕






如果按下 httpwatch 的按鈕, 瀏覽器下方就會出現 httpwatch 的相關
工具, 如下圖











先在瀏覽器的網址列輸入你想要觀察的網址, 這裡我用
http://www.digitimes.com.tw 為例
接下來在下方 httpwatch 工具中, 按下 Record(見上圖紅色按鈕)
然後才在網頁中輸入要查詢的關鍵字
接下來就可以看到相關執行程式名稱及相關 POST 的變數
名稱及值, 如下圖所示










此例中, 他新聞搜尋的功能是執行了
http://www.digitimes.com.tw/search/display.asp
並且傳了四個參數 keyword, submit1, sFormDate, sToDate 及
他們的值 SATA, Go!, 2006/8/1,2006/10/31
得到這些參數接下來我們就可以開始使用 curl 用 POST 的方法來抓網頁的資料了
啟始 curl:
$ch = curl_init("http://www.digitimes.com.tw/search/display.asp");
curl_setopt($ch, CURLOPT_POST, 1); 如此才能使用 post 的 方法來
curl_setopt($ch, CURLOPT_POSTFIELDS,
"keyword=SATA
&submit1=Go!&sFormDate=2006/8/1&sToDate=2006/10/31");

用 CURLOPT_POSTFIELDS 此參數來給定要用 POST 傳的參數
注意: 參數跟參數間要用 "&" 來連接
最後再用 curl_exec($ch); 執行即可

標籤: ,

星期四, 10月 05, 2006

[PHP] 用 curl 來抓網路上的資料(二)

有時候我們抓的網頁需要傳參數, 而用 curl 該怎麼使用呢?
基本上在 html 傳參數是用 form 來傳送, 而傳送的方法有 get 和 post 兩種方式
get 的方式就是我們常看到的在網址後面, 參數=值的格式, 例如:
http://www.blogger.com/post-edit.g?blogID=95939&postID=1159981918019
就是將 blogID 這個變數其值是 95939 和 postID 值是 1159981918019 傳給伺服器
http://www.blogger.com/ 中的 post-edit.g 這個程式
所以, get 的方法就很簡單, 只要在 curl_init 中將整個網址當參數就可以了, 例如:
$ch = curl_init("http://www.blogger.com/post-edit.g?blogID=95939&postID=1159981918019");
如果參數的值是會變動的也可以用變數代替, 例如:
$ch = curl_init("http://www.blogger.com/post-edit.g?blogID=$bid&postID=$pid");

get 的方法一般比較常用, 方法也較簡單, 而且你可以用瀏覽器先看看你要抓的網站他的程式需要甚麼參數, 你就可以直接拿來使用
另一種方法 post 就沒那麼方便了, 雖然用 curl 的方法沒多複雜, 但是我們沒辦法直接看到網站的程式, 他所需要的參數是甚麼, 所以需要其他輔助的工具來幫忙, 這個部份比較多我就留在下一次再跟大家介紹

標籤: ,

星期二, 10月 03, 2006

[PHP] 用 curl 來抓網路上的資料(一)

CURL 是 Client URL Library 的縮寫, 他是 php 當作 client 的好用工具, 如果你需要用程式來抓人網站的資料來處理, 他是一個很方便的函式庫, PHP 4.0.2 之後的版本有支援, 如果你的 PHP 不能用可以去以下的網址 curl 下載套件安裝
要使用 curl, 首先要先啟始 curl:
$ch = curl_init("http://tw.yahoo.com");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://tw.yahoo.com");

接著要設定相關選項, 選項的部份相當的多, 詳細的資料可參考 www.php.net curl_setopt
我僅就我常用的說明一下:

如果你連的網站回傳是 xml 格式, 你將傳回的 xml 格式以 SAX 或 DOM 的方式, 將 CURLOPT_HEADER 設成 0, header 就不會回傳以方便後續處理
curl_setopt($ch, CURLOPT_HEADER, 0);

如果網站回傳的資料, 你需要做後續處理, 一般我們會將他存在一個字串, 這時你就需要用
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
最後真的開始連接網站時就可以用:
$result = curl_exec($ch);
將結果存在 $result 中了

如果你希望將連接網站的資料存在檔案中, 你需要先開一個檔案
$fp = fopen("test.html", "w");
再用:
curl_setopt($ch, CURLOPT_FILE, $fp);
指定將等下執行 curl_exec($ch); 的結果存進 $fp (即 test.html 裡)

最後當然一定要執行
curl_exec($ch);

$result = curl_exec($ch);

當然最後使用完了要關閉, 用:
curl_close($ch);

下次再介紹, 如果有參數要傳 (用 post 或 get ), curl 該如何做

標籤: ,