2011-01-22 27 views
1

kannel経由でSMSを送信できるようになりました。しかし、これは、ヘッダなどを介して行われます:Php Kannel経由でSMSを送信する機能

header("Location:http://localhost:13013/cgi-bin/sendsms?username=xxxx&password=xxxx&to=$in_number&text=$in_msg"); 

私は、PHPの関数を経由してSMSを送信したいと私はオンラインの以下のコードを得たが、それは動作しません。 (Kannelのsmsboxログには、要求を示していない):

function sendSmsMessage($in_number, $in_msg) 
{ 
$url = '/cgi-bin/sendsms?username=' . CONFIG_KANNEL_USER_NAME 
. '&password=' . CONFIG_KANNEL_PASSWORD  
. '&charset=UCS-2&coding=2' 
. "&to={$in_number}" 
. '&text=' . urlencode(iconv('utf-8', 'ucs-2', $in_msg)); 



$results = file('http://' 
       . CONFIG_KANNEL_HOST . ':' 
       . CONFIG_KANNEL_PORT . $url); 

}

は、何か問題はありますか?私はCONFIG_KANNEL_USER_NAMEと残りの部分を実際の値に置き換えようとしましたが、それでも動作しません。提案に開放されています。

+0

'echo 'http://'.CONFIG_KANNEL_HOST。': '.CONFIG_KANNEL_PORT。$ url;'最初に要求するようにしてください。 – zerkms

答えて

4

私はcURLを使用しました。私はkannelのURLに変数を渡したいので、file_get_contentsは機能しません。file_get_contentsは二重引用符ではなく、一重引用符を使用して変数を処理しません(phpは二重引用符ではなく文字列値として扱います)。変数など)。ここ は、私は現在、あなたはすでにあなたの変数がどこかに初期化されていると仮定するとやっているものです:

$ textmsg =;「こんにちはStackOverflowのユーザを!」

の$ cellphone_number = "+ 254xxxxxxx"

$ encmsg =でurlencode($のtextmsg)。

$ch= curl_init(); 
curl_setopt($ch, "http://localhost:13013/cgi-bin/sendsms?username=xxxxx&password=xxxxx&to=$cellphone_number&text=$encmsg"); 
curl_exec($ch); 
curl_close($ch); 

これは、kannelに数字にSMSを送信するという簡単な作業に役立ちます。カールがスペースや特殊文字を認識しないことを実現するために私はしばらく時間をとった.-)。

+0

curlをインストールし、phpがcURLをサポートして動作している必要があります。 Linuxの場合、sudo apt-get php5-curlをインストールします。 phpinfo()をチェックすると、カールがどこかに見えるはずです。 – MaxI

0

(ユーザーをURLにリダイレクトするのではなく)バックグラウンドでURLの読み込みを試行する場合は、cURL、おそらくはfile_get_contentsのようなものを使用する必要があります。あなたのセットアップは、URLラッパーが有効になってはfopenた場合

たとえば、あなたは単に使用できます。

$response = file_get_contents("http://localhost:13013/cgi-bin/sendsms?username=xxxx&password=xxxx&to=$in_number&text=$in_msg"); 

にかかわらず、それはあなたが見つかった機能がいくつか追加のデバッグ情報なしでは動作しません理由を知るのは難しいです。 (CONFIG_KANNEL_HOSTが "localhost"として定義されていて、CONFIG_KANNEL_PORTが13013として定義されている場合は、追加の文字セット操作でも同じことが効果的です)。

+0

そのfile_get_contentsは、$ in_numberを文字列の一部として読み込む点を除いて動作しているようです。変数。二重引用符は変数の問題を解決しますが、file_get_contents()には一重引用符で定義された文字列が必要です。変数を文字列に直接渡す方法はありますか?ありがとう – MaxI

+0

@Max file_get_contentsには、一重引用符を含む文字列は必要ありません。単一引用符と二重引用符は、単一の構文内で一貫して使用されている限り、PHPで互換性があります。 (二重引用符は、埋め込み変数などを評価する2人の間で異なります。)したがって、一重引用符を二重引用符に変更するだけで、すべてがうまくいくはずです。 :-) –

+0

私を信じてください。それらは交換できません。私はもう試した。 cURLを使用しようとしています – MaxI

1

私の友人で、Ndola、Zambiaのkuck_1.4.3を実行するためにubuntu 11.04を使用しています。それはsmsを送受信することで完璧に動作します。下記のコードは70文字以上を送信するために編集する必要がありました。私の友人と私は、 '& charset = UCS-2 & coding = 2'の行に小さな誤りがあることを理解するために苦労しました。正しい行は '& charset = UCS-2 & encoding = 2'にする必要があります。だから、コードは以下のように表示される必要があります。

function sendSmsMessage($in_number, $in_msg) 
{ 
$url = '/cgi-bin/sendsms?username=' . CONFIG_KANNEL_USER_NAME 
. '&password=' . CONFIG_KANNEL_PASSWORD  
. '&charset=UCS-2&encoding=2' 
. "&to={$in_number}" 
. '&text=' . urlencode(iconv('utf-8', 'ucs-2', $in_msg)); 
+0

私はケニア出身です。私はUBUNTU 10.04.3を使用しています。私は間違いなくこの機能を試してみる – MaxI

1

カール使用:など

$gw_host=127.0.0.1 
$gw_port=13xx3 

次のような自分の価値観を様々な変数/パラメータを交換し

curl_init("http://$gw_host:$gw_port/cgi-bin/sendsms?username=$gw_user&password=$gw_pass&to=$to&from=$shortcode&smsc=$smsc&dlr-mask=$dlrmask&binfo=$shortcode&text=$message"); 

0

は、古代の質問をressucitateまでもありませんが、同じものを探し後天的と他人のために:

[[email protected] tools]# cat kannel-send.php 
    <?php 

    function send_sms($msgid, $numto, $msgtext, $smsc = "smsc-default", $dlrmask = 63) 
    { 

      $sendsmsurl_prefix = "http://localhost:13013/cgi-bin/sendsms"; 
      $dlrurl_prefix = "http://localhost/tools/kannel-receive.php"; 
      $username = "user"; 
      $password = "pass"; 

      # fix number to what carriers expect 
      $numto = preg_replace('/^0/', '', $numto); 
      $numto = preg_replace('/^\+55/', '', $numto); 
      $numto = "0" . $numto; 

      if (!$msgid) $dlrmask = 0; 

      $dlrurl_params = array(
        "type" => "dlr", 
        "timesent" => "%t", 
        "smsc" => "%i", 
        "uuid" => "%I", 
        "fid" => "%F", 
        "dlr-cod" => "%d", 
        "reply" => "%A", 
        "msgid" => $msgid, 
        "text" => "%a", 
        "to" => "%P", 
        "from" => "%p", 
        "origsmsc" => "%f", 
      ); 

      $dlrurl = $dlrurl_prefix . "?" . urldecode(http_build_query($dlrurl_params)); 

      $sendsmsurl_params = array(
        "username" => $username, 
        "password" => $password, 
        "to" => $numto, 
        "dlr-mask" => $dlrmask, 
        "dlr-url" => $dlrurl, 
        "smsc"=> $smsc, 
        "text" => $msgtext, 
      ); 

      $sendsmsurl = $sendsmsurl_prefix . "?" . http_build_query($sendsmsurl_params); 

      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_URL, $sendsmsurl); 
      $bogus = curl_exec($ch); 
      $ret = curl_error($ch); 
      curl_close($ch); 

      return $ret == ""; 

    } 

    ?> 

そして、あなたは、SMSを受信するために、この他のものを持っており、それを格納することができへのmysql:

[[email protected] tools]# cat kannel-receive.php 
    <?php 

    $debug = false; 

    $link = null; 

    function dbconnect() 
    { 
      global $link, $debug; 

      if ($link && mysql_ping($link)) 
        return; 

      if ($debug) echo "Conectando ao banco de dados\n"; 
      // TODO: criar um usuario de banco especifico pra isso 
      $host = 'localhost'; 
      $user = 'user'; 
      $pass = 'pass'; 
      $db = 'dbname'; 
      $link = mysql_connect($host, $user, $pass, true); 
      if (!$link){ 
        if ($debug) echo "Can't connect to mysql: " . mysql_error() . "\n"; 
      } else { 
        mysql_select_db($db, $link); 
      } 
      return; 
    } 

    function esc($str) 
    { 
      global $link; 
      return mysql_real_escape_string($str, $link); 
    } 

    if ($debug) { 
      echo "<br>Kannel inbound sms event:<br>\n"; 
      var_dump($_GET); 
    } 

    dbconnect(); 

    if ($_GET['type'] == "inbsms") { 

      $_GET['from'] = preg_replace('/^(\+55|0)/', '', $_GET['from']); 
      $sql = "INSERT INTO notificacao (tipo, endereco, mensagem, device, 
          dataEvento, situacao) 
        VALUES ('%s', '%s','%s','%s','%s','%s')"; 
      $sql = sprintf($sql, 'sms', esc($_GET['from']), esc($_GET['text']), 
        esc($_GET['smsc']), esc($_GET['timesent']), "received"); 

    } elseif ($_GET['type'] == "dlr") { 

      switch (esc($_GET['dlr-cod'])) { 
      case "1": 
        $sql = "UPDATE notificacao SET 
            situacao = 'confirmed', 
            dataConfirmacao = '{$_GET['timesent']}' 
          WHERE idnotificacao = {$_GET['msgid']}"; 
        break; 
      case "8": 
        $sql = "UPDATE notificacao SET 
            situacao = 'sent', 
            device = '{$_GET['smsc']}', 
            dataEvento = '{$_GET['timesent']}' 
          WHERE idnotificacao = {$_GET['msgid']}"; 
        break; 
      case "16": 
        $sql = "UPDATE notificacao SET 
            situacao = 'failed', 
            device = '{$_GET['smsc']}', 
            razaofalha = '{$_GET['reply']}', 
            dataEvento = '{$_GET['timesent']}' 
          WHERE idnotificacao = {$_GET['msgid']}"; 
        break; 
      } 

    } 

    if ($debug) echo "sql: $sql\n"; 

    $result = mysql_query($sql, $link); 
    if (!$result) { 
      if ($debug) echo "Erro sql: " . mysql_error() . "\n"; 
    } 

    ?> 

これは、SMS受信者とSMS配信通知受信者の2倍になります(この場合、受信者が受信したことを確認するためにSMSを送信するときにそこに置かれたデータベースのレコードが更新されます)。

これは、SMSを送信するときにそのURLを送信し(DLRマスクを確認するように設定する)ためにDLRに使用されますが、着信SMSの場合は、kannel.confを使用するように設定する必要がありますSMSサービスは、これはキャッチオール1のほんの一例です:ポルトガル語でのいくつかのテキストの

[...] 
    group = sms-service 
    keyword = default 
    get-url = "http://localhost/tools/kannel-receive.php?type=inbsms&text=%a&timesent=%t&from=%p&to=%P&smsc=%i&uuid=%I&delivery=%d&service=%n&encoding=%c&class=%m&mwi=%M&charset=%C&udh=%u&dcs=%O&origsmsc=%f" 
    catch-all = yes 
    max-messages = 0 
    accept-x-kannel-headers = true 
    concatenation = yes 
    omit-empty = yes 
    [...] 

申し訳ありませんが、あなたは画像を得ることができます

0

// PHPコードのファイル名はTEST2です。それより前に、ubuntu14にphp5-curlをインストールする必要があります。

関連する問題