[PHP]透過SMTP發送信件、附加檔案、選擇純文字或HTML信件

3 / 18, 2013 PHP

等了好久,又來一篇PHP教學啦~PHP用mail()函式透過SMTP寄送信件很常用到,但是,能不能附加檔案或傳送HTML信件呢?寄送郵件常常需要附加檔案,這已經是Email的基本功能了,可是mail()卻沒有辦法寄送檔案,導致必須要上傳到免費空間,這樣十分麻煩,如果網站要寄訊息和檔案給會員,也會造成寄送時的麻煩。HTML信件也常常用的到,不然整個郵件就是黑黑的字一遍,很無聊又傷眼,可使用HTML標籤可說是一大福音阿~因此,這篇文章,就要來解密該怎麼讓PHP的mail()函式寄出附加檔案及HTML標籤


首先是單純一般的郵件
<?php
$to = “s3131212@gmail.com"; //收件者
$subject = “這是測試"; //主旨
$message = “test"; //內文
$headers = “From: s3131212@gmail.com"; //寄件者
mail($to, $subject, $message, $headers);
?>

再來介紹附加檔案,其實也不算難,以下程式可以把檔案轉成MIME(base64),並且伴隨著訊息發送出去

if ($_FILES{"myfile"}{"name"} !="")
{
$file=$_FILES{"myfile"}{"tmp_name"};
$file_name=$_FILES{"myfile"}{"name"};
$content_type=$_FILES{"myfile"}{"type"};
$fp=fopen($file,"rb");
$data=fread($fp,filesize($file));
$data=chunk_split(base64_encode($data));
$content.="Content-Type: $content_type; name=$file_name\r\n";
$content.="Content-Disposition: attachment; filename=$file_name\r\n";
$content.="Content-Transfer-Encoding: base64\r\n\r\n";
$content.="$data\r\n";
$content.="--$mime_boundary--\r\n";
} 

以上程式碼就是轉檔用的,在套用到Mail程式上前,在介紹一下怎麼傳HTML內容的郵件,方法很簡單

$headers='MIME-Version: 1.0'."\r\n";
$headers.='Content-type: text/html; charset=iso-8859-1'."\r\n";

好,該把上面的程式碼合起來了~為了使寄信方便,順便給「網頁版」
網頁:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>透過SMTP發送信件、附加檔案、選擇純文字或HTML信件</title>
</head>
<body>
<form action="send.php" method="post" enctype="multipart/form-data" name="myForm">
<table width="800" align="center" cellspacing="2" cellpadding="5">
<tr>
<td width="12%">收件者</td>
<td width="25%">
<input type="text" name="to_name" size="10">
</td>
<td width="63%">收件者Email
<input type="text" name="to_email" size="30">
</td>
</tr>
<tr>
<td width="12%">寄件者</td>
<td width="25%">
<input type="text" name="from_name" size="10">
</td>
<td width="63%">寄件者Email
<input type="text" name="from_email" size="30">
</td>
</tr>
<tr>
<td>郵件內容格式</td>
<td colspan="2">
<input type="radio" name="format" value="html" checked>HTML代碼
<input type="radio" name="format" value="plain">純文字
</td>
</tr>
<tr>
<td>郵件主旨</td>
<td colspan="2">
<input type="text" name="subject" size="80">
</td>
</tr>
<tr>
<td>郵件內容</td>
<td colspan="2">
<textarea name="message" cols="62" rows="5"></textarea>
</td>
</tr>
<tr>
<td>附加檔案</td>
<td colspan="2">
<input type="file" name="myfile" size="80">
</td>
</tr>
</table>
<p align="center">
<input type="submit" value="傳送郵件">
</p>
</form>
</body>
</html>

接下來是PHP的部份,暫時取名為send.php

<?php
//設定
$to_name = "=?utf-8?B?" . base64_encode($_POST["to_name"]) . "?=";
$to_email = $_POST["to_email"];
$from_name = "=?utf-8?B?" . base64_encode($_POST["from_name"]) . "?=";
$from_email = $_POST["from_email"];
$to_name = $to_name ;
$to_email = $to_email ;
$format = $_POST["format"];
$subject = "=?utf-8?B?" . base64_encode($_POST["subject"]) . "?=";
$message = $_POST["message"];
$mime_boundary = md5(uniqid(mt_rand(), TRUE));
//郵件標頭
$header = "From: $from_name<$from_email>\r\n";
$header .= "To: $to_name<$to_email>\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=". $mime_boundary . "\r\n";

//建立郵件內容
$content = "This is a multi-part message in MIME format.\r\n";
$content .= "--$mime_boundary\r\n";
$content .= "Content-Type: text/$format; charset=utf-8\r\n";
$content .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$content .= "$message\r\n";
$content .= "--$mime_boundary\r\n";

//附加檔案處理程序
if ($_FILES{"myfile"}{"name"} != "")
{
$file = $_FILES{"myfile"}{"tmp_name"};
$file_name = $_FILES{"myfile"}{"name"};
$content_type = $_FILES{"myfile"}{"type"};
$fp = fopen($file, "rb");
$data = fread($fp, filesize($file));
$data = chunk_split(base64_encode($data));
$content .= "Content-Type: $content_type; name=$file_name\r\n";
$content .= "Content-Disposition: attachment; filename=$file_name\r\n";
$content .= "Content-Transfer-Encoding: base64\r\n\r\n";
$content .= "$data\r\n";
$content .= "--$mime_boundary--\r\n";
}

//一切無誤時傳送郵件
mail($to_email, $subject, $content, $header);
echo "郵件送出成功!"
?>

頭暈了嗎?沒關係,在此附上下載連結
http://s3131212.com/download.php?s=mail.zip

  • disqus 似乎也開始有灌水人頭出現= =

    • s3131212

      我還在斟酌要不要刪掉那篇

      • s3131212

        我決定留言留著連結刪除

    • secret

      Disqus不太安全…

  • Allen Chou

    你知道嗎
    你的語文很爛
    如果網站藥劑訊息和檔案給會員
    藥劑?????
    記得檢查

    • secret

      ………..
      話說我也常抓到你的錯字耶…

      • s3131212

        我需要加油….

    • 路人甲

      我想,這是盜用別人名義來發文吧?

      這個Blog管理員發言的話是"s3131212″,哪來的沒品?

      樓上也被騙了…(似乎)

      • secret

        原來不是Allan本尊阿…
        我也被片哩…
        誰教頭像一樣呢?

        • s3131212

          原來連你也認不出我……

          • secret

            這是秘密

            • s3131212

              …….

      • s3131212

        的確是盜用,目前已經取得他的IP,似乎是在台北市~

    • s3131212

      感謝通報
      我承認我語文爛,這次國文不及格可以嗎?錯字是難免的,有時看過很多次也不一定抓的出來,況且你留個匿名和Email都不敢留,所以你沒理由沒資格沒必要用這種語氣和我溝通,老實說我超想直接把你留言刪掉的

      • secret

        他得Email是不是直接複製你的阿?

  • sss

    幹嘛留註解

    • s3131212

      別以為你留sss我就不知道你是誰喔~
      留註解釋告訴大家這段程式碼幹嘛用的

  • 易設計

    很實用,若是可套在我網站就太好了!
    舊屋翻新

    • s3131212

      可以!只要稍微會PHP和HTML,套用就很容易

      • secret

        上面的URL有打廣告嫌疑
        建議撤除連結!

        • secret

          為甚麼總是有人愛來超級電腦網打廣告呢…

          之前才跟Allen說了
          wanteasy.xx(網X虛擬主機)利用留言的廣告事件
          現在又來一個

          • s3131212

            我太有名了~(自我感覺良好中)

            • 張傑克

              大家都有呵

              • s3131212

                ……
                (讓我自Hign一下都不行嗎XD)

        • s3131212

          不過我查了一下,網路上沒有找到一樣的留言內容,不像是機器人

          • 低調病毒zkm.exe

            不知道,但我刪了
            因怪像廣告的
            寧錯殺不願放過

            • s3131212

              你好嚴厲喔~

          • 低調病毒zkm.exe

            BTW
            留言不同但都有一樣的連結
            故加入廣告名單

            • s3131212

              嗯,阿肥的部落格也有~