Як відправляти текстові повідомлення за допомогою PHP
() translation by (you can also view the original English article)
Текстові повідомлення стали неймовірно розповсюдженими по всьому світу з того моменту, коли все більше веб-додатків інтегрували SMS, щоб оповістити користувачів про події, продажі, або купони безпосередньо через мобільні телефони.
В даному уроці ми розглянемо основи відправлення тестових повідомлень за допомогою PHP.
Огляд
Відправляти тестові повідомлення (SMS) насправді дуже просто.
Нижче приведена спрощена схема передачі повідомлень з веб-додатку на безпровідний пристрій.



Ми розібемо її на частини, по одному:
- Зроблено повідомлення з використанням веб-додатку, яке зберігається та виконується на HTTP-сервері, а потів відправляється через Інтернет («хмара») в якості повідомлення електронної пошти.
- Лист отримано Шлюзом служби коротких повідомлень (SMS Gateway), який перетворює повідомлення електронної пошти в SMS-повідомлення.
- Потім SMS-повідомлення передається в центр обслуговування коротких повідомлень (SMSC), який являється сервером, який направляє дані на конкретні мобільні пристрої.
- Повідомлення, наостанок, передається по безпровідній мережі користувачу.
Більшість безпровідних мереж мають шлюз SMS, за допомогою якого повідомлення електронної пошти можуть відправлятися в вигляді текстових повідомлень на мобільний пристрій. Це добре, тому що з точки зору розробника він зовсім вільний, проте це не безкоштовний сервіс для кінцевого користувача. Плата з користувача повідомлення знімається, а повідомлення, відправлені по електронній пошті будуть прийматися за текстові повідомлення, відмінні від мережі.
Email на SMS
Чтобы відправити SMS по електронній пошті зазвичай потрібно тільки дві речі:
- Номер телефону або унікальній ідентифікатор мобільного пристрою, з яким ви хочете зв'язатися.
- Та доменне ім'я безпровідної мережі (багато з них можуть бути знайдені в цьому списку email на SMS)
Для більшості носіїв можна дотримуватися наступного узгодження:
1 |
phoneNumber@domainName.com |
PhoneNumber
– це номер телефону мобільного пристрою, на який відправляється повідомлення, а domainName.com
- адреса для SMS Gateway мережі.
Щоб відправити текст Mr. Example, ви можете просто додати 3855550168@vtext.com в будь-який поштовий клієнт, надрукувати повідомлення на натиснути «відправити». Таким чином ви відправите текстове повідомлення на номер телефону +1 (385) 555-0168 по безпровідній мережі Verizon.
Наприклад, я відправляю текстове повідомлення самому собі за допомогою Gmail.



Коли мій телефон отримає повідомлення, це повинно виглядати ось так:



Дійсно чудово!
Функція PHP mail
Давайте зробимо ще один крок. Використовуючи SMS Gateway, ми можемо відправляти текстове повідомлення по електронній пошті, використовуючи функцію mail
PHP. Функція mail
має наступний запис:
1 |
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) |
Ви можете дізнатися про це більше ось тут.
-
$to
визначає отримувача або отримувачів повідомлення. Допустимі варіанти:- user@example.com
- user1@example.com, user2@example.com
- User <user@example.conm>
- User1 , <user1@example.com>, User2 <user2@example.com>
-
$subject
говорить сам за себе, це повинен бути рядок, який містить необхідний об'єкт. Тим не менше, SMS не потребує цього. -
$message
- це повідомлення, яке потрібно доставити. Як розповідалось в інструкції PHP, "кожен рядок повинен розділятися LF (\n). Рядки не повинні бути довшими, ніж 70 символів".
В більш ранній версії ми могли б написати наступний PHP-код:
1 |
mail( '3855550168@vtext.com', '', 'Testing' ); |
Тест-драйв
Проведемо тест з PHP, щоб переконатися, що все
налаштовано правильно, та що функція mail
дійсно відправить текстове повідомлення. Використовуючи наступний код ми можемо запустити:
1 |
<?php
|
2 |
|
3 |
var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) |
4 |
|
5 |
?>
|
Коли мій телефон отримує повідомлення, це виглядає наступним чином:



