2015年5月4日

[教學] PHP & MySQL 學習筆記 第15堂(電子報發送系統、送出附加檔案)

非常抱歉,關於部落格內 PHP 的部分目前已經停止維護,因本人已經很久沒有寫 PHP ,且文章中所使用的 PHP 版本偏舊,希望有心學習 PHP 的朋友們,可以參考 Codecademy 的課程,或近一步嘗試 Laravel 這個 PHP 框架(可透過 laracasts 學習),若有找不到錯的學習資源也歡迎在留言串分享,方便有需要的人能夠有更多學習的管道!
在上一堂課中,我們會學習如何利用PHP中的Mail功能,來做到自動發送電子郵件的功能,在這堂課中,我們要使用相同的功能,搭配上資料的讀取,建立一個電子報的發送系統。

fgets( ):讀取檔案內容
feof( ):當文字檔讀到最後的時候
while( ){ }:當...則跑...

建立電子報發送系統


版面設計

我們同樣利用HTML和Bootstrap寫一個基本的版面

語法如下:
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>電子報發送系統</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<style>
.header{
 font-size:24px;
 font-family:微軟正黑體;
}
.mail .container{
 width:60%;
}
.mail .container .msg{
 font-size:22px;
 font-family:微軟正黑體;
}
.attachment{
 font-family:微軟正黑體;
}
</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=""  enctype="multipart/form-data" >
      <div class="form-group msg">
        <label for="subject">信件主旨</label>
        <input type="text" class="form-control" id="subject" name="subject" placeholder="輸入主旨">
      </div>
      <div class="form-group msg">
        <label for="content">信件內容</label>
        <textarea class="form-control" id="content" name="content" rows="8"></textarea>
      </div>
       <div class="form-group attachment">
     <label for="attachment">附加檔案</label>
     <input type="file" id="attachment">
   </div>
      <div align="right">
       <button type="submit" class="btn btn-default" >寄出</button>
      </div>
    </form>
</div>
</div>
</body>
</html>

建立收件者名單

我們把收件者的名單,全部存成一個txt檔


讀取收件者名單

我們利用fgets( )來讀取檔案的資料


這時候我們會發現,當我們使用一次gets時,會得到第一筆資料;當我第二次使用gets時,會得到第二筆資料。


透過迴圈的寫法,我們可以把所有的資料讀出來

 


但這樣子還是稍嫌不方便,因為我們必須知道我們的資料共有幾筆。

因此,我們可以利用一個新的語法,叫做feof( ),這個語法的意思是file end of file,也就是當檔案讀到最後的時候。


我們寫一個if指令:「當檔案讀到最後的時候,幫我停止迴圈」,停止迴圈的語法是break


這時候我們可以把我們for迴圈的終止值設成很大的一個數值,反正只要讀到檔案最後的時候,這個迴圈就會自動終止。


但是這種寫法還是稍嫌奇怪,最好的方式其實是使用while迴圈,while的意思是,當...則...


所以當我這樣寫的時候,意思是「當我檔案讀到最後,則幫我讀出檔案」


聽起來好像怪怪的,檔案都已經讀到最後了,怎麼還讀得出東西呢?
所以我們要在最前面加上一個!,這個的意思是把邏輯反過來的意思,所以意思會變成「當我還沒讀到最後,則幫我讀出檔案」,這時候就可以讀出所有的e-mail清單了!


所以,最後讀取檔案的語法如下:
<?php
$SendList=fopen("p15.txt","r");
while(!feof($SendList)){
 $receiver=fgets($SendList);
 echo $receiver;
}
fclose($SendList);
?>

結合自動發送系統

接著,結合上一堂課所學的自動發送系統<學習筆記 第14堂(自動發信、自動發送電子郵件)>,我們可以寫出如下的PHP語法:
<?php

if(isset($_POST['content'])){
 $sub=$_POST['subject'];
 $content=$_POST['content'];
 $SendList=fopen("p15.txt","r");
 
 mb_internal_encoding("utf-8");
 $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("此為自動發信","utf-8")."<pjchender@gmail.com>\r\n";
 
 
 while(!feof($SendList)){
  $receiver=fgets($SendList);
  $to=$receiver;
  mail($to,$subject,$message,$headers);
  echo $to."已寄送<br>";
 }
 fclose($SendList);
}

?>
讓我們來試試看吧!

寄出

顯示寄給誰


收到信了

附加檔案功能

這個部分之後再來研究XD。

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

0 意見:

張貼留言