Hướng dẫn dùng sms php trong PHP

Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)

Tin nhắn văn bản đã trở nên vô cùng phổ biến trên khắp thế giới -- đến mức ngày càng có nhiều ứng dụng web tích hợp SMS để thông báo cho người dùng về sự kiện, chương trình bán hàng hoặc phiếu giảm giá trực tiếp thông qua các thiết bị di động của họ.

Trong hướng dẫn này, chúng tôi sẽ khái quát các nguyên tắc cơ bản của việc gửi tin nhắn văn bản bằng PHP.


Tổng quan

Việc gửi một tin nhắn văn bản (SMS) thật sự khá dễ dàng.

Bên dưới là một sơ đồ được đơn giản hoá về cách một tin nhắn có thể được gửi từ một ứng dụng web đến một thiết bị không dây.

Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP

Chúng ta sẽ đi tìm hiểu từng bước một:

  • Tin nhắn được soạn ra bằng một ứng dụng web được lưu trữ và thực thi trên một máy chủ HTTP và sau đó gửi thông qua internet ("đám mây") dưới dạng một tin nhắn email.
  • Email được nhận bởi một Short Message Service Gateway (SMS Gateway), nó chuyển đổi tin nhắn từ một email thành một tin nhắn SMS.
  • Sau đó, tin nhắn SMS được đưa đến một Short Message Service Center (SMSC), nó là một máy chủ chuyển dữ liệu đến các thiết bị di động cụ thể.
  • Cuối cùng tin nhắn được truyền tải thông qua mạng không dây đến người nhận.

Hầu hết các mạng không dây đều có một cổng SMS mà thông qua đó các tin nhắn email có thể được gửi dưới dạng các tin nhắn văn bản đến một thiết bị di động. Đây là điều tuyệt vời, bởi vì, từ quan điểm của nhà phát triển, nói chung nó là miễn phí - tuy vậy, tất nhiên là nó không miễn phí đối với người dùng cuối. Các khoản phí vẫn áp dụng đối với người nhận tin nhắn và các tin nhắn được gửi thông qua email sẽ được tính phí như một tin nhắn văn bản không thông qua mạng.


Email đến SMS

Để gửi SMS thông qua email, bạn thường chỉ cần hai thứ:

  • Số điện thoại hoặc số nhận dạng duy nhất của thiết bị di động mà bạn muốn tiếp cận.
  • Và tên miền của mạng không dây (nhiều cái có thể được tìm thấy trong danh sách email đến SMS này)

Quy ước sau có thể được tuân theo đối với hầu hết các nhà mạng:

phoneNumber là số điện thoại của thiết bị di động để gửi tin nhắn đến, và domainName.com là địa chỉ cho SMS Gateway của mạng.

Để gửi văn bản đến Mr. Example, bạn chỉ cần thêm vào bất kỳ ứng dụng email nào, nhập một tin nhắn và nhấn gửi. Việc này sẽ gửi một tin nhắn văn bản đến số điện thoại +1 (385) 555-0168 trên Mạng Không dây của Verizon.

Ví dụ, tôi sẽ gửi một tin nhắn văn bản tới chính mình bằng Gmail.

Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP

Khi điện thoại của tôi nhận được tin nhắn đó, nó sẽ trông giống như sau:


Hàm mail của PHP

Hãy tiến thêm một bước nữa. Bằng việc sử dụng SMS Gateway, chúng ta có thể gửi một tin nhắn văn bản thông qua email bằng hàm mail của PHP. Hàm mail có ký hiệu như sau:

bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Bạn có thể đọc thêm về nó ở đây.

  • $to xác định người nhận hoặc người nhận tin nhắn. Các ví dụ hợp lệ bao gồm:
    • ,
    • User <>
    • User1 <>, User2 <>
  • $subject thì khá rõ rồi; nó sẽ là một chuỗi có chứa chủ đề mong muốn. Tuy nhiên, SMS không yêu cầu một chủ đề.
  • $message là tin nhắn cần được gửi. Như đã đề cập trong hướng dẫn sử dụng PHP, "mỗi dòng nên được tách ra bằng một LF (\ n). Các dòng không nên nhiều hơn 70 ký tự."

Để lặp lại tính năng như trên, chúng ta có thể viết code PHP sau đây:

mail( '', '', 'Testing' );

Thử nghiệm

Hãy làm một bài kiểm tra với PHP để đảm bảo rằng mọi thứ đều được thiết lập một cách chính xác và hàm mail thật sự gửi một tin nhắn văn bản. Chúng ta có thể chạy code sau đây:

Khi điện thoại của tôi nhận được tin nhắn, nó trông như sau:

Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP

Nếu bạn nhận được một lỗi, hãy xem phần khắc phục sự cố.

Như bạn có thể thấy trong hình ở trên, tin nhắn cho biết nó là từ Gmail. Điều này là do tôi định tuyến tất cả các tin nhắn đi của tôi từ máy chủ cục bộ thông qua dịch vụ đó. Thật không may, khi viết bài này, tôi đã không thể thay đổi header From để phản ánh một địa chỉ thay thế. Dường như header email bị loại bỏ và thay thế bằng header được chuẩn bị bởi SMS Gateway. Nếu người nào biết cách giải quyết, xin vui lòng để lại ý kiến và cho những người khác biết nhé!


Thêm Tính khả dụng

Markup

Với những cơ sở đã có, hãy lấy ý tưởng này và quấn một giao diện người dùng xung quanh nó. Đầu tiên, chúng ta sẽ thiết lập một form đơn giản:


 
   
  
  
   

Sending SMS with PHP

Giao diện

Tiếp theo, chúng ta sẽ áp dụng một số CSS:

body {
 margin: 0;
 padding: 3em 0;
 color: #fff;
 background: #0080d2;
 font-family: Georgia, Times New Roman, serif;
}

#container {
 width: 600px;
 background: #fff;
 color: #555;
 border: 3px solid #ccc;
 -webkit-border-radius: 10px;
 -moz-border-radius: 10px;
 -ms-border-radius: 10px;
 border-radius: 10px;
 border-top: 3px solid #ddd;
 padding: 1em 2em;
 margin: 0 auto;
 -webkit-box-shadow: 3px 7px 5px #000;
 -moz-box-shadow: 3px 7px 5px #000;
 -ms-box-shadow: 3px 7px 5px #000;
 box-shadow: 3px 7px 5px #000;
}

ul {
 list-style: none;
 padding: 0;
}

ul > li {
 padding: 0.12em 1em
}

label {
 display: block;
 float: left;
 width: 130px;
}

input, textarea {
 font-family: Georgia, Serif;
}

Code này cho chúng ta form đơn giản sau đây:

Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP


Script

Phần quan trọng nhất cho việc này là script PHP. Chúng ta sẽ viết một ít code đó ngay bây giờ:

  • Script đầu tiên kiểm tra xem liệu form đã được submit hay chưa.
  • Nếu có, nó sẽ kiểm tra xem các biến phoneNumber, carriersmsMessage đã được gửi hay chưa. Điều này là hữu ích trong trường hợp nơi mà có thể có nhiều hơn một form trên trang.
  • Nếu phoneNumber, carriersmsMessage sẵn có và phoneNumbercarrier không rỗng, thì bạn có thể gửi tin nhắn.
  • Đối số message trong hàm mail nên có chiều dài 70 ký tự mỗi dòng. Chúng ta có thể cắt tin nhắn thành 70 ký tự bằng cách sử dụng hàm wordwrap.
  • phoneNumbercarrier được nối lại và sau đó tin nhắn được gởi đi bằng hàm mail.
  • Nếu dữ liệu bị thiếu hoặc nó không hợp lệ, thì script chỉ trả về Not all information was submitted.
  • Sau cùng, mail trả về một boolean cho biết nó có thành công hay không. Giá trị được lưu trữ trong biến $result trong trường hợp tôi cần kiểm tra rằng tin nhắn đã thật sự được gửi đi.

Lưu ý: Phương thức mail chỉ thông báo là tin nhắn đã được gửi hay chưa. Nó không cung cấp cách để kiểm tra xem liệu tin nhắn đã được nhận thành công bởi máy chủ hoặc hộp thư của người nhận hay không.


Code Hoàn chỉnh

?>

 
   
   
  
  
   

Sending SMS with PHP


Khắc phục sự cố

Lỗi Localhost

