PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

การส่งอีเมลด้วย Email Class ใน codeigniter อย่างง่าย

30 September 2015 By


เนื้อหาตอนนี้ จะเป็บการประยุกต์การใช้งาน Email Class ของ Codeigniter ในการ
ส่งอีเมล โดยเราจะทำในหน้า contactus ให้ผู้ใช้สามารถติดต่อกับเราด้วยการ
ส่งอีเมล สอบถามเพิ่มเติมเข้ามาได้ 
 
ตามเป็นจริงแล้วการใช้งานในส่วนของการส่งอีเมล จะไม่ค่อยมีอะไรซับซ้อนเท่าไรนัก
แต่สำหรับการทดสอบที่เครื่อง localhost เราได้มีบทความเกี่ยวกับจำลองการส่งอีเมล
มาในบทความก่อนหน้า และเราจะใช้ในบทความนี้ 
 
การตั้งค่า mercury ใน xampp สำหรับทดสอบส่งอีเมล บน localhost 
http://www.ninenik.com/content.php?arti_id=681 via @ninenik
 

สำหรับ Email Class ของ codeigniter นั้นสามารถรองรับทั้งการ

- ส่งผ่านโปรโตคอล Mail , Sendmail และ SMTP
- รองรับการเข้ารห้สแบบ TLS และ SSL สำหรับ SMTP
- ส่งให้ผู้รับพร้อมกันหลายคน
- รองรับ CC และ BCCs
- รองรับการส่งในรูปแบบข้อความ text ธรรมดา หรือ HTML
- รองรับการแนบไฟล์
- รองรับการตัดคำอัตโนมัติ
- รองรับการกำหนดความสำคัญของอีเมล 
- รองรับ BCC Batch Mode สำหรับการส่งอีเมลจำนวนมาก
- มีระบบตรวจสอบการทำงาน
 
คุณสมบัติและความสามารถตามด้านบน เราสามารถหาอ่านได้ในคู่มือได้เพิ่มเติม
 

ก่อนที่จะใช้งาน Email Class เรามาดูไฟล์ในโปรเจ็คของเรา ประกอบด้วย

1. Contactus_model.php ไฟล์นี้ยังไม่มีเราจะสร้างไฟล์นี้ไว้ในไฟลเดอร์ apps > models 
2. contactus.php เรามีไฟล์นี้อยู่แล้วในโฟลเดอร์ apps > views > pages
 
การทำงานคือ เราจะมีฟอร์มในหน้า contactus ให้ผู้ใช้กรอก ชื่อ อีเมล หัวข้อ และรายละเอียด
โดยจะมีการตรวจสอบฟอร์มด้วย form_validation ในที่นี้จะสมมติให้ส่งจากอีเมล
postmaster@localhost.com และส่งไปยังอีเมล demo@localhost.com
โดยจำลองว่า
postmaster@localhost.com คืออีเมลของผู้ใช้
demo@localhost.com คืออีเมลของเว็บไซต์ให้ผู้ใช้ส่งมาหา
เมื่อทำการส่งอีเมลแล้วจะให้แสดงข้อความแจ้งการส่ง หรือหากเกิดข้อผิดพลาดก็จะให้แสดง
ข้อความแจ้งการส่งผิดพลาด
 
เนื้อหาในตอนนี้มีการใช้งาน form validation และ library user agent 
ซึ่งเคยได้กล่าวไว้แล้วในตอนต้นๆ ของโปรเจ็ค สามารถดูเพิ่มเติมได้ที่หัวข้อ
 
ใช้งาน Form Validation สำหรับบันทึกและแก้ไขข้อมูลใน model ตอนที่ 3 
http://www.ninenik.com/content.php?arti_id=669 via @ninenik
 
 

การเรียกใช้ Email Class สำหรับส่งอีเมล

 
เริ่มต้นให้เราสร้างไฟล์ Contactus_model.php ไว้ในโฟลเดอร์ apps > models
 
