Статьи

Как отправлять текстовые сообщения с помощью PHP

Обмен текстовыми сообщениями стал чрезвычайно распространенным во всем мире — до такой степени, что все большее число веб-приложений интегрировали SMS для уведомления пользователей о событиях, распродажах или купонах напрямую через их мобильные устройства.

В этом уроке мы рассмотрим основы отправки текстовых сообщений с помощью PHP.

Прежде чем мы перейдем к пошаговому процессу, вы, возможно, захотите взглянуть на готовое решение: SMS Sender , доступное на Envato Market. Этот скрипт PHP позволяет вам:

  • создавать и импортировать контакты и группы
  • отправить одно SMS или отправить массовое SMS для группы или нескольких групп
  • подключиться к любому SMS-шлюзу с минимальной конфигурацией
  • настроить свой SMS или электронную почту
  • добавьте ссылку на свой SMS и электронную почту
  • и многое другое
Отправитель SMS на рынке Envato
Отправитель SMS на рынке Envato

Если вы предпочитаете создавать отправителя текстовых сообщений с нуля, вот как это сделать.


Отправка текстового сообщения (SMS) на самом деле довольно легко.

Ниже приведена упрощенная схема передачи сообщения из веб-приложения на беспроводное устройство.

Мы разберем это — по одной части за раз:

  • Сообщение составляется с использованием веб-приложения, которое сохраняется и выполняется на сервере HTTP, а затем отправляется через Интернет («облако») в виде сообщения электронной почты .
  • Письмо принимается шлюзом службы коротких сообщений (SMS Gateway), который преобразует сообщение из сообщения электронной почты в сообщение SMS.
  • Затем SMS-сообщение передается в Центр обслуживания коротких сообщений (SMSC), который является сервером, который направляет данные на конкретные мобильные устройства.
  • Наконец, сообщение передается получателю по беспроводной сети.

Большинство беспроводных сетей имеют шлюз SMS, через который сообщения электронной почты можно отправлять в виде текстовых сообщений на мобильное устройство. Это хорошо, потому что, с точки зрения разработчика, это, как правило, бесплатно, однако, конечно, это не бесплатный сервис для конечного пользователя. По-прежнему взимаются сборы с получателя сообщения, а сообщения, отправленные по электронной почте, будут оплачиваться как текстовые сообщения, не относящиеся к сети.


Чтобы отправить SMS-сообщение по электронной почте, обычно требуется всего две вещи:

  • Номер телефона или уникальный идентификатор мобильного устройства, с которым вы хотите связаться.
  • И доменное имя беспроводной сети (многие можно найти в этом списке адресов электронной почты на SMS)

Для большинства перевозчиков может соблюдаться следующее соглашение:

phoneNumber — номер телефона мобильного устройства, на которое отправляется сообщение, а domainName.com — адрес сетевого шлюза SMS.

Чтобы отправить текст на Mr. Example, вы можете просто добавить [email protected] в любой почтовый клиент, ввести сообщение и нажать «Отправить». Это отправит текстовое сообщение на телефонный номер +1 (385) 555-0168 в беспроводной сети Verizon.

Например, я отправлю себе текстовое сообщение с помощью Gmail.

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

Довольно круто!


Давайте сделаем еще шаг вперед. Используя SMS-шлюз, мы можем отправить текстовое сообщение по электронной почте, используя функцию почты PHP. Функция mail имеет следующую подпись:

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

Вы можете прочитать больше об этом здесь .

  • $to определяет получателя или получателей сообщения. Допустимые примеры:

  • $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 для подключения к 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.