2015年5月4日 星期一

[教學] PHP & MySQL 學習筆記 第14堂(自動發信、自動發送電子郵件)


在這一堂課中,我們會學習如何利用PHP中的Mail功能,來做到自動發送電子郵件的功能。


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="http://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的服務,如果沒有提供的話,將無法有自動發送電子信件的功能

以上內容均為本人在馬老師雲端研究室學習所整理之筆記
Share:

0 意見:

張貼留言