<?php
class Contactus_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
        $this->load->library('form_validation'); // เรียกใช้ form validation
        $this->form_validation->set_error_delimiters('<div class="bg-danger" style="padding:3px 10px;">', '</div>');        
        $this->load->library('user_agent');  /// เรียกใช้ user agent class
        $this->load->library('email');  // เรียกใช้ email class
    }

    // สร้างฟังก์ชั่นสำหรับส่งอีเมล โดยรับค่าตัวแปร $mailData เป้น array
    public function send($mailData){

        /// BEGIN MAIL SETTINGS 
//        $config['mailtype'] = 'html';
//        $config['wordwrap'] = TRUE;
//        $this->email->initialize($config);    
        ///// END MAIL SETTINGS
        
        // ส่งจากอีเมล - ชื่อ
        $this->email->from($mailData['mail_email'],$mailData['mail_name']); 
        $this->email->to('demo@localhost.com','Demo User'); // ส่งถึง

        $this->email->subject($mailData['mail_title']); // หัวข้อที่ส่ง
        $this->email->message($mailData['mail_detail']);  // รายละเอียด
        return $this->email->send();   // คืนค่าการทำงานว่าเป็น true หรือ false      
        
    }
}
 
 
ต่อไป มาดูที่ไฟล์ contactus.php ในโฟลเดอร์ apps > views > pages
 

<div class="container">  
<h1><?=$title_h1?></h1>  
  

<?php if($action==null || $action=='send'){?>        
<?php
$this->form_validation->set_rules('mail_name', 'Name', 'required');
$this->form_validation->set_rules('mail_email', 'Email', 'required');
$this->form_validation->set_rules('mail_title', 'Title', 'required');
$this->form_validation->set_rules('mail_detail', 'Detail', 'required');                                           

if($this->form_validation->run() === FALSE){ // ถ้าตรวจสอบไม่ผ่าน ให้ทำงาน
//    echo "Error";
}else{  // กรณีตรวจสอบผ่าน
    $mailData = array(
        "mail_name"=>$this->input->post('mail_name'),  
        "mail_email"=>$this->input->post('mail_email'),  
        "mail_title"=>$this->input->post('mail_title'),  
        "mail_detail"=>$this->input->post('mail_detail')             
    );
    if($this->contactus_model->send($mailData)){
       redirect('contactus/success'); // 
    }else{
        redirect('contactus/error'); // 
    }
}
                            
if(validation_errors()){ // ถ้ามีเงื่อนไขหนึ่งใดไม่ผ่าน ให้แสดง ข้อความ error ตำแหน่งนี้
    echo   validation_errors();
    echo "<br>";
}     
    
                                
?>
<?php echo form_open('contactus/send'); ?>
<table class="table table-bordered">
   <tr class="active">
       <td colspan="2">Contact Us</td>
   </tr>
    <tr>
        <th class="text-right">
            Name:
        </th>    
    <td>
        <input type="text" name="mail_name" id="mail_name" value="<?=set_value('mail_name')?>"
         class="form_control" style="width:75%">
    </td>
    </tr>
    <tr>
        <th class="text-right">
         Email:    
        </th>
        <td>
            <input type="text" name="mail_email" id="mail_email" value="<?=set_value('mail_email')?>"
            class="form_control" style="width:75%">
        </td>
    </tr>    
    <tr>
        <th class="text-right">
         Title:    
        </th>
        <td>
            <input type="text" name="mail_title" id="mail_title" value="<?=set_value('mail_title')?>"
            class="form_control" style="width:75%">
        </td>
    </tr>   
    <tr>
        <th class="text-right">
         Detail:    
        </th>
        <td>
            <textarea name="mail_detail" id="mail_detail" rows="7" 
            style="width:75%" class="form_control"><?=set_value('mail_detail')?></textarea>
        </td>
    </tr> 
    <tr>
        <th class="text-right">
 
        </th>
        <td>
            <input type="submit" value="Send Mail" name="btn_mail" class="btn btn-primary">
        </td>
    </tr>           
</table>   
    </form> 
</div>
 
<?php } ?>       
    
    
<?php if($action=="success"){?>
<br><br>
<div class="bg-success text-center" style="padding:10px;">
    <p class="text-success">Send data completed</p>
    <a href="<?=base_url('contactus')?>" class="text-success">< Back > </a>
</div>

<?php } ?>


