Chinese (Traditional) (中文(繁體)) translation by Fuhuan (you can also view the original English article)
全世界,越來越多的網絡應用程序集成了 SMS,直接通過移動設備通知用戶事件,促銷活動或優惠券。
在本教程中,我們將介紹使用 PHP 發送文本消息的基礎知識。
簡介
發送短消息(SMS)消息實際上非常簡單。
下面是如何將消息從 Web 應用程序發送到無線設備的簡化圖。

我們將打破這個 - 壹次壹件:
- 該消息使用在 HTTP 服務器上存儲和執行的 Web 應用程序組成,然後通過因特網(“雲”)作為電子郵件消息發送。
- 電子郵件由短消息服務網關(SMS 網關)接收,該網關將消息從電子郵件消息轉換為 SMS 消息。
- 然後將 SMS 消息傳遞給短消息服務中心(SMSC),SMSC 是將數據路由到特定移動設備的服務器。
- 該消息最終通過無線網絡傳輸給接收者。
大多數無線網絡都有壹個 SMS 網關,通過該網關可以將電子郵件消息作為文本消息發送到移動設備。 這很好,因為從開發人員的角度來看,它通常是免費的 - 但是,它當然不是終端用戶的免費服務。 費用仍然適用於郵件的收件人,通過電子郵件發送的郵件將被收取為非網絡短消息。
電郵至短消息
要通過電子郵件發送短消息,通常只需要兩件事:
- 妳要訪問的移動設備的電話號碼或唯壹標識符。
- 無線網絡的域名(許多可以在這個電子郵件列表中找到 SMS 地址)
大多數運營商可遵循以下慣例:
phoneNumber@domainName.com
phoneNumber 是發送消息的移動設備的電話號碼,domainName.com 是網絡 SMS 網關的地址。
要向 Example 先生發送文本,妳只需將 3855550168@vtext.com 添加到任何電子郵件客戶端,輸入消息並點擊發送即可。 這將向 Verizon 無線網絡上的電話號碼 + 1(385)555-0168 發送短消息。
例如,我會使用 Gmail 向自己發送短消息。

當我的手機收到消息時,它應該是這樣的:

真棒!
PHP 的郵件功能
讓我們更進壹步。 使用 SMS 網關,我們可以使用 PHP 的郵件功能通過電子郵件發送短消息。 該郵件功能具有以下特征:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
妳可以在這裏閱讀更多相關信息。
- $ 來定義消息的接收者。 有效的例子包括:
- user@example.com
- user1 @ example.com,user2 @ example.com
- 用戶
- User2 User2
- $ subject 是相當自我解釋的; 它應該是包含所需主題的字符串。 但是,SMS 不需要主題。
- $ message 是要傳遞的消息。 如 PHP 手冊中所述, 每行應使用 LF(\ n)分隔。 行不應超過 70 個字符。“
要復制早期的功能,我們可以編寫以下 PHP 代碼:
mail( '3855550168@vtext.com', '', 'Testing' );
測試
讓我們用 PHP 運行測試,以確保壹切正確,並且郵件功能實際上將發送文本消息。 使用以下代碼,我們可以運行:
<?php var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) ?>
當我的手機收到消息時,它看起來像這樣:

如果收到錯誤,請參閱故障排除部分。
正如妳在上圖中看到的那樣,該消息顯示它來自 Gmail。 這是因為我通過該服務從本地服務器路由所有傳出消息。 不過,在撰寫本文時,我沒有成功改變 From 標頭以反映備用地址。 似乎電子郵件標題被剝離並替換為 SMS 網關準備的標頭。 如果有人知道怎麽解決,能把方法說出來嗎?
增加可用性
標記
有了基礎知識,讓我們采用這個想法並圍繞它設計壹個用戶界面。 首先,我們將設置壹個簡單的表單:
<!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 和 smsMessage 變量。 這在頁面上可能有多個表單的情況下很有用。
- 如果 phoneNumber,carrier 和 smsMessage 可用且 phoneNumber 和 carrier 不為空,則可以嘗試發送消息。
- mail 函數中的 message 參數每行應為 70 個字符。 我們可以使用 wordwrap 函數將消息分成 70 個字符的塊。
- phoneNumber 和 carrier 連接在壹起,然後使用 mail 功能發送消息。
- 如果數據丟失或無法驗證,則腳本只返回並非所有信息都已提交。
- 最後,mail 返回壹個布爾值,指示它是否成功。 如果我需要驗證消息實際上已發送,則該值存儲在 $ result 中。
註:該郵件方法只通知消息是否發送或沒有。 它不提供檢查郵件是否已由收件人服務器或郵箱成功接收的方法。
最終守則
<?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>
故障排除
Localhost 錯誤
要使用郵件功能,妳必須運行郵件服務器。 如果妳在網絡主機上運行它,妳可能還可以。 但如果妳不確定,我建議妳與管理員聯系。 這也適用於個人機器。 所以如果妳得到像... 那樣的錯誤
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 之類的東西可能會解決此問題。 或者,嘗試在 WAMP,MAMP 或 LAMP(或 SAMP 或 OAMP 等)系統(這是很多'AMP')上安裝 Mercury Mail。
PHPMailer
另壹個選項(我喜歡的方法)是使用 PHPMailer。 下面是如何使用 PHPMailer 連接到 Gmail 的 SMTP 服務器並發送消息的示例。
使用它就像在腳本中包含壹個類壹樣簡單。
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 會提供有關連接的信息。
結論
有許多方法可以完成通過 Web 應用程序發送 SMS 的任務。 這種方法實際上適用於低容量的消息傳遞(每月最多可能少於 1,000 條短消息)和開發人員希望在不花錢的情況下發送。 其他選擇包括:
- 使用 SMS 網關提供程序
- 大多數 SMS 網關提供商都包含用於通過 Web 應用程序發送消息的 API。
- 大多數 SMS 網關提供商都包含用於通過 Web 應用程序發送消息的 API。
- 假設妳計劃每月發送至少 1,000 條短消息,通常可以以合理的價格註冊服務。
- 妳可以租壹個簡短的密碼。
- 使用 GSM 調制解調器
- 這可能是壹種貴且慢的方式,因為妳得購買調制解調器並與無線網絡簽訂合同
- 妳還必須使用 AT(Hayes)命令集。
- 使用直接連接到無線網絡,這需要很多錢。
本教程絕不是對使用 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