Croatian (Hrvatski) translation by Maja Petek (you can also view the original English article)
Slanje tekstualnih poruka postalo je ekstremno rašireno diljem svijeta -- do točke gdje sve veći broj web aplikacija integrira SMS da obavijesti korisnike o događanjima, rasprodajama ili kuponima izravno na njihove mobilne uređaje.
U ovom tutorialu ćemo obraditi osnove slanja tekstualnih poruka sa PHP-om.
Pregled
Slanje tekstualne poruke (SMS) poruke je zapravo prilično jednostavno.
Ispod je pojednostavljen dijagram kako se poruka šalje s web aplikacije na bežični uređaj.

Objasniti ćemo ovo -- dio po dio:
- Poruka će biti sastavljena koristeći aplikaciju koja je pohranjena na HTTP serveru i zatim poslana putem interneta ("cloud-a") kao email poruka.
- Short Message Service Gateway (SMS Gateway) zaprima email i konvertira poruku iz email-a u SMS poruku.
- SMS poruka je zatim proslijeđena u Short Message Service Center (SMSC), server koji usmjerava podatke u određene mobline uređaje.
- Poruka je konačno poslana primatelju preko bežične veze.
Većina bežičnih veza ima SMS gateway kroz koji email poruke mogu biti poslane kao tekstualne poruke na mobilni uređaj. To je zgodno, jer, sa stajališta razvojnog programera, općenito je besplatno - ipak, naravno, za krajnjeg korisnika to nije besplatna usluga. Naknade se još uvijek primjenjuju primatelju poruke i poruka poslanih putem email-a biti će naplaćene kao tekstualne poruke koje nisu poslane putem interneta.
Email u SMS
Kako biste poslali SMS putem email-a, općenito će vam biti potrebne samo dvije stvari:
- Telefonski broj ili jedinstveni identifikator na mobilnom uređaju kojem želite poslati poruku.
- I ime domene bežične mreže (mnoge možete pronaći na ovoj listi email u SMS adresa)
Možete pratiti sljedeću konvenciju za većinu operatera:
phoneNumber@domainName.com
phoneNumber
je telefonski broj mobilnog uređaja na koji šaljete poruku, i domainName.com
je adresa za SMS Gateway mreže.
Kako biste poslali tekst Gosp. Example, možete jednostavno dodati 3855550168@vtext.com bilo kojem email klijentu, upisati poruku i kliknuti pošalji. To će poslati tekstualnu poruku na telefonski broj +1 (385) 555-0168 na Verizon Wireless Network.
Na primjer, poslati ću sebi poruku koristeći Gmail.

Kada moj mobilni telefon zaprimi poruku, trebala bi izgledati otprilike ovako:

Prilično dobro!
PHP-ova mail
Funkcija
Napravimo korak dalje. Koristeći SMS Gateway, možemo poslati tekstualnu poruku putem email-a koristeći PHP-ovu mail
funkciju mail
funkcija ima sljedeći potpis:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
Više o tome možete pročitati ovdje.
-
$to
definira primatelja ili primatelje poruka. Valjani primjeri uključuju:- user@example.com
- user1@example.com, user2@example.com
- User <user@example.com>
- User1 <user1example.com>, User2 User2 <user2@example.com>
-
$subject
je objašnjiv već sam po sebi; trebao bi biti niz koji sadrži željeni subjekt. Ipak, SMS ne zahtijeva subjekt. -
$message
je poruka koja treba biti dostavljena. Kao što sam spomenuo u PHP priručniku, "svaki red bi trebao biti odvojen sa LF (\n). Redovi ne bi trebali biti duži od 70 znakova."
Kako bismo replicirali raniju funkcionalnost, mogli bismo napisati sljedeći PHP kod:
mail( '3855550168@vtext.com', '', 'Testing' );
Testiranje
Pokušajmo napraviti test sa PHP-om da se uvjerimo je li sve pravilno podešeno i da mail
funkcija zaista šalje tekstualnu poruku. Koristeći sljedeći kod, možemo početi:
<?php var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) ?>
Kada moj mobilni telefon zaprimi poruku, izgleda otprilike ovako:

Ako dolazi do greške, pogledajte odjeljak 'Rješavanje Problema'.
Kao što možete vidjeti na slici iznad, poruka pokazuje da je sa Gmail-a. To je zato što ja usmjeravam svoje izlazne poruke s lokalnog servera kroz taj servis. Nažalost, otkada sam ovo pisao, nisam uspijevao izmijeniti From
zaglavlje da reflektiram alternativnu adresu. Izgleda da su email zaglavlja zamijenjena zaglavljima pripremljenim od SMS gateway-a. Ako netko zna zaobilazno rješenje, molio bih da ostavi komentar i javi!
Dodavanje Iskoristivosti
Označavanje
Stavimo osnove na stranu i pokušajmo oko ove ideje umotati korisničko sučelje. Prvo ćemo podesiti jednostavnu formu:
<!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>
Stil
Zatim ćemo dodati malo CSS-a:
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; }
Time dobivamo sljedeću jednostavnu formu:

Skripta
Najvažniji dio je PHP skripta. Sada ćemo napisati taj mali dio koda:
<?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>
- Skripta prvo projerava je li forma zaprimljena.
- Ako jest, provjerava jesu li poslane
phoneNumber
,carrier
ismsMessage
varijable. Ovo je korisno u slučaju gdje bi moglo biti više od jedne forme na stranici. - Ako su
phoneNumber
,carrier
ismsMessage
dostupne iphoneNumber
icarrier
nisu prazni, sasvim je u redu pokušati poslati poruku. - Argument poruke u
mail
funkciji trebao bi biti dužine od 70 znakova po redu. Možemo skratiti poruku u dijelove od 70 znakova koristećiwordwrap
fukciju. -
phoneNumber
icarrier
su koncentrirani i zatim je poruka poslana koristećimail
funkciju. - Ako nedostaje podatak ili je validacija neuspješna, skripta jednostavno vraća Not all information was submitted.
- Konačno,
mail
vraća bool koji javlja je li funkcija uspješna ili nije. Vrijednost je pohranjena u$result
u slučaju da trebam verificirati da je poruka zaista poslana.
Napomena: mail
metoda samo obavještava je li poruka poslana ili nije. Ne pruža način da provjerite je li poruka uspješno zaprimljena na server ili poštanski sandučić primatelja.
Završni Kod
<?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>
Rješavanje Problema
Localhost Greška
Kako biste koristili mail
funkciju, morate imati pokrenuti mail server. Ako ga pokrećete na web host-u, vjerojatno je sve ok. Ali ako niste sigurni, preporučam da popričate sa adiministratorom. Ovo također vrijedi i za osobna računala. Stoga, ako dobijete grešku poput...
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
... morati ćete instalirati i konfigurirati server. Ovo je malo van teme ovog tutoriala. Ipak, ako radite na lokalnom računalu, prebacivanje na nešto poput XAMPP moglo bi riješiti problem. U suprotnom, pokušajte instalirati Mercury Mail zajedno sa WAMP, MAMP, ili na LAMP (ili SAMP ili OAMP, itd.) sistem (ovo je mnogo 'AMP-ova').
PHPMailer
Još jedna opcija (metoda koju osobno preferiram) je upotreba PHPMailer-a. Ispod je primjer kako upotrijebiti PHPMailer da spojite Gmail-ov SMTP server i pošaljete poruku.
Lako ga je koristiti kao što je lako uključiti klase u skriptu.
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!
Ovo bi trebalo ispisati nešto kao što je:

Možda će trebati malo više da podesite vezu ovisno o vašoj situaciji. Ako planirate koristiti Gmail, Google je podijelio informacije za spajanje.
Zaključak
Postoji gomila metoda da pošaljete SMS putem web aplikacije. Ova metoda je zapravo namijenjena za slanje manjeg broja poruka (najvjerojatnije manje od 1 000 tekstualnih poruka mjesečno). Druge opcije uključuju:
- Korištenje SMS Gateway Provider-a
- Google istraživanjem ćete otkriti mnoge opcije
- Većina SMS Gateway provider-a uključuje API za slanje poruka putem web aplikacije.
- Obično se možete pretplatiti na uslugu po razumnoj cijeni, pretpostavljajući da mjesečno planirate slati najmanje 1 000 SMS poruka.
- Možete unajmiti kratki kod broj.
- Korištenje GSM modem-a
- Ovo može biti skup i spor način, pošto morate kupiti modem i imati ugovor sa bežičnom mrežom
- Također biste morali upotrijebiti AT (Hayes) set naredbi.
- Upotrijebite izravnu vezu na bežičnu mrežu, koja će zahtijevati ozbiljno pregovaranje i mnogo novaca.
Ovaj tutorial ni na koji način nije opsežna recenzija za slanje tekstualnih poruka sa PHP-om; ali trebala bi vam pomoći za početak! Nadam se da vam je ovaj tutorial bio zanimljiv. Zahvaljujem se na čitanju!
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