<?php if($action=="error"){?>
<?php
$previous_url = $this->agent->referrer();          
?>
<br><br>
<div class="bg-danger text-center" style="padding:10px;">
    <p class="text-danger">Fail! please try again.</p>
    <a href="<?=$previous_url?>" class="text-danger">< Back > </a>
</div>

<?php } ?>
       
    
</div>
 
 

มาดูแต่ละส่วนจากโค้ดไฟล์ contactus.php ด้านบน

จากโค้ดเราจะมีส่วนของตัวแปร $action อยู่  4 ค่า ได้แก่ null, send, success และ error
 

ส่วนของ $action เท่ากับ error 

ใช้สำหรับแจ้งกรณีเกิดข้อผิดพลาดในการส่งอีเมล หรือส่งอีเมลไม่ได้
 
<?php if($action=="error"){?>
<?php
$previous_url = $this->agent->referrer();          
?>
<br><br>
<div class="bg-danger text-center" style="padding:10px;">
    <p class="text-danger">Fail! please try again.</p>
    <a href="<?=$previous_url?>" class="text-danger">< Back > </a>
</div>

<?php } ?>
 

ส่วนของ $action เท่ากับ success 

ใช้สำหรับแจ้งกรณีส่งอีเมลสำเร็จ
 
<?php if($action=="success"){?>
<br><br>
<div class="bg-success text-center" style="padding:10px;">
    <p class="text-success">Send data completed</p>
    <a href="<?=base_url('contactus')?>" class="text-success">< Back > </a>
</div>

<?php } ?>
 

ส่วนของ $action เท่ากับ null และ send

ใช้สำหรับแสดงฟอร์มส่งอีเมล และทำงานคำสั่งส่งอีเมล แยกอธิบายแต่ละส่วนดังนี้
 
กำหนด rules ให้กับการตรวจสอบฟอร์มด้วย form validation ในที่นี้เช็คแค่ว่าทุกช่อง
ต้องกรอก ฟอร์มจึงจะทำการ submit ได้
 
$this->form_validation->set_rules('mail_name', 'Name', 'required');
$this->form_validation->set_rules('mail_email', 'Email', 'required');
$this->form_validation->set_rules('mail_title', 'Title', 'required');
$this->form_validation->set_rules('mail_detail', 'Detail', 'required');     
 
ตรวจสอบฟอร์มจาก rules ที่กำหนด ถ้าผ่าน เก็บค่าข้อมูลจากฟอร์มไว้ใน
ตัวแปรที่ชื่อ $mailData ในรุปแบบตัวแปร array  จากนั้น
เรียกใช้งาน models ชื่อ contactus_model เพื่อเรียกใช้งานฟังก์ชั่น send()
ที่เราสร้างไว้สำหรับส่งอีเมล โดยส่งค่าตัวแปร array ข้อมูลจากฟอร์มเข้าไป
และถ้าทำงานสำเร็จ หรือก็คือส่งอีเมลได้ ก็จะให้ แสดงผลในส่วนของ $action 
เท่ากับ success หากตรงข้าม ก็จะแสดงผลว่า error คือไม่สามารถส่งอีเมลได้
 
if($this->form_validation->run() === FALSE){ // ถ้าตรวจสอบไม่ผ่าน ให้ทำงาน
//    echo "Error";
}else{  // กรณีตรวจสอบผ่าน
    $mailData = array(
        "mail_name"=>$this->input->post('mail_name'),  
        "mail_email"=>$this->input->post('mail_email'),  
        "mail_title"=>$this->input->post('mail_title'),  
        "mail_detail"=>$this->input->post('mail_detail')             
    );
    if($this->contactus_model->send($mailData)){
       redirect('contactus/success'); // 
    }else{
        redirect('contactus/error'); // 
    }
}      
                         
 
 

ส่วนแสดงแจ้งเตือน กรณีฟอร์มไม่ผ่านตาม rules ที่กำหนด

 
if(validation_errors()){ // ถ้ามีเงื่อนไขหนึ่งใดไม่ผ่าน ให้แสดง ข้อความ error ตำแหน่งนี้
    echo   validation_errors();
    echo "<br>";
}     
 
 

