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

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

Когда мой телефон получит сообщение, оно должно выглядеть так:

Довольно круто!
PHP's mail
функция
Давайте сделаем еще один шаг. Используя SMS Gateway, мы можем отправить текстовое сообщение по электронной почте, используя функцию mail
PHP. Функция mail
имеет следующую запись:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
Можете почитать ещё here.
-
$to
определяет получателя или получателей сообщения. Допустимые примеры:- user@example.com
- user1@example.com, user2@example.com
- User<user@example.com>
- User1<user1/@example.com> , User2 <user2@example.com>
-
$subject
говорящий за себя; это должна быть строка, содержащая нужный объект. Тем не менее, SMS не требует субъекта. -
$message
сообщение, которое нужно доставить. Как упоминалось в PHP manual, «каждая строка должна разделяться LF (\n). Строки не должны быть длиннее 70 символов. "
В ранней версии функциональности мы могли бы написать следующий PHP-код:
mail( '3855550168@vtext.com', '', 'Testing' );
Тест-драйв
Проведём тест с PHP, чтобы убедиться, что всё настроено правильно, и что mail
функция фактически отправит текстовое сообщение. Используя следующий код, мы можем запустить:
<?php var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) ?>
Когда мой телефон получит сообщение, оно выглядит так:

Если вы получаете сообщение об ошибке, см. раздел troubleshooting.
Как вы видно на изображении, сообщение показывает, что это Gmail. Это происходит потому, что я передаю все исходящие сообщения с моего локального сервера через эту службу. К сожалению, на момент написания этой статьи мне не удалось изменить From
, чтобы отразить альтернативный адрес. Кажется, что заголовки электронной почты удалены и заменены заголовками, подготовленными SMS gateway. Если кто-нибудь знает об обходном пути, пожалуйста, оставьте комментарий и пусть узнают все!
Добавление удобства
Разметка
Избегая основ, давайте рассмотрим эту идею и обернём вокруг неё пользовательский интерфейс. Сначала мы создадим простую форму:
<!DOCTYPE html> <head> <meta charset="utf-8" /> </head> <body> <div id="container"> <h1>Sending SMS with PHP</h1> <form action="" method="post"> <ul> <li> <label for="phoneNumber">Phone Number</label> <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> <li> <label for="carrier">Carrier</label> <input type="text" name="carrier" id="carrier" /> </li> <li> <label for="smsMessage">Message</label> <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> </li> <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> </ul> </form> </div> </body> </html>
Стиль
Далее мы брызнем 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; }
Это даст нам следующий простой вид:

Скрипт
Самой важной частью этого является скрипт PHP. Мы напишем этот фрагмент кода:
<?php if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { if ( isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && !empty( $_REQUEST['phoneNumber'] ) && !empty( $_REQUEST['carrier'] ) ) { $message = wordwrap( $_REQUEST['smsMessage'], 70 ); $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; $result = @mail( $to, '', $message ); print 'Message was sent to ' . $to; } else { print 'Not all information was submitted.'; } } ?> <!DOCTYPE html>
- Сначала скрипт проверяет, была ли предоставлена форма.
- Если да, он проверяет, были ли отправлены переменные
phoneNumber
,carrier
иsms Message
. Это полезно в случае, когда на странице может быть несколько форм. - Если
phoneNumber
,carrier
иsmsMessage
доступны, аphoneNumber
иcarrier
не пусты, можно послать сообщение. - Аргумент сообщения в функции
mail
должен состоять из 70 символов в каждой строке. Мы можем разрезать сообщение на 70 кусков символов, используя функциюwordwrap
. -
PhoneNumber
иcarrier
объединены, а затем сообщение отправляется с использованием функцииmail
. - Если данные отсутствуют или не могут быть проверены, скрипт просто возвращает Не вся информация была отправлена.
- Наконец,
mail
возвращает логическое значение, указывающее, было оно успешным или нет. Значение хранится в$ result
, если я захочу убедиться, что сообщение действительно отправлено.
Примечание: метод mail
только уведомляет, было ли отправлено сообщение. Это не даёт возможности проверить, было ли сообщение успешно принято сервером-получателем или почтовым ящиком.
Окончательный код
<?php if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { if ( isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && !empty( $_REQUEST['phoneNumber'] ) && !empty( $_REQUEST['carrier'] ) ) { $message = wordwrap( $_REQUEST['smsMessage'], 70 ); $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; $result = @mail( $to, '', $message ); print 'Message was sent to ' . $to; } else { print 'Not all information was submitted.'; } }
?> <!DOCTYPE html> <head> <meta charset="utf-8" /> <style> 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; } </style> </head> <body> <div id="container"> <h1>Sending SMS with PHP</h1> <form action="" method="post"> <ul> <li> <label for="phoneNumber">Phone Number</label> <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> <li> <label for="carrier">Carrier</label> <input type="text" name="carrier" id="carrier" /> </li> <li> <label for="smsMessage">Message</label> <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> </li> <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> </ul> </form> </div> </body> </html>
Исправление проблем
Ошибка локального домена
Чтобы использовать mail
функцию, у вас должен быть почтовый сервер. Если вы запускаете это на web host, то, вероятно, всё в порядке. Но если вы не уверены, я рекомендую поговорить с администратором. Это относится и к персональным компьютерам. Но если вы получите такие ошибки, как ..
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 и пр.) систему (много разных «AMP»).
PHPMailer
Другим вариантом (методом, который я предпочитаю) является использование PHPMailer. Ниже представлен пример использования PHPMailer для подключения к SMTP-серверу Gmail и отправки сообщения.
Его использование так же просто, как включение класса в ваш скрипт.
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 = "email.address@gmail.com"; // 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!
Это должно распечатывать что-то вроде:

Может потребоваться немного больше, чтобы настроить соединение в зависимости от вашей ситуации. Если вы планируете использовать Gmail, Google предоставил information on connecting.
Заключение
Существует множество методов для выполнения задачи отправки SMS через веб-приложение. Этот метод действительно предназначен для низкоуровневых сообщений (скорее всего, менее 1000 текстовых сообщений в месяц), а разработчики хотят оставить ноги сухими, не размахивая наличными. Другие варианты включают:
- Использование SMS Gateway Provider
- Выполнение Google search даст много вариантов.
- Большинство провайдеров SMS gateway включают API для отправки сообщений через веб-приложение.
- Обычно вы можете подписаться на сервис по разумной цене, предполагая, что вы планируете отправлять не менее 1000 SMS-сообщений в месяц.
- Можно арендовать short code number.
- Использование GSM modem
- Это может быть дорогостоящим и медленным способом, поскольку вам нужно купить модем и заключить контракт с беспроводной сетью
- Ещё можно использовать AT (Hayes) command set.
- Используйте прямое подключение к беспроводной сети, для чего потребуются переговоры и много денег.
Этот урок никоим образом не является всесторонним обзором отправки текстовых сообщений с PHP; но это должно заставить вас начать! Надеюсь, этот урок вас заинтересовал. Большое вам спасибо за чтение!
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weeklyEnvato Tuts+ tutorials are translated into other languages by our community members—you can be involved too!
Translate this post