Php mail() 打破 650 个字符长的 Url

标签 php email

我正在使用 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 中间的空格“...BhsNKq Jsd_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,但它是一个内部工具。我觉得一定有办法阻止空格被插入。

最佳答案

谁头脑正常会使用 650 个字符长的查询字符串?

我的建议是在服务器端保存查询字符串。将它放入一个带有 AUTO_INCREMENT 字段的数据库中,然后您可以获得它的 ID。然后您可以将 URL 作为 http://example.com/?email_key=ID_GOES_HERE 发送,这是一个更短的 URL。然后从数据库中查找查询字符串。

完成。

关于Php mail() 打破 650 个字符长的 Url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13954542/

相关文章:

php - 在 laravel 中通过 url 传递变量

php - 我应该在表示层中抛出异常吗?

php - PHPUnit Selenium 测试用例的代码覆盖率

python - 从我的域发送电子邮件还是从管理员 Google 帐户发送电子邮件?

python - 树莓派 : no internet email and mysql connection

php - 从数据库调用图像会在 html 中产生空格

php - 无法使用 php 从 mysql 列中检索具有日期和时间的唯一日期

java - 正则表达式中的电子邮件之间允许有空格

email - 在 Firefox Phone 邮件应用程序中接受邮件证书

.NET 预定群发邮件开源解决方案