Якщо ви отримуєте повідомлення про помилку, подивіться розділ troubleshooting.
Як видно на зображенні вище, повідомлення показую, що воно відправлене з Gmail. Це відбувається тому, що я передаю всі вихідні повідомлення з мого локального сервера через дану службу. На жаль, на момент написання цієї статті мені не вдалося змінити From
, щоб відобразити альтернативну адресу. Здається, що заголовки електронної пошти видалені та замінені заголовками, підготовленими SMS gateway. Якщо хтось знає, як це можна обійти, будь ласка, залиште свій коментар і нехай інші також дізнаються!
Додаємо юзабіліті
Розмітка
Уникаючи основи, давайте розглянемо дану ідею і обгорнемо навколо неї інтерфейс користувача. Спочатку ми створимо просту форму:
1 |
<!DOCTYPE html>
|
2 |
<head>
|
3 |
<meta charset="utf-8" /> |
4 |
</head>
|
5 |
<body>
|
6 |
<div id="container"> |
7 |
<h1>Sending SMS with PHP</h1> |
8 |
<form action="" method="post"> |
9 |
<ul>
|
10 |
<li>
|
11 |
<label for="phoneNumber">Phone Number</label> |
12 |
<input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> |
13 |
<li>
|
14 |
<label for="carrier">Carrier</label> |
15 |
<input type="text" name="carrier" id="carrier" /> |
16 |
</li>
|
17 |
<li>
|
18 |
<label for="smsMessage">Message</label> |
19 |
<textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> |
20 |
</li>
|
21 |
<li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> |
22 |
</ul>
|
23 |
</form>
|
24 |
</div>
|
25 |
</body>
|
26 |
</html>
|
Стиль
Далі – трошки вкраплюємо CSS:
1 |
body { |
2 |
margin: 0; |
3 |
padding: 3em 0; |
4 |
color: #fff; |
5 |
background: #0080d2; |
6 |
font-family: Georgia, Times New Roman, serif; |
7 |
}
|
8 |
|
9 |
#container { |
10 |
width: 600px; |
11 |
background: #fff; |
12 |
color: #555; |
13 |
border: 3px solid #ccc; |
14 |
-webkit-border-radius: 10px; |
15 |
-moz-border-radius: 10px; |
16 |
-ms-border-radius: 10px; |
17 |
border-radius: 10px; |
18 |
border-top: 3px solid #ddd; |
19 |
padding: 1em 2em; |
20 |
margin: 0 auto; |
21 |
-webkit-box-shadow: 3px 7px 5px #000; |
22 |
-moz-box-shadow: 3px 7px 5px #000; |
23 |
-ms-box-shadow: 3px 7px 5px #000; |
24 |
box-shadow: 3px 7px 5px #000; |
25 |
}
|
26 |
|
27 |
ul { |
28 |
list-style: none; |
29 |
padding: 0; |
30 |
}
|
31 |
|
32 |
ul > li { |
33 |
padding: 0.12em 1em |
34 |
}
|
35 |
|
36 |
label { |
37 |
display: block; |
38 |
float: left; |
39 |
width: 130px; |
40 |
}
|
41 |
|
42 |
input, textarea { |
43 |
font-family: Georgia, Serif; |
44 |
}
|
Це дасть нам наступну просту форму:



