Обмен текстовыми сообщениями стал чрезвычайно распространенным во всем мире — до такой степени, что все большее число веб-приложений интегрировали SMS для уведомления пользователей о событиях, распродажах или купонах напрямую через их мобильные устройства.
В этом уроке мы рассмотрим основы отправки текстовых сообщений с помощью PHP.
Премиум вариант
Прежде чем мы перейдем к пошаговому процессу, вы, возможно, захотите взглянуть на готовое решение: SMS Sender , доступное на Envato Market. Этот скрипт PHP позволяет вам:
- создавать и импортировать контакты и группы
- отправить одно SMS или отправить массовое SMS для группы или нескольких групп
- подключиться к любому SMS-шлюзу с минимальной конфигурацией
- настроить свой SMS или электронную почту
- добавьте ссылку на свой SMS и электронную почту
- и многое другое
Если вы предпочитаете создавать отправителя текстовых сообщений с нуля, вот как это сделать.
обзор
Отправка текстового сообщения (SMS) на самом деле довольно легко.
Ниже приведена упрощенная схема передачи сообщения из веб-приложения на беспроводное устройство.
Мы разберем это — по одной части за раз:
- Сообщение составляется с использованием веб-приложения, которое сохраняется и выполняется на сервере HTTP, а затем отправляется через Интернет («облако») в виде сообщения электронной почты .
- Письмо принимается шлюзом службы коротких сообщений (SMS Gateway), который преобразует сообщение из сообщения электронной почты в сообщение SMS.
- Затем SMS-сообщение передается в Центр обслуживания коротких сообщений (SMSC), который является сервером, который направляет данные на конкретные мобильные устройства.
- Наконец, сообщение передается получателю по беспроводной сети.
Большинство беспроводных сетей имеют шлюз SMS, через который сообщения электронной почты можно отправлять в виде текстовых сообщений на мобильное устройство. Это хорошо, потому что, с точки зрения разработчика, это, как правило, бесплатно, однако, конечно, это не бесплатный сервис для конечного пользователя. По-прежнему взимаются сборы с получателя сообщения, а сообщения, отправленные по электронной почте, будут оплачиваться как текстовые сообщения, не относящиеся к сети.
Электронная почта в SMS
Чтобы отправить SMS-сообщение по электронной почте, обычно требуется всего две вещи:
- Номер телефона или уникальный идентификатор мобильного устройства, с которым вы хотите связаться.
- И доменное имя беспроводной сети (многие можно найти в этом списке адресов электронной почты на SMS)
Для большинства перевозчиков может соблюдаться следующее соглашение:
phoneNumber
— номер телефона мобильного устройства, на которое отправляется сообщение, а domainName.com
— адрес сетевого шлюза SMS.
Чтобы отправить текст на Mr. Example, вы можете просто добавить [email protected] в любой почтовый клиент, ввести сообщение и нажать «Отправить». Это отправит текстовое сообщение на телефонный номер +1 (385) 555-0168 в беспроводной сети Verizon.
Например, я отправлю себе текстовое сообщение с помощью Gmail.
Когда мой телефон получает сообщение, оно должно выглядеть так:
Довольно круто!
Функция mail
PHP
Давайте сделаем еще шаг вперед. Используя SMS-шлюз, мы можем отправить текстовое сообщение по электронной почте, используя функцию почты PHP. Функция mail
имеет следующую подпись:
1
|
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
|
Вы можете прочитать больше об этом здесь .
-
$to
определяет получателя или получателей сообщения. Допустимые примеры:- [email protected]
- [email protected], [email protected]
- Пользователь <[email protected]>
- Пользователь1 <пользователь[email protected]>, Пользователь2 <пользователь[email protected]>
-
$subject
говорит сам за себя; это должна быть строка, содержащая нужный предмет. Тем не менее, SMS не требуют темы. -
$message
— это сообщение для доставки. Как упоминалось в руководстве по PHP , «каждая строка должна быть разделена LF (\ n). Строки не должны быть длиннее 70 символов».
Чтобы повторить более раннюю функциональность, мы могли бы написать следующий код PHP:
1
|
mail( ‘[email protected]’, », ‘Testing’ );
|
Тест-драйв
Давайте запустим тест с PHP, чтобы убедиться, что все настроено правильно и что функция mail
отправит текстовое сообщение. Используя следующий код, мы можем запустить:
1
2
3
4
5
|
<?php
var_dump( mail( ‘##########@vtext.com’, », ‘This was sent with PHP.’ ) );
?>
|
Когда мой телефон получает сообщение, это выглядит так:
Если вы получаете сообщение об ошибке, см. Раздел « Устранение неполадок ».
Как вы можете видеть на изображении выше, сообщение показывает, что оно из Gmail. Это потому, что я маршрутизирую все свои исходящие сообщения с локального сервера через эту службу. К сожалению, на момент написания статьи мне не удалось изменить заголовок From
для отображения альтернативного адреса. Похоже, что заголовки сообщений удаляются и заменяются заголовками, подготовленными шлюзом SMS. Если кто-то знает об обходном пути, пожалуйста, оставьте комментарий и сообщите остальным!
Добавление юзабилити
Разметка
Изучив основы, давайте возьмем эту идею и обернем ее вокруг пользовательского интерфейса. Сначала мы настроим простую форму:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<!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:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
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-скрипт. Сейчас мы напишем этот фрагмент кода:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<?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’] .
$result = @mail( $to, », $message );
print ‘Message was sent to ‘ .
} else {
print ‘Not all information was submitted.’;
}
}
?>
<!DOCTYPE html>
|
- Сценарий сначала проверяет, была ли отправлена форма.
- Если да, он проверяет, были ли отправлены переменные
phoneNumber
,carrier
иsmsMessage
. Это полезно в случае, когда на странице может быть несколько форм. - Если
phoneNumber
,carrier
иsmsMessage
доступны, аphoneNumber
иcarrier
не пусты, можно попытаться отправить сообщение. - Аргумент сообщения в функции
mail
должен иметь длину 70 символов на строку. Мы можем разделить сообщение на 70 символов, используя функциюwordwrap
. -
phoneNumber
иcarrier
объединяются, а затем сообщение отправляется с использованием функцииmail
. - Если данные отсутствуют или их невозможно проверить, скрипт просто возвращает не всю информацию .
- Наконец,
mail
возвращает логическое значение, указывающее, было ли оно успешным или нет. Значение сохраняется в$result
если мне нужно было убедиться, что сообщение действительно отправлено.
Примечание. Метод mail
уведомляет только о том, отправлено сообщение или нет. Он не позволяет проверить, было ли сообщение успешно получено сервером-получателем или почтовым ящиком.
Финальный код
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
<?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’] .
$result = @mail( $to, », $message );
print ‘Message was sent to ‘ .
} else {
print ‘Not all information was submitted.’;
}
}
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
?>
<!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
, у вас должен быть запущен почтовый сервер. Если вы запускаете это на веб-хостинге, вы, вероятно, в порядке. Но если вы не уверены, я рекомендую поговорить с администратором. Это также относится к личным машинам. Так что, если вы получаете ошибки, как ..
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 и т. Д.) (Это много «AMP»).
PHPMailer
Другой вариант (который я предпочитаю) — использовать PHPMailer . Ниже приведен пример использования PHPMailer для подключения к SMTP-серверу Gmail и отправки сообщения.
Использовать его так же просто, как включить класс в ваш скрипт.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
require ‘class.phpmailer.php’;
// Instantiate Class
$mail = new PHPMailer();
// Set up SMTP
$mail->IsSMTP();
$mail->SMTPDebug = 2;
$mail->SMTPAuth = true;
$mail->SMTPSecure = «tls»;
$mail->Host = «smtp.gmail.com»;
$mail->Port = 587;
$mail->Encoding = ‘7bit’;
// Authentication
$mail->Username = «[email protected]»;
$mail->Password = «password»;
// Compose
$mail->Subject = «Testing»;
$mail->Body = «Testing»;
// Send To
$mail->AddAddress( «##########@vtext.com» );
var_dump( $mail->send() );
|
Это должно распечатать что-то вроде:
Установка соединения может занять немного больше, в зависимости от вашей ситуации. Если вы планируете использовать Gmail, Google предоставил информацию о подключении .
Вывод
Существует множество способов выполнить задачу отправки SMS через веб-приложение. Этот метод действительно предназначен для обмена сообщениями с небольшим объемом (скорее всего, менее 1000 текстовых сообщений в месяц) и разработчикам, которые хотят промокнуть, не тратя деньги. Другие варианты включают в себя:
- Использование поставщика SMS-шлюза
- Поиск в Google вернет множество вариантов.
- Большинство провайдеров SMS-шлюзов включают API для отправки сообщений через веб-приложение.
- Обычно вы можете подписаться на услугу по разумной цене, если вы планируете отправлять не менее 1000 SMS-сообщений в месяц.
- Вы можете арендовать короткий номер кода .
- Использование GSM модема
- Это может быть дорогостоящим и медленным способом сделать это, так как вам нужно купить модем и иметь контракт с беспроводной сетью.
- Вам также придется использовать набор команд AT (Hayes) .
- Используйте прямое подключение к беспроводной сети, что потребует серьезных переговоров и огромных денег.
Этот учебник никоим образом не является полным обзором отправки текстовых сообщений с помощью PHP; но это должно помочь вам начать! Я надеюсь, что этот урок был вам интересен. Большое спасибо за чтение!
Если вам по-прежнему нужна помощь в решении этой или любой другой проблемы с PHP, попробуйте связаться с одним из опытных разработчиков PHP в Envato Studio.