非常抱歉,關於部落格內 PHP 的部分目前已經停止維護,因本人已經很久沒有寫 PHP ,且文章中所使用的 PHP 版本偏舊,希望有心學習 PHP 的朋友們,可以參考 Codecademy 的課程,或近一步嘗試 Laravel 這個 PHP 框架(可透過 laracasts 學習),若有找不到錯的學習資源也歡迎在留言串分享,方便有需要的人能夠有更多學習的管道!
在這一堂課中,我們會學習如何利用PHP中的Mail功能,來做到自動發送電子郵件的功能。
mail("收件者","主旨","內容","附加訊息(寄件者)"):PHP自動發信功能
PHP自動發信語法
基本語法
PHP自動發信的語法相當簡單,只要在PHP的語法中插入這段
mail("收件者","主旨","內容","from:寄件者");為了測試這個功能,我先在mailinator申請一個暫時的信箱(因為有時候gmail會擋信),然後輸入下面這段語法:
mail("pjchender@mailinator.com","PHP自動寄信","這裡面是信件內容","from:haha");這時候到信箱收信,就可以收到信件了
但是我們會發現一個問題,就是中文字都變成亂碼了!
解決中文字亂碼問題
為了解決中文字會變成亂碼的問題,我們會需要改成下面這段語法:
<?php mb_internal_encoding("utf-8"); $to="收件者電子郵件"; $subject=mb_encode_mimeheader("信件主旨","utf-8"); $message="信件內容"; $headers="MIME-Version: 1.0\r\n"; $headers.="Content-type: text/html; charset=utf-8\r\n"; $headers.="From:".mb_encode_mimeheader("寄件者顯示名稱","utf-8")."<寄件者電子郵件>\r\n"; mail($to,$subject,$message,$headers); ?>這裡面有幾個地方可以注意一下:
就是可以看到一共定義了三次的headers,一般來說如果重複覆蓋變數的話,會使得變數被覆蓋,只會保留最後一次定義的結果,但這裡要留意的是,headers後面有一個「.」,這個句點非常重要,這個句點讓定義可以繼續被寫入headers這個變數中而不會被覆蓋。
另外,在headers中,我把文件改成html格式(text/html)。
接著,我把信件內容改成下面這樣:
mb_internal_encoding("utf-8"); $to="pjchender@mailinator.com"; $subject=mb_encode_mimeheader("PHP自動發信","utf-8"); $message="中文也不會有問題了喔"; $headers="MIME-Version: 1.0\r\n"; $headers.="Content-type: text/html; charset=utf-8\r\n"; $headers.="From:".mb_encode_mimeheader("PJCHENder","utf-8")."<email@anywhere.com>\r\n"; mail($to,$subject,$message,$headers);這時候即使信件內容有中文,也不會有任何問題了。
自動發信系統建立
現在許多的留言板都改成自動發信系統,也就是可以在你不知道版主E-MAIL的情況下,直接透過表單直接將你的問題寄給版主,讓我們來看看要怎麼做吧!基本版型建立
首先,我們搭配Bootstrap寫一個像這樣的基本版型
HTML語法如下:
<html xmlns="https://www.w3.org/1999/xhtml"> <head> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>自動發送E-mail</title> <style> .mail .container{ width:600px; } .mail{ font-family:微軟正黑體; font-size:22px; } </style> </head> <body> <div class="mail"> <div class="container"> <div class="header" style="text-align:center; font-size:24px; padding:30px 0"> 聯絡我 </div> <form id="msg" name="msg" method="post" action=""> <div class="form-group"> <label for="nickname">暱稱</label> <input type="text" class="form-control" id="nickname" name="nickname" placeholder="輸入您的暱稱"> </div> <div class="form-group"> <label for="email">電子郵件信箱</label> <input type="email" class="form-control" id="email" name="email" placeholder="輸入E-mail"> </div> <div class="form-group"> <label for="subject">信件主旨</label> <input type="text" class="form-control" id="subject" name="subject" placeholder="輸入主旨"> </div> <div class="form-group"> <label for="content">信件內容</label> <textarea class="form-control" id="content" name="content" rows="5"></textarea> </div> <div align="right"> <button type="submit" class="btn btn-default" >寄出</button> </div> </form> </div> </div> </body> </html>接著,可以寫PHP的部分,語法如下:
<?php if(@$_POST['nickname']!=''){ $nickname=$_POST['nickname']; $email=$_POST['email']; $sub=$_POST['subject']; $content=$_POST['content']; mb_internal_encoding("utf-8"); $to="pjchender@mailinator.com";//填入自己的電子信箱 $subject=mb_encode_mimeheader("$sub","utf-8"); $message="$content"; $headers="MIME-Version: 1.0\r\n"; $headers.="Content-type: text/html; charset=utf-8\r\n"; $headers.="From:".mb_encode_mimeheader("$nickname","utf-8")."<$email>\r\n"; mail($to,$subject,$message,$headers); } ?>這裡同樣有幾個地方可以留意:
首先,在一開始的if指令中,我們用到了一個@,之所以會用到這個小老鼠,是因為有些伺服器比較嚴格,如果有沒有被定義的變數,它會提出警告,而小老鼠的意思就是「有錯誤請不要通知我」。
另外,因為雙引號裡面雖然可以接變數,但是不能接$_POST[' '],所以我們還是先把POST的資料,建立成一個變數,才能放入雙引號中被讀取。
做到這裡差不多完成了3/4,先來測試一下功能。
寄信
收信
插入Cookie功能,避免連續發信
最後一步,我們可以在我們的程式碼中,加入COOKIE的功能,避免網友在短時間內重複發信。
加入COOKIE後的語法如下:
<?php if(@$_POST['nickname']!='' && @$_COOKIE['mail']!='sent'){ $nickname=$_POST['nickname']; $email=$_POST['email']; $sub=$_POST['subject']; $content=$_POST['content']; mb_internal_encoding("utf-8"); $to="pjchender@mailinator.com";//填入自己的電子信箱 $subject=mb_encode_mimeheader("$sub","utf-8"); $message="$content"; $headers="MIME-Version: 1.0\r\n"; $headers.="Content-type: text/html; charset=utf-8\r\n"; $headers.="From:".mb_encode_mimeheader("$nickname","utf-8")."<$email>\r\n"; mail($to,$subject,$message,$headers); setcookie("mail","sent",time()+60*3); }else if(@$_POST['nickname']!='' && @$_COOKIE['mail']=='sent'){ echo "<span class='alert alert-warning'>三分鐘只能寄一次信件</span>"; } ?>關於COOKIE的用法可以參考<PHP & MySQL 學習筆記 第七堂(簡易SESSION和COOKIE建置)>。
寫到這就大功告成了!
留意伺服器主機是否提供SMTP的服務
最後要注意的地方是,一定要留意自己的伺服器有無提供SMTP的服務,如果沒有提供的話,將無法有自動發送電子信件的功能!
以上內容均為本人在馬老師雲端研究室學習所整理之筆記
0 意見:
張貼留言