สร้างฟอร์มด้วย fom_open() ฟังก์ชั่น เมื่อ submit ข้อมูลให้ไปที่ $action เท่ากับ send

 
<?php echo form_open('contactus/send'); ?>
 

ที่เหลือก็จะเป็นในส่วนของฟอร์ม มีการกำหนดให้จำค่าข้อมูลที่กรอกไป กรณียังไม่ผ่าน rules ด้วยฟังก์ชั่น set_value()

 
<table class="table table-bordered">
   <tr class="active">
       <td colspan="2">Contact Us</td>
   </tr>
    <tr>
        <th class="text-right">
            Name:
        </th>    
    <td>
        <input type="text" name="mail_name" id="mail_name" value="<?=set_value('mail_name')?>"
         class="form_control" style="width:75%">
    </td>
    </tr>
    <tr>
        <th class="text-right">
         Email:    
        </th>
        <td>
            <input type="text" name="mail_email" id="mail_email" value="<?=set_value('mail_email')?>"
            class="form_control" style="width:75%">
        </td>
    </tr>    
    <tr>
        <th class="text-right">
         Title:    
        </th>
        <td>
            <input type="text" name="mail_title" id="mail_title" value="<?=set_value('mail_title')?>"
            class="form_control" style="width:75%">
        </td>
    </tr>   
    <tr>
        <th class="text-right">
         Detail:    
        </th>
        <td>
            <textarea name="mail_detail" id="mail_detail" rows="7" 
            style="width:75%" class="form_control"><?=set_value('mail_detail')?></textarea>
        </td>
    </tr> 
    <tr>
        <th class="text-right">
 
        </th>
        <td>
            <input type="submit" value="Send Mail" name="btn_mail" class="btn btn-primary">
        </td>
    </tr>           
</table>   
 
 
เท่านี้เราก็สามารถส่งอีเมล ในรุปแบบข้อความ text ไปยังอีเมลที่ต้องการได้แล้ว
สามารถนำรูปแบบนี้ไปประยุกต์ เพิ่มเติมตามต้องการได้
 
 

การตั้งค่าให้ Email Class รองรับการใช้งาน SMTP

 
เรามาดูการตั้งค่าเพิ่มเติม สำหรับการใช้งานอีเมล สมมติเราต้องการให้ส่งผ่าน SMTP 
สามารถกำหนดในไฟล์ Contactus_model.php ได้ดังต่อไปนี้
 
<?php
class Contactus_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
        $this->load->library('form_validation'); // เรียกใช้ form validation
        $this->form_validation->set_error_delimiters('<div class="bg-danger" style="padding:3px 10px;">', '</div>');        
        $this->load->library('user_agent');  /// เรียกใช้ user agent class
        $this->load->library('email');  // เรียกใช้ email class
    }

    // สร้างฟังก์ชั่นสำหรับส่งอีเมล โดยรับค่าตัวแปร $mailData เป้น array
    public function send($mailData){

        /// BEGIN MAIL SETTINGS 
        
        // ดู gmail port เพิ่มเติมได้ที่ https://support.google.com/a/answer/176600?hl=en
        
        $config['useragent'] = 'Ninenik.com'; // กำหนดส่งจากอะไร เช่น ใช่ชื่อเว็บเรา
        $config['protocol'] = 'smtp';  // สามารถกำหนดเป็น mail , sendmail และ smtp
        $config['smtp_host'] = 'smtp-relay.gmail.com';
        $config['smtp_user'] = 'gmail_account';
        $config['smtp_pass'] = 'gmal_password';
        $config['smtp_port'] = '25';
        $config['smtp_crypto'] = 'tls'; // รูปแบบการเข้ารหัส กำหนดได้เป้น tls และ ssl
        $config['mailtype'] = 'html'; // กำหนดได้เป็น text หรือ html

        $this->email->initialize($config);    
        
        ///// END MAIL SETTINGS
        
        // ส่งจากอีเมล - ชื่อ
        $this->email->from($mailData['mail_email'],$mailData['mail_name']); 
        $this->email->to('demo@localhost.com','Demo User'); // ส่งถึง
        
        // หากต้องการส่งแบบให้มี cc หรือ bcc กำหนดตามด้านล่าง
//        $this->email->cc('another@another-example.com');
//        $this->email->bcc('them@their-example.com');        
        
        // หากต้องการแนบไฟล์ กำหนดตามนี้
//        $this->email->attach('/path/to/photo1.jpg');
//        $this->email->attach('/path/to/photo2.jpg');
//        $this->email->attach('/path/to/photo3.jpg');        
        // หรือ แนบไฟล์แบบให้แสดงในอีเมลเลย เหมาะกับรูป
//        $this->email->attach('image.jpg', 'inline');
        // หรือ แนบไฟล์แบบกำหนด url เข้าไปตรงๆ เลย
//        $this->email->attach('http://www.ninenik.com/filename.pdf');
        // หรือแบบอัพโหลดไฟล์
//        $this->email->attach($buffer, 'attachment', 'report.pdf', 'application/pdf');

        $this->email->subject($mailData['mail_title']); // หัวข้อที่ส่ง
        $this->email->message($mailData['mail_detail']);  // รายละเอียด
        return $this->email->send();   // คืนค่าการทำงานว่าเป็น true หรือ false      
        
    }
}

 
ดูตารางการตั้งค่าเพิ่มเติม และค่าเริ่มต้น กรณีเราไม่ได้กำหนดค่า จะเป็นไปตามค่าเริ่มต้น
 
Preference Default Value Options Description
useragent CodeIgniter None The “user agent”.
protocol mail mail, sendmail, or smtp The mail sending protocol.
mailpath /usr/sbin/sendmail None The server path to Sendmail.
smtp_host No Default None SMTP Server Address.
smtp_user No Default None SMTP Username.
smtp_pass No Default None SMTP Password.
smtp_port 25 None SMTP Port.
smtp_timeout 5 None SMTP Timeout (in seconds).
smtp_keepalive FALSE TRUE or FALSE (boolean) Enable persistent SMTP connections.
smtp_crypto No Default tls or ssl SMTP Encryption
wordwrap TRUE TRUE or FALSE (boolean) Enable word-wrap.
wrapchars 76   Character count to wrap at.
mailtype text text or html Type of mail. If you send HTML email you must send it as a complete web page. Make sure you don’t have any relative links or relative image paths otherwise they will not work.
charset $config['charset']   Character set (utf-8, iso-8859-1, etc.).
validate FALSE TRUE or FALSE (boolean) Whether to validate the email address.
priority 3 1, 2, 3, 4, 5 Email Priority. 1 = highest. 5 = lowest. 3 = normal.
crlf n “rn” or “n” or “r” Newline character. (Use “rn” to comply with RFC 822).
newline n “rn” or “n” or “r” Newline character. (Use “rn” to comply with RFC 822).
bcc_batch_mode FALSE TRUE or FALSE (boolean) Enable BCC Batch Mode.
bcc_batch_size 200 None Number of emails in each BCC batch.
dsn FALSE TRUE or FALSE (boolean) Enable notify message from server
 
 
ตัวอย่างการแนบไฟล์ที่อัพโหลดอย่างง่าย ใน models
ขอเพิ่มเติมตัวอย่างการแนบไฟล์แบบให้ผู้ใช้อัพโหลดไฟล์แนบไปพร้อมอีเมล
สามารถกำหนดในส่วนของการ attachment ได้ดังนี้
 
        $this->email->attach($mailData['mail_file']['tmp_name'],
                             'attachment',
                             $mailData['mail_file']['name'],
                             $mailData['mail_file']['type']
                            );
 
โดยเราต้องส่งค่าตัวแปร $_FILES เข้ามาฟังก์ชั่นนี้ด้วย เช่น
 
    $mailData = array(
        "mail_name"=>$this->input->post('mail_name'),  
        "mail_email"=>$this->input->post('mail_email'),  
        "mail_title"=>$this->input->post('mail_title'),  
        "mail_detail"=>$this->input->post('mail_detail'),   
        "mail_file"=>$_FILES['file_upload']
    );
 
แบบนี้เป็นต้น
 
 

Tags:: email email class smtp codeigniter แนบไฟล์

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง