PHP

Home

PHP Tutorial
Knowledge Developer Database Internet Resource
ฟังก์ชันเมล์และเครือข่าย
1. ภาพรวมของโปรโตคอล
2. การส่งและอ่านอีเมล์
3. ฟังก์ชันมองหาเครือข่าย
 
PHP ระดับสูง
1. การอัพโหลด
2. ฟังก์ชันเมล์และเครือข่าย
3. วันที่และเวลา
4. กราฟฟิกและภาพ
 
PHP
PHP เบื้องต้น
การสร้างโปรแกรมประยุกต์เว็บ
PHP ระดับสูง
 
Internet
PHP
SSI
HTML
AJAX
 
PHP ระดับสูง > ฟังก์ชันเมล์และเครือข่าย

การส่งและอ่านอีเมล์

วิธีการหลักสำหรับการส่งผ่านเมล์ใน PHP ใช้ฟังก์ชัน mail() โดยฟังก์ชันนี้ใช้ SMTP (Simple Mail Transfer Protocol) สำหรับการส่งเมล์

การทำงานกับ mail() สามารถใช้ class อิสระ HTML MIME mail class ในการส่งเอกสารแนบ HTML กับเมล์ SMTP ใช้เฉพาะการส่งเมล์ IMAP  (Internet Message Access Protocol อธิบายใน RFC2060) และ POP (Post Office Protocol อธิบายใน RTC1936 หรือ STD0053) ใช้สำหรับการอ่านเมล์จากแม่ข่ายเมล์ โปรโตคอลนี้ไม่สามารถส่งเมล์

IMAP ใช้อ่านและควบคุมข่าวสารเมล์ที่เก็บบนแม่ข่ายและซับซ้อนมากกว่า POP ซึ่งตามปกติใช้ในการดาวน์โหลดข่าวสารเมล์มายังลูกข่าย หรือลบจากแม่ข่าย

PHP มีไลบรารี IMAP ที่สามารถใช้ทำงานกับ POP และ NNTP (Network News Transfer Protocol) รวมถึงการเชื่อมต่อ IMAP

ฟอร์มเมล์

การติดต่อกลับจากผู้เยี่ยมชมเว็บวิธีหนึ่งคือ การรับข่าวสารผ่านอีเมล์ ในเว็บจำนวนมากมีช่องทางการสื่อสารด้วยฟอร์มเมล์ ที่ให้ผู้ต้องการติดต่อกับเจ้าของเว็บ ป้อนข้อความและส่งมายังที่อยู่อีเมล์ โดยผู้ใช้ไม่ต้องเข้าสู่แม่ข่ายเมล์ของตัวแล้วส่งมา


ภาพ 3.2.1 ฟอร์มเมล์สำหรับการจองบัตรคอนเสิร์ต

ภาพ 3.2.1 เป็นฟอร์มตัวอย่างสำหรับการจองบัตรคอนเสิร์ตอย่างง่าย ที่ให้ผู้จองบัตรป้อนรายละเอียดส่วนบุคคล ที่อยู่อีเมล์ สถานที่ติดต่อ การจองบัตร และวิธีการชำระเงิน วิธีนี้ผู้รับจองสามารถได้รับสารสนเทศครบถ้วน ตามความต้องการมากกว่าผู้จองส่งอีเมล์มาโดยตรง คำสั่งสร้างฟอร์มอยู่ใน สคริปต์ mailform.php ที่ได้แสดงในรายการคำสั่ง 3.2.1

รายการคำสั่ง 3.2.1 สคริปต์ mailform.php สำหรับการจองบัตรคอนเสิร์ต

 

<?php
include_once("mail_fns.inc");
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620" />
<title>Mail Form</title>
<style type="text/css">
<!--
body,td,th { font-family: MS Sans Serif;font-size: 14px;}
h2 {color: #0000FF}
.remark {color: #666666}
.errorMsg {color: #FF0000; font-weight: bold; font-size: 18px; }
-->
</style>
</head>

<body>
<img src="images/Banner_October_Zone.jpg">
<h2>แบบฟอร์มจองบัตรคอนเสิร์ต October Zone</h2>
<p class="errorMsg">

<?php

if ($haserror)
{
  echo "<div align='left'> ";
  echo "<span class='errorMsg'>พบความผิดพลาด</span><br/>";
  echo "$err_msg<br/>"; 
  echo "</div>";
  cleanAll($_POST);
}    
?>

</p>

<form id="mailform" name="mailform" method="post" action="mail_result.php">
<div align="left">
<table width="80%"  border="0">
<tr>
  <td width="20%">ชื่อ-นามสกุล</td>
  <td><input name="name" type="text" size="30" maxlength="50" value="<?=$name;?>" /></td>
</tr>
<tr>
  <td>อีเมล์ </td>
  <td><input name="email" type="text" size="30" maxlength="50" value="<?=$email;?>" /></td>
</tr>
<tr valign="top">
  <td>ที่อยู่ </td>
  <td><textarea name="address" cols="60" rows="3"><?=$address;?>
</textarea></td>
</tr>
<tr>
  <td>โทรศัพท์บ้าน/สำนักงาน</td>
  <td><input name="phone" type="text" size="20" maxlength="30" value="<?=$phone;?>" /></td>
</tr>
<tr>
  <td>โทรศัพท์เคลื่อนที่</td>
  <td><input name="mobile" type="text" size="20" value="<?=$mobile;?>" /></td>
</tr>
<tr>
  <td>โทรสาร </td>
  <td><input name="fax" type="text" size="20" maxlength="20" value="<?=$fax;?>" /></td>
</tr>
<tr valign="top">
  <td>จองบัตรราคา</td>
  <td><input name="ticket" type="radio" value="50"
<? if ($ticket == "50")  echo checked; ?> />  50 บาท
<input name="ticket" type="radio" value="200"
<? if ($ticket == "200") echo checked;?> />  200 บาท
<input name="ticket" type="radio" value="500"
<? if ($ticket == "500") echo checked;?> /> 500 บาท
<input name="ticket" type="radio" value="1000"
<? if ($ticket == "1000") echo checked;?> /> 1,000 บาท<br />
<span class="remark">(กรณีต้องการจองหลายราคา กรุณาแยกจองคนละฟอร์ม)
</span></td>
</tr>
<tr>
  <td>จำนวน</td>
  <td><input name="seats" type="text" size="3" maxlength="3" value="<?=$seats;?>" /> ใบ
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
จองที่นั่งหมายเลข
<input name="seat_no_begin" type="text" size="3" maxlength="3"
value="<?=$seat_no_begin;?>" />ถึงหมายเลข
<input name="seat_no_end" type="text" size="3" maxlength="3"
value="<?=$seat_no_end;?>" /></td>
</tr>
<tr>
  <td><strong>ชำระเงินโดย</strong></td>
  <td>
<input name="money" type="radio" value="transfer"
<? if ($money == "transfer") echo checked;?> />
โอนเงินผ่านธนาคารกรุงไทย สาขาXXXX เลขที่บัญชี XXXXXXXXXX ชื่อบัญชี<br />
<input name="money" type="radio" value="cash"
<? if ($money == "cash") echo checked;?> />
รับบัตรและชำระเงินด้วยตนเอง ที่ มูลนิธิสายธารประชาธิปไตย </td>
</tr>
<tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
</tr>
<tr>
  <td><input id="Cancel" onclick="self.close();return false" type="button" value="ยกเลิก" name="Cancel" /></td>
  <td><input type="submit" name="Submit" value="ตกลง" /></td>
</tr>
</table>    
<p><strong>หมายเหตุ</strong>
เมื่อเจ้าหน้าที่ได้รับข้อมูลการจองของท่านแล้ว จะดำเนินการตรวจสอบเลขที่นั่ง
และยืนยันการจองกับท่านทางโทรศัพท์ และ/หรือ อีเมล์ อีกครั้ง พร้อมกับยืนยันเรื่องการชำระเงิน
และการรับบัตรต่อไป </p>

</form>

<form name="closewindow" method="post" action="">
<div align="center">
<input name="close" type="submit" id="close" value="ปิดหน้าต่างนี้">
</div>
</form>

</body>
</html>

คุณลักษณะ action ของฟอร์ม "mailform" มีค่าเป็น “mail_result.php” หมายความว่าเมื่อคลิกส่ง (Submit) สคริปต์ประมวลผลต่อไปคือ mail_result.php และได้แสดงในรายการคำสั่ง 3.2.2

สคริปต์ mail_result.php ทำหน้าตรวจสอบค่าด้วยฟังก์ชันจากสคริปต์ mail_fns.php ที่ได้รวมไฟล์ด้วยประโยคคำสั่ง include_once()

ตรวจการเติมข้อความครบถ้วนด้วยฟังก์ชัน filledOut
filledOut($row)

ตรวจสอบรูปแบบอีเมล์ด้วยฟังก์ชัน validEmailPattern
validEmailPattern($email)

และตรวจสอบค่าที่ต้องเป็นตัวเลขจำนวนเต็มคือ ฟิลด์ seats จำนวนที่นั่งด้วยฟังก์ชัน  is_numeric()

ถ้าสารสนเทศไม่ถูกต้องจะเรียกฟอร์ม "mailform" ด้วยการรวมไฟล์

if ($haserror)
{

include("mailform.php");
exit;

}

mailform.php ได้รับการเรียกครั้ง ด้วยแสดงผลความผิดพลาดและแสดงค่าเดิมออกมาใหม่จาก $_POST

<?php
if ($haserror)
{

echo "<div align='left'> ";
echo "<span class='errorMsg'>พบความผิดพลาด</span><br/>";
echo "$err_msg<br/>"; 
echo "</div>";
cleanAll($_POST);

}
?>

รายการคำสั่ง 3.2.2 สคริปต์ mail_result.php


<?
/* --------------------------------------------------
* Setting constant.
*  -------------------------------------------------- */
define(BOOKMAIL, "booking@widebase.net"); // เปลี่ยนแปลงตามผู้รับอีเมล์
define(BOOKSUBJ, "จองบัตรคอนเสิร์ต");                       // เปลี่ยนแปลงตามหัวเรื่องจดหมาย
/* --------------------------------------------------
* Include function files.
*  -------------------------------------------------- */
include_once("mail_fns.inc");
/* --------------------------------------------------
* Validate input.
*  -------------------------------------------------- */
$row = $ _POST;

if (!filledOut($row))
{
  $err_msg = $err_msg . "เติมข้อความไม่ครบ<br/>";
  $haserror = TRUE;
}

if (!validEmailPattern($email))
{
  $err_msg = $err_msg."รูปแบบอีเมล์ไม่ถูกต้อง<br/>";
  $haserror = TRUE;
}

if (!is_numeric($seats))
{
  $err_msg = $err_msg."จำนวนที่นั่งไม่ได้เป็นตัวเลข<br/>";
  $haserror = TRUE;
}

/* --------------------------------------------------
* Found error redirected back to mailform.
*  -------------------------------------------------- */
if ($haserror)
{
  include("mailform.php");
  exit;
}

/* --------------------------------------------------
* Setting variables.
*  -------------------------------------------------- */
$price = $ticket." บาท";

if ($money == "transfer" )
  $m_method = "โอนเงินผ่านธนาคารกรุงไทย ";
elseif ($money =="cash")     
  $m_method = "รับบัตรและชำระเงินด้วยตนเอง ที่ มูลนิธิสายธารประชาธิปไตย";
else
  $m_method = "ไม่ได้ระบุ";

/* --------------------------------------------------
* Setting mail parameters.
*  -------------------------------------------------- */
$recipient = BOOKMAIL;
$subject = BOOKSUBJ;   
$header = "From: $email";

$message = $name."\n";
$message = $message."อีเมล์ ".$email."\n";
$message = $message."ที่อยู่ \n".$address."\n";
$message = $message."โทรศัพท์ : ".$phone." มือถือ : " .$mobile." โทรสาร :".$fax."\n";
$message = $message. "ต้องการจองบัตรราคา ".$price." จำนวน "
  .$seats." ใบ หมายเลขที่นั่ง ".$seat_no_begin." - ". $seat_no_end."\n";
$message = $message."ชำระเงินโดย ".$m_method."\n";

$response = ereg_replace("\n","<br/>",$message);  
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=tis-620" />
<title>Booking Result</title>
<style type="text/css">
<!--
body,td,th { font-family: MS Sans Serif;font-size: 14px;}
h2 {color: #0000FF}
.remark {color: #666666}
.errorMsg {color: #FF0000; font-weight: bold; font-size: 18px; }
-->
</style>
</head>
<body>
<img src="images/Banner_October_Zone.jpg">
<h2>แบบฟอร์มจองบัตรคอนเสิร์ต October Zone</h2>

<?php  

/* --------------------------------------------------
* Send mail.
*  -------------------------------------------------- */
if (@mail($recipient, $subject, $message, $header))
  $send = TRUE;
else
  $send = FALSE;

if ($send == TRUE)
{
  echo "การจองของท่านเรียบร้อย<br/>";
  echo "เจ้าหน้าที่รับจองจะดำเนินการตรวจสอบเลขที่นั่ง และยืนยันการจองกับ
  ท่านทางโทรศัพท์ และ/หรือ อีเมล์อีกครั้ง
  พร้อมกับยืนยันเรื่องการชำระเงิน และการรับบัตรต่อไป </p>";
  echo "$subject<br/>";
  echo "$response<br/><br/>";
}
else
{
  echo "การจองของท่านไม่สามารถทำได้ โปรดจองใหม่อีกครั้ง<br/>";
}          
?>

<div align="center">
<form name="form1" method="post" action="mailform.php">
<input name="haserror" type="hidden" value="FALSE" />
<input name="close" type="submit" id="close" value="ปิดหน้าต่างนี้">
</form>
</div>
</body>
</html>

ถ้าไม่พบความผิดพลาด mail_result.php จะจัดข้อความสำหรับพารามิเตอร์ของฟังก์ชัน mail()

ฟังก์ชัน mail

ฟังก์ชัน mail() ใช้ SMTP สำหรับการส่งอีเมล์ นอกจากนี้ฟังก์ชัน mail() สามารถใช้ HTML MIME mail class ใช้ส่งเอกสารแนบ HTML กับเมล์

ไวยากรณ์ของ mail()
bool mail (string to, string subject, string message[, string additional_headers
[, string additional_parameters]]);

to เป็นอีเมล์ผู้รับ
subject เป็นหัวข้อของข่าวสาร ต้องไม่ใช้ตัวอักษรบรรทัดใหม่ (\n)
message เป็นเนื้อความของข่าวสาร แต่ละบรรทัดแบ่งด้วยตัวอักษรบรรทัดใหม่ (\n) และแต่ละบรรทัดเก็บได้ไม่เกิน 70 ตัวอักษร
additional_headers ไม่บังคับ ตามปกติมักจะระบุเป็นอีเมล์ของผู้ส่ง (From) สำเนาถึง (CC) ตอบกลับ (Reply-To) เป็นต้น ถ้ามีหลายส่วนหัวให้แบ่งด้วย CRLF (\r\n)
additional_parameters ไม่บังคับ พารามิเตอร์สามารถส่งผ่านพารามิเตอร์เพิ่ม ไปยังโปรแกรมที่คอนฟิกเมื่อส่งเมล์ด้วยการใช้การตั้งค่าคอนฟิก sendmail_path ตัวอย่าง สามารถใช้ตั้งค่า envelope sender address เมื่อใช้ sendmail ด้วยตัวเลือก –f sendmail
ถ้าข้อความของ message ยาวกว่า 70 ตัวอักษร สามารถใช้ฟังก์ชัน wordwrap() ในการจัดข้อความให้ยาวไม่เกินบรรทัดละ 70 ตัวอักษร
$message = wordwrap($message, 70);

ตัวอย่างการเขียนคำสั่งฟังก์ชัน mail ()

<?php

$to              = 'nobody@example.com';
$subject      = 'the subject';
$message    = 'hello';
$message    = wordwrap($message, 70);
$headers     = 'From: webmaster@example.com'. "\r\n".
'Reply-To: webmaster@example.com'. "\r\n".
'X-Mailer: PHP/'. phpversion();

mail($to, $subject, $message, $headers);

?>

สคริปต์ mail_result.php ส่งอีเมล์ไปให้ผู้รับจองด้วย 4 พารามิเตอร์ รวมถึง additional_headers
mail($recipient, $subject, $message, $header)

$recipient เป็นผู้รับกำหนดด้วยค่าคงที่ BOOKMAIL
$subject เป็นหัวข้อข่าวสาร กำหนดด้วยค่าคงที่ BOOKSUBJ
$message ตัวข่าวสารมาจากฟอร์มเมล์
$header กำหนดด้วยที่อยู่อีเมล์ของผู้จอง

ถ้าผลลัพธ์การตรวจสอบและสามารถส่งเมล์ไปยังผู้รับจองเรียบร้อย จะตอบรับการจองตามภาพ 3.2.2


ภาพ 3.2.2 สคริปต์ mail_result.php ตอบรับการจองบัตรคอนเสิร์ต

หมายเหตุ    ถ้าไม่ได้ตั้งค่าให้สนับสนุนพอร์ตของ SMTP อาจจะไม่สามารถใช้ฟังก์ชัน mail() ได้ การทดสอบสามารถใช้สคริปต์ send_mailform.php ตาม URL บน www.widebase.net
http://www.widebase.net/lesson/php_lesson/mailform/send_mailform.php

 


  

สงวนลิขสิทธิ์ (C) widebase / Julaphak