Скрипт
Найбільш важливою частиною являється скрипт PHP. Зараз ми напишемо цей фрагмент коду:
1 |
<?php
|
2 |
|
3 |
if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { |
4 |
if ( |
5 |
isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && |
6 |
!empty( $_REQUEST['phoneNumber'] ) && |
7 |
!empty( $_REQUEST['carrier'] ) |
8 |
) { |
9 |
$message = wordwrap( $_REQUEST['smsMessage'], 70 ); |
10 |
$to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; |
11 |
$result = @mail( $to, '', $message ); |
12 |
print 'Message was sent to ' . $to; |
13 |
} else { |
14 |
print 'Not all information was submitted.'; |
15 |
}
|
16 |
}
|
17 |
|
18 |
?>
|
19 |
<!DOCTYPE html>
|
- Спочатку скрипт перевіряє, чи була подана форма.
- Якщо так, він перевіряє, чи були відправлені змінні,
phoneNumber
,carrier
іsmsMessage
. Це корисно в випадку, коли на сторінці декілька форм. - Якщо
phoneNumber
,carrier
іsmsMessage
доступні, а phoneNumber і carrier не є пустими, можна відправляти повідомлення. - Аргумент повідомлення в
mail
повинен складатися з 70 символів в кожному рядку. Ви можете розрізати повідомлення на частини по 70 символів кожен, використовуючи функціюwordwrap
. -
PhoneNumber
таcarrier
об'єднуються і потім повідомлення відправляється за допомогою командиmail
. - Якщо дані відсутні або не можуть бути перевірені, скрипт просто повертає Not all information was submitted.
- Під кінець,
mail
повертає логічне значення, яке показує, було воно успішним, чи ні. Значення зберігається в$result
, на той випадок, якщо я захочу підтвердити, що повідомлення дійсно було відправлено.
Примітка: метод mail
тільки повідомляє, чи було відправлено повідомлення. Це не дає можливості перевірити, чи було повідомлення успішно прийнято сервером-отримувачем або поштовою скринькою.
Кінцевий код
1 |
<?php
|
2 |
|
3 |
if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { |
4 |
if ( |
5 |
isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && |
6 |
!empty( $_REQUEST['phoneNumber'] ) && |
7 |
!empty( $_REQUEST['carrier'] ) |
8 |
) { |
9 |
$message = wordwrap( $_REQUEST['smsMessage'], 70 ); |
10 |
$to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; |
11 |
$result = @mail( $to, '', $message ); |
12 |
print 'Message was sent to ' . $to; |
13 |
} else { |
14 |
print 'Not all information was submitted.'; |
15 |
}
|
16 |
}
|
1 |
?> |
2 |
<!DOCTYPE html>
|
3 |
<head>
|
4 |
<meta charset="utf-8" /> |
5 |
<style>
|
6 |
body { |
7 |
margin: 0; |
8 |
padding: 3em 0; |
9 |
color: #fff; |
10 |
background: #0080d2; |
11 |
font-family: Georgia, Times New Roman, serif; |
12 |
}
|
13 |
|
14 |
#container { |
15 |
width: 600px; |
16 |
background: #fff; |
17 |
color: #555; |
18 |
border: 3px solid #ccc; |
19 |
-webkit-border-radius: 10px; |
20 |
-moz-border-radius: 10px; |
21 |
-ms-border-radius: 10px; |
22 |
border-radius: 10px; |
23 |
border-top: 3px solid #ddd; |
24 |
padding: 1em 2em; |
25 |
margin: 0 auto; |
26 |
-webkit-box-shadow: 3px 7px 5px #000; |
27 |
-moz-box-shadow: 3px 7px 5px #000; |
28 |
-ms-box-shadow: 3px 7px 5px #000; |
29 |
box-shadow: 3px 7px 5px #000; |
30 |
}
|
31 |
|
32 |
ul { |
33 |
list-style: none; |
34 |
padding: 0; |
35 |
}
|
36 |
|
37 |
ul > li { |
38 |
padding: 0.12em 1em |
39 |
}
|
40 |
|
41 |
label { |
42 |
display: block; |
43 |
float: left; |
44 |
width: 130px; |
45 |
}
|
46 |
|
47 |
input, textarea { |
48 |
font-family: Georgia, Serif; |
49 |
}
|
50 |
</style>
|
51 |
</head>
|
52 |
<body>
|
53 |
<div id="container"> |
54 |
<h1>Sending SMS with PHP</h1> |
55 |
<form action="" method="post"> |
56 |
<ul>
|
57 |
<li>
|
58 |
<label for="phoneNumber">Phone Number</label> |
59 |
<input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> |
60 |
<li>
|
61 |
<label for="carrier">Carrier</label> |
62 |
<input type="text" name="carrier" id="carrier" /> |
63 |
</li>
|
64 |
<li>
|
65 |
<label for="smsMessage">Message</label> |
66 |
<textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> |
67 |
</li>
|
68 |
<li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> |
69 |
</ul>
|
70 |
</form>
|
71 |
</div>
|
72 |
</body>
|
73 |
</html>
|
Виправлення помилок
Помилка локального домена
Щоб використовувати функцію mail
, у вас повинен бути поштовий сервер. Якщо ви запускаєте це на web host, то, вірогідно, все добре. Але, якщо ви не впевнені, я рекомендую переговорити з адміністратором. Це відноситься і до персональних комп'ютерів. Але якщо ви отримаєте такі помилки, як…
1 |
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 |
...вам доведеться встановити та налаштувати поштовий сервер. Але це питання не входить в рамки даного уроку. Проте, якщо ви працюєте на своєму локальному пристрої, перехід на XAMPP, або щось подібне, може вирішити дану проблему. В якості альтернативи, спробуйте встановити Mercury Mail разом з WAMP, MAMP, або LAMP (або SAMP чи OAMP та ін.).
PHPMailer
Інший варіант (я віддаю перевагу цьому методу) – це використання PHPMailer. Нижче представлено приклад використання PHPMailer для підключення до SMTP-сервера Gmail та відправлення повідомлення.
Його настільки ж легко використовувати, як включити клас в ваш скрипт.
1 |
require 'class.phpmailer.php'; |
2 |
|
3 |
// Instantiate Class
|
4 |
$mail = new PHPMailer(); |
5 |
|
6 |
// Set up SMTP
|
7 |
$mail->IsSMTP(); // Sets up a SMTP connection |
8 |
$mail->SMTPDebug = 2; // This will print debugging info |
9 |
$mail->SMTPAuth = true; // Connection with the SMTP does require authorization |
10 |
$mail->SMTPSecure = "tls"; // Connect using a TLS connection |
11 |
$mail->Host = "smtp.gmail.com"; |
12 |
$mail->Port = 587; |
13 |
$mail->Encoding = '7bit'; // SMS uses 7-bit encoding |
14 |
|
15 |
// Authentication
|
16 |
$mail->Username = "email.address@gmail.com"; // Login |
17 |
$mail->Password = "password"; // Password |
18 |
|
19 |
// Compose
|
20 |
$mail->Subject = "Testing"; // Subject (which isn't required) |
21 |
$mail->Body = "Testing"; // Body of our message |
22 |
|
23 |
// Send To
|
24 |
$mail->AddAddress( "##########@vtext.com" ); // Where to send it |
25 |
var_dump( $mail->send() ); // Send! |
Це повинно роздруковуватись приблизно так:



