8

phpメール関数を使用して、多くのパラメーターを含むリンクを送信しています。エンコードされた後のURLは、フォームを再入力するための変数を保持しているため、650文字以上になる可能性があります。

メール内のリンクをクリックすると、URLのどこかにスペースが挿入されているため、壊れています。

これが私のsendMail関数です:

    protected function sendEmail($to, $subject, $body) {
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . '\r\n';
        $headers .= 'From: Sales Order From <sales@imninjas.com>' . '\r\n';
        $headers .= 'X-Mailer: PHP/' . phpversion() . '\r\n';

        $body = '<html><body style="font-size: 10pt; font-family: Arial, Helvetica, sans-serif;">'.$body.'</body></html>';

        return mail($to, $subject, $body, $headers);
    }

これが私がsendMailと呼ぶコードです。その'$salesUrl = $ this-> getSalesFormUrl();' これは、エンコードされたパラメータでいっぱいの650以上の文字のURLチョックです。

    function emailRep() {
        $params = $this->getParamaterArray();
        $shortUrl = $this->getShortUrl();
        $salesUrl = $this->getSalesFormUrl();

        $mailSubject = "Return to the sales order form for ".$params['clientName']." at ".$params['company'].".";

        $mailBody = "The following information is from an order created on, ".date("l, F j, Y \a\t g:i a").",<br/><br/>";
        $mailBody .= "Customer Contact Information:<br/>";
        $mailBody .= "Name: ".$params['clientName'] params['company']."<br/>";
        $mailBody .= "Shortened Url to Send to the Customer:<br/>";
        $mailBody .= ($shortUrl) ? "<a href='".$shortUrl."'>".$shortUrl."</a><br/><br/>" : "There was an error shortening your url.<br/><br/>";
        $mailBody .= "The URL back to the sales form: For sales rep use only, <strong>Do not give to the customer</strong>.:<br/>";
        $mailBody .= "<span style='font-style: italic;'>Some email clients add special characters to long urls. If the link does not work then copy and paste it into your browser.</span><br/>";
        $mailBody .= "<a href='".$salesUrl."'>".$salesUrl."</a><br/><br/>";

        return ($this->sendEmail($params['repEmail'], $mailSubject, $mailBody));
    }

これが私のメールで受け取ったURLです。URLの中央に「...BhsNKqJsd_x4...」というスペースがあります。これは、まったく同じURLを送信している場合でも、毎回異なる場所で発生します。これを証明するために、emailRepメソッドにスペースを入れずにこのURLをハードコーディングし、複数回送信しました。空間が動き回った。

http://example.com/admin/index.php?fdJdj9QgFAbgXzPcNJ3AAdbxgotxdk28cNRMjPESW9yihVbKxHR_vaeU7TSZxqSfHDhPX9Jg-lPneu1H9cFHE7yJxUcdfpto_XNxtv6XHkgw_Vk7oy7aFRdnYzONPDltWxV01Zi23glqnU-z91XnpvrnpvNGSXYo4Q0t6UEKUmUp9Sh28JC7Va01Pmaibcc83M8dpCzzKYn5H_rX_BhsNKq Jsd_x4w7e4zHqputSWdc1Uwzezt2LS5xGQJHKxlF98qbzUZMhauxw_k5ebK8YPwDFr776GEb11WPzGtfhjIFE68zL9H2l3FOCFXea5qkHUmO9pCihThlegDLAHamuIeCmTiXSGv8cm_TorL-6q8NnYuvp6nEfpntthgrvx3enkhWP-FJ0P4vYYAvyJ45pbR9slaw9pbPLsnu4d9nNZSuXJZdll2WXJRc2XKYgu0zRvcwuqBSVwuzylQu4ILugxOJCciG7kF1Qx8vjZl5Y8sIqL59dRu9dfnP5yuXJ5dnl2eXJ3crLl7x8lVeoFJWKe1co_uoK_B1eXZFckV2RXaG-fHvazCuWvGKVV84u23DlzZUrVyZXZldmVyZ3K69c8so57z8

これは、電子メールで送信する前にURLパラメーターをエンコード/デコードするために使用するコードです。

class UrlEncoder {
    function compressUrl($url) {
        return rtrim(strtr(base64_encode(gzdeflate($url, 9)), '+/', '-_'), '=');
    }

    function uncompressUrl($url) {
        $startParams = strrpos($url, "?");

        if($startParams) {
            $paramaterString = substr($url, $startParams);
            $host = substr($url, 0, strrpos($url, "?"));
            $uncompressedParamaters = gzinflate(base64_decode(strtr($paramaterString, '-_', '+/')));
            return $host."?".$uncompressedParamaters;
        } else {
            return NULL;
        }
    }
}

このスペースを防ぐにはどうすればよいですか?私はbit.lyのようなものでURLを短縮できることを知っていますが、それは内部ツールです。スペースが挿入されないようにする方法があるに違いないと思います。

4

3 に答える 3

2

650 文字の長いクエリ文字列を使用するのは誰でしょうか?

クエリ文字列をサーバー側に保存することをお勧めします。フィールドを持つデータベースに配置するとAUTO_INCREMENT、ID を取得できます。http://example.com/?email_key=ID_GOES_HERE次に、URL を、はるかに短い URLとして送信するだけです。次に、データベースからクエリ文字列を検索します。

終わり。

于 2012-12-20T04:12:22.303 に答える
1

私はあなたが必要とするものを持っています、http://www.9lessons.info/2009/01/split-url-from-sentence-using-php.html。APIを使用してtinyurlリンクを作成します。データベースには何もありません:)

于 2013-01-03T20:08:24.923 に答える
-1

わかりました、私は同じ問題を抱えていました。私の解決策は、私自身のリンクを縮小することでした...数行、古いスクリプトに数行のコード、リダイレクト用の新しいページを含むデータベースに新しいテーブルを作成します...これは最短の説明です。 )。

編集:

    function emailRep() {
    $params = $this->getParamaterArray();
    $shortUrl = $this->getShortUrl();
    $salesUrl = $this->getSalesFormUrl();
/***********************************************************************************/   
    $arr = str_split('QWERTYUIOPLKJHGFDSAZXCVBNM123456789qwertyuioplkjhgfdsazxcvbnm'); // get all the characters into an array
    shuffle($arr); // randomize the array
    $arr = array_slice($arr, 0, 6); // get the first six (random) characters out
    $short = implode('', $arr); // smush them back into a string
    mysql_query("INSERT INTO shortlinks VALUES(NULL, '$salesUrl', '$short')");
/*******************************************************************************************/

    $mailSubject = "Return to the sales order form for ".$params['clientName']." at ".$params['company'].".";

    $mailBody = "The following information is from an order created on, ".date("l, F j, Y \a\t g:i a").",<br/><br/>";
    $mailBody .= "Customer Contact Information:<br/>";
    $mailBody .= "Name: ".$params['clientName'] params['company']."<br/>";
    $mailBody .= "Shortened Url to Send to the Customer:<br/>";
    $mailBody .= ($shortUrl) ? "<a href='".$shortUrl."'>".$shortUrl."</a><br/><br/>" : "There was an error shortening your url.<br/><br/>";
    $mailBody .= "The URL back to the sales form: For sales rep use only, <strong>Do not give to the customer</strong>.:<br/>";
    $mailBody .= "<span style='font-style: italic;'>Some email clients add special characters to long urls. If the link does not work then copy and paste it into your browser.</span><br/>";
    $mailBody .= "<a href='".$short."'>".$short."</a><br/><br/>"; // Rename $salesUrl to $short

    return ($this->sendEmail($params['repEmail'], $mailSubject, $mailBody));
}

そしてページをリダイレクトします:

$token=$_GET['token']; // like http://example.com/out.php?token=ahgByT or make it cleaner with htaccess
$qry=mysql_query("SELECT * FROM links WHERE short='$token'");
$arr=mysql_fetch_array($qry);
$out=$arr['long_link'];
header("Location: ".$out);
?>
于 2012-12-20T01:45:37.110 に答える