Jak posílat textové zprávy pomocí PHP
() translation by (you can also view the original English article)
Zasílání textových zpráv se stalo extrémně rozšířeným po celém světě - do té míry, do které rostoucí počet webových aplikací integroval zprávy SMS, které uživatelům upozorňují na události, prodeje nebo kupony přímo prostřednictvím svých mobilních zařízení.
V tomto tutoriálu se budeme zabývat základy posílání textových zpráv pomocí PHP.
Přehled
Odesílání textové zprávy (SMS) je skutečně snadné.
Níže je zjednodušený diagram, jak lze odeslat zprávu z webové aplikace do bezdrátového zařízení.



Projdeme si to hezky za sebou:
- Zpráva se složí pomocí webové aplikace, která je uložena a spuštěna na serveru HTTP a posílána prostřednictvím internetu ("cloud") jako e-mailová zpráva.
- E-mail je přijímán službou Short Message Service Gateway (SMS brána), která konvertuje zprávu z e-mailové zprávy na SMS zprávu.
- Zpráva SMS je pak předána Středisku služeb krátkých zpráv (SMSC), což je server, který směruje data na konkrétní mobilní zařízení.
- Zpráva se konečně přenáší přes bezdrátovou síť příjemci.
Většina bezdrátových sítí má SMS bránu, přes kterou mohou být e-mailové zprávy odesílány jako textové zprávy do mobilního zařízení. To je hezké, protože z hlediska vývojáře je zdarma - ovšem pro koncového uživatele to není bezplatná služba. Poplatky se stále vztahují na příjemce zprávy a zprávy odeslané e-mailem budou účtovány jako textová zpráva, která není v síti.
E-mail na SMS
Chcete-li poslat SMS e-mailem, budete obvykle vyžadovat pouze dvě věci:
- Telefonní číslo nebo jedinečný identifikátor mobilního zařízení, které chcete oslovit.
- A doménové jméno bezdrátové sítě (mnohé z nich naleznete v tomto seznamu e-mailů na adresy SMS)
Pro většinu operátorů lze dodržovat následující pravidla:
1 |
phoneNumber@domainName.com |
phoneNumber
je telefonní číslo mobilního zařízení, které zprávu odesílá, a domainName.com
je adresa brány SMS sítě.
Chcete-li poslat text na adresu Mr. Example, můžete jednoduše přidat 3855550168@vtext.com do libovolného e-mailového klienta, zadejte zprávu a stiskněte poslat. Tímto odešlete textovou zprávu na telefonní číslo +1 (385) 555-0168 v síti Verizon.
Například si pošlu textovou zprávu pomocí služby Gmail.



Když telefon obdrží zprávu, měl by to vypadat takto:



Docela úžasné!
PHP funkce mail
Vezměme věci o krok dál. Pomocí brány SMS můžeme poslat textovou zprávu e-mailem pomocí PHP funkce mail
. Funkce mail
ma následující signaturu:
1 |
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) |
Více o tom můžete přečíst zde.
-
$to
definuje přijímač nebo přijímače zprávy. Platné příklady zahrnují:- user@example.com
- user1@example.com, user2@example.com
- User <user@example.com>
- User1 <user1@example.com>, User2 <user2@example.com>
-
$subject
je jasný; měl by to být řetězec obsahující požadovaný předmět. SMS však nevyžaduje předmět. -
$message
je zpráva, která má být doručena. Jak je uvedeno v příručce PHP, "každý řádek by měl být oddělen LF (\ n). Řádky by neměly být větší než 70 znaků. "
Pro replikaci dřívějších funkcí bychom mohli napsat následující PHP kód:
1 |
mail( '3855550168@vtext.com', '', 'Testing' ); |
Testovací jízda
Spusťme test s PHP, abychom se ujistili, že je vše správně nastaveno a že funkce mail
ve skutečnosti pošle textovou zprávu. Pomocí následujícího kódu můžeme spustit:
1 |
<?php
|
2 |
|
3 |
var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) |
4 |
|
5 |
?>
|
Když telefon obdrží zprávu, vypadá to takto:



Pokud se vyskytne chyba, přečtěte si část týkající se odstraňování problémů.
Jak je vidět na obrázku výše, zpráva ukazuje, že je z Gmailu. Je to proto, že všechny své odchozí zprávy směřuji z mého místního serveru přes tuto službu. Bohužel, od tohoto psaní jsem byl neúspěšný při změně záhlaví From
odrážející alternativní adresu. Zdá se, že hlavičky e-mailu jsou odstraněny a nahrazeny záhlavími, které připravuje brána SMS. Pokud někdo ví o řešení, prosím, zanechte komentář a dejte nám ostatním vědět!
Přidání použitelnosti
Označení
Se základy z cesty, vezmeme si tento nápad a zabalíme ho do uživatelského rozhraní. Nejprve vytvoříme jednoduchý formulář:
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>
|
Styl
Dále přidáme nějaké 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 |
}
|
To nám vytvoří jednoduchý formulář:



Skript
Nejdůležitější součástí je PHP skript. Napíšeme tenhle kód:
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>
|
- Scénář nejprve zkontroluje, zda byl formulář předložen.
- Pokud ano, zkontroluje, jestli byly odeslány proměnné
phoneNumber
,carrier
asmsMessage
. To je užitečné v případě, že na stránce může být více než jeden formulář. - Je-li k dispozici
phoneNumber
,carrier
asmsMessage
,phoneNumber
acarrier
nejsou prázdné, je vhodné pokoušet se odeslat zprávu. - Argument zprávy ve funkci
mail
by měl mít délku 70 znaků na řádek. Zprávu můžeme rozdělit do 70 znaků pomocí funkcewordwrap
. -
phoneNumber
acarrier
jsou spojeny a pak je zpráva odeslána pomocí funkcemail
. - Pokud chybí data nebo je nelze ověřit, skript jednoduše vrátí Ne všechny informace byly předloženy.
- Konečně,
mail
vrátí boolean, který označuje, zda byl úspěšný nebo ne. Hodnota je uložena v$result
v případě, že musím ověřit, zda byla zpráva skutečně odeslána.
Poznámka: Metoda mail
upozorňuje pouze na to, zda byla zpráva odeslána nebo ne. Neposkytuje způsob, jak zkontrolovat, zda zpráva byla úspěšně přijata příjemcem serveru nebo poštovní schránkou.
Konečný kód
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>
|
Odstraňování problémů
Chyba Localhost
Chcete-li používat funkci mail
, musíte mít spuštěn poštovní server. Pokud tuto funkci provozujete na webovém hostiteli, pravděpodobně jste v pohodě. Pokud si však nejste jisti, doporučuji mluvit s administrátorem. To platí i pro osobní počítače. Takže pokud se vám objevují chyby jako ..
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 |
.. budete muset nainstalovat a konfigurovat poštovní server. To je mimo rozsah tohoto tutoriálu. Pokud však pracujete na místním počítači, může tento problém vyřešit přepnutí na něco podobného jako XAMPP. Můžete také nainstalovat Mercury Mail podél WAMP, MAMP nebo na systém LAMP (nebo SAMP nebo OAMP atd.) (To je spousta "AMP").
PHPMailer
Další možností (což je metoda, kterou dávám přednost) je použít PHPMailer. Níže je příklad, jak používat PHPMailer pro připojení k SMTP serveru Gmailu a odeslat zprávu.
Použití je stejně jednoduché jako zařazení třídy do skriptu.
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! |
Toto by mělo vytisknout něco podobného:



Může to trvat trochu víc, než nastavíte připojení v závislosti na vaší situaci. Pokud plánujete používat službu Gmail, společnost Google poskytla informace o připojení.
Závěr
Existuje nesčetné množství způsobů, jak splnit úkol odesílání SMS prostřednictvím webové aplikace. Tato metoda je skutečně určena pro malý objemem (s největší pravděpodobností méně než 1 000 textových zpráv za měsíc) a vývojáři, kteří chtějí mokré nohy bez vybíjení hotovosti. Mezi další možnosti patří:
- Použití zprostředkovatele brány SMS
- Vyhledávání Google vrátí spoustu možností.
- Většina poskytovatelů SMS brány obsahuje rozhraní API pro odesílání zpráv prostřednictvím webové aplikace.
- Obvykle se můžete přihlásit za službu za přijatelnou cenu, za předpokladu, že plánujete poslat alespoň 1000 SMS zpráv za měsíc.
- Můžete si pronajmout krátké kódové číslo.
- Použití modemu GSM
- To může být nákladný a pomalý způsob, jak to udělat, protože musíte koupit modem a uzavřít smlouvu s bezdrátovou sítí
- Budete také muset použít sadu příkazů AT (Hayes).
- Použijte přímé připojení k bezdrátové síti, což bude vyžadovat silné vyjednávání a spoustu peněz.
Tento tutoriál není v žádném případě komplexním přehledem odesílání textových zpráv pomocí PHP; ale mělo by to pro začátek stačit. Doufám, že vás tento tutoriál zaujal. Děkuji moc za čtení!