Залежно від вашої ситуації може знадобитися трохи більше, щоб встановити з'єднання. Якщо ви плануєте використовувати Gmail, Google представив інформацію щодо з'єднання.
Закінчення
Існує безліч методів для виконання завдання по відправленню SMS через веб-додаток. Цей метод дійсно призначений для відправлення повідомлень в малих об'ємах (переважно до 1000 повідомлень за місяць), тому розробники прагнуть спробувати нові методи без зайвих затрат. Інші варіанти включають:
- Використання SMS Gateway Provider
- Пошук в Google представить вам багато варіантів.
- Більшість SMS gateway провайдерів включають API для відправлення повідомлення через веб-додаток.
- Зазвичай ви можете оформити підписку на використання сервера за досить розумну ціну, якщо ви плануєте відправляти не менше 1000 повідомлень на місяць.
- Ви можете взяти в оренду короткий кодовий номер.
- Використання GSM модему
- Це може коштувати дорого, та займати багато часу, щоб купити модем та укласти договір з компанією безпровідної мережі.
- Вам також потрібно буде використовувати AT (Hayes) command set.
- Використовуйте пряме підключення до безпровідної мережі, для чого потрібні будуть переговори та багато грошей.
Даний урок абсолютно не являється всестороннім оглядом методів відправлення текстових повідомлень через PHP; але можливо, він допоможе вам просто почати! Сподіваюсь, даний урок був цікавим для вас. Велике спасибі за те, що прочитали його!