Để sử dụng hàm mail, bạn phải có một máy chủ mail đang chạy. Nếu bạn đang chạy ứng dụng này trên một host, thì bạn có thể yên tâm. Nhưng nếu bạn không chắc chắn, tôi khuyên bạn nên nói chuyện với một quản trị viên. Điều này cũng hợp lý đối với những chiếc máy tính cá nhân. Vì vậy, nếu bạn gặp phải những lỗi như..

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\sms\mail-test.php

...bạn sẽ phải cài đặt và cấu hình một máy chủ mail. Việc này nằm ngoài phạm vi của hướng dẫn này. Tuy nhiên, nếu bạn đang làm việc trên máy cục bộ của bạn, thì chuyển sang một cái gì đó đại loại như XAMPP có thể giải quyết được vấn đề này. Ngoài ra, hãy thử cài đặt Mercury Mail cùng với WAMP, MAMP hay trên một hệ thống LAMP (hoặc SAMP hoặc OAMP, v.v...) (rất nhiều 'AMP').

PHPMailer

Một lựa chọn khác (cách làm mà tôi thích) là sử dụng PHPMailer. Dưới đây là một ví dụ về cách sử dụng PHPMailer để kết nối đến máy chủ SMTP của Gmail và gửi tin nhắn.

Việc sử dụng nó cũng đơn giản như bao gồm một lớp trong script của bạn.

require 'class.phpmailer.php';

// Instantiate Class
$mail = new PHPMailer();

// Set up SMTP
$mail->IsSMTP();                // Sets up a SMTP connection
$mail->SMTPDebug  = 2;          // This will print debugging info
$mail->SMTPAuth = true;         // Connection with the SMTP does require authorization
$mail->SMTPSecure = "tls";      // Connect using a TLS connection
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->Encoding = '7bit';       // SMS uses 7-bit encoding

// Authentication
$mail->Username   = ""; // Login
$mail->Password   = "password"; // Password

// Compose
$mail->Subject = "Testing";     // Subject (which isn't required)
$mail->Body = "Testing";        // Body of our message

// Send To
$mail->AddAddress( "##########@vtext.com" ); // Where to send it
var_dump( $mail->send() );      // Send!

Code này sẽ in ra một cái gì đó cùng với các dòng:

Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP
Hướng dẫn dùng sms php trong PHP

Có thể mất nhiều công sức hơn một chút để thiết lập kết nối tùy thuộc vào tình huống của bạn. Nếu bạn có ý định sử dụng Gmail, Google đã cung cấp cho bạn thông tin về việc kết nối.


Tóm tắt

Có rất nhiều cách khác nhau để hoàn thành tác vụ gửi SMS thông qua một ứng dụng web. Cách này chỉ dành cho khối lượng tin nhắn thấp (ít hơn 1.000 tin nhắn văn bản mỗi tháng) và các nhà phát triển muốn thử nghiệm mà không cần tốn nhiều tiền. Các lựa chọn khác gồm có:

  • Sử dụng một SMS Gateway Provider
    • Thử tìm kiếm trên Google sẽ cho ra nhiều lựa chọn.
    • Hầu hết các SMS Gateway Provider đều có một API cho việc gửi tin nhắn thông qua một ứng dụng web.
    • Bạn thường có thể đăng ký dịch vụ với một mức phí hợp lý, giả định bạn đang có kế hoạch gửi ít nhất 1.000 tin nhắn SMS mỗi tháng.
    • Bạn có thể thuê một mã số ngắn.
  • Sử dụng một modem GSM
    • Đây có thể là một cách làm tốn kém và chậm chạp, vì bạn phải mua một modem và có một thuê bao với nhà mạng không dây
    • Bạn cũng sẽ phải sử dụng tập lệnh AT (Hayes).
  • Sử dụng một kết nối trực tiếp đến một mạng không dây, điều mà sẽ đòi hỏi một số khả năng thanh toán cao và rất nhiều tiền.

Hướng dẫn này không bao quát toàn bộ việc gửi tin nhắn văn bản với PHP; nhưng nó sẽ giúp bạn làm quen! Tôi hy vọng hướng dẫn này đã gây hứng thú đối với bạn. Cảm ơn bạn đã theo dõi!