2

我现在可以通过 kannel 发送短信。然而,这是通过标题完成的,例如:

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

我想通过 php 函数发送一条短信,我在网上得到了下面的代码,但它不起作用。(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 和其余部分,但它仍然不起作用。接受建议。

4

6 回答 6

4

我使用了 cURL,它 100% 可以正常工作。file_get_contents 对我不起作用,因为我想将变量传递给 kannel url,而 file_get_contents 不处理变量,因为它坚持使用单引号(php 将其视为字符串值)而不是双引号(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 向一个号码发送短信的简单任务。我花了一段时间才意识到 curl 不能识别空格和特殊字符:-)。

于 2011-01-24T13:20:52.633 回答
1

我和来自赞比亚恩多拉的朋友正在使用 ubuntu 11.04 运行 kannel_1.4.3。它可以完美地发送和接收短信。必须编辑下面的代码才能发送超过 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));
于 2011-07-13T17:57:47.933 回答
1

使用卷曲:

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");

用您的值替换各种变量/参数,例如:

$gw_host=127.0.0.1
$gw_port=13xx3

等等

于 2011-08-12T06:22:52.660 回答
0

如果您尝试在后台触发 URL 加载(而不是通过将用户重定向到 URL),则需要使用cURL甚至file_get_contents之类的东西。

例如,如果您的设置启用了 fopen URL 包装器,您可以简单地使用:

$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 那么它实际上是在做同样的事情,尽管有额外的字符集操作。)

于 2011-01-22T15:16:53.367 回答
0

不是为了恢复一个古老的问题,而是为了后验性和其他寻找相同事物的人:

    [root@sat2 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 == "";

    }

    ?>

你可以让另一个接收短信并将其存储到mysql:

    [root@sat2 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-Delivery-Notification 接收器(在这种情况下,它会更新在发送 sms 时放置在那里的数据库中的记录,以确认它已被接收)。

它用于 DLR,因为我在发送 SMS 时发送 URL(并设置 DLR 掩码要求确认),但对于入站 SMS,您必须配置您的 kannel.conf 才能使用它(您可以有很多 sms-service,这只是一个包罗万象的例子:

    [...]
    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
    [...]

抱歉,有些葡萄牙文的文字,但你可以得到图片。

于 2013-10-18T23:00:52.723 回答
0

//php代码文件名为test2.php。在此之前,必须在ubuntu14上安装php5-curl

于 2016-05-28T09:14:16.680 回答