【问题标题】:PHP's mail function seems to remove newlines and tabsPHP 的邮件功能似乎删除了换行符和制表符
【发布时间】:2013-04-08 04:54:02
【问题描述】:

我有这个帮助类,我用它来通过 PHP 发送电子邮件:

<?php

class Mailsend {

    public $from;
    public $to;
    public $subject;
    public $message;

    public static function mail() {
        return new Mailsend();
    }

    public function from($from) {
        $this->from = $from;
        return $this;
    }

    public function fromName($fromName) {
        $this->fromName = $fromName;
        return $this;
    }

    public function to($to) {
        $this->to = $to;
        return $this;
    }

    public function subject($subject) {
        $this->subject = $subject;
        return $this;
    }

    public function message($message) {
        $this->message = $message;
        return $this;
    }

    public function send() {
        $mailFrom = $this->from;
        $mailFromName = $this->fromName;
        $mailTo = $this->to;
        $mailSubject = $this->subject;

        $mailSignature = "\n\n-- \n";
        $mailSignature .= "Vaš, Format.ba - Primjenjene Vještine.\n";
        $mailSignature .= "Za više informacija posjetite nas na: http://www.format.ba/\n";

        $mailBody = $this->message . "\n";
        $mailBody .= $mailSignature;

        $mailHeader = "From: $mailFromName <$mailFrom>\r\n";
        $mailHeader .= "MIME-Version: 1.0\r\n";
        $mailHeader .= "Content-type: text/html; charset=UTF-8\r\n";
        $mailHeader .= "Reply-To: $mailFromName <$mailFrom>\r\n";
        $mailHeader .= "X-Mailer: Mailsend.php\r\n";
        $mailHeader .= "X-Sender-IP: {$_SERVER['REMOTE_ADDR']}\r\n";
        $mailHeader .= "Bcc: $mailFromName <$mailFrom>\r\n";

        $mailParams = "-f$mailFrom";

        $mailBody = str_replace('  ', '', $mailBody);

        return mail($mailTo, $mailSubject, $mailBody, $mailHeader, $mailParams);
    }

    public function valid($email) {
        if (!preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) {
            return false;
        }
        $email_array = explode("@", $email);
        $local_array = explode(".", $email_array[0]);
        for ($i = 0; $i < sizeof($local_array); $i++) {
            if (!preg_match("/^(([A-Za-z0-9!#$%&'*+\/=?^_`{|}~-][A-Za-z0-9!#$%&'*+\/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$/", $local_array[$i])) {
                return false;
            }
        }
        if (!preg_match("/^\[?[0-9\.]+\]?$/", $email_array[1])) {
            $domain_array = explode(".", $email_array[1]);
            if (sizeof($domain_array) < 2) {
                return false;
            }
            for ($i = 0; $i < sizeof($domain_array); $i++) {
                if (!preg_match("/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$/", $domain_array[$i])) {
                    return false;
                }
            }
        }

        return true;
    }

}

它可以工作,而且我写了它,所以它很容易使用,例如:

$message = "Hello, " . $model->fullname . ",

                        Welcome to our Website, Domain.tdl. You are now able to use all of our services which we provide here.

                        Visit: www.domain.tdl - for more information and news about our services!

                        Greets!";

Mailsend::mail()->
    from('info@domain.tdl')->
    fromName('Domain.tdl - Our Website')->
    to('someother@email.tdl')->
    subject('Welcome to Domain.tdl - Our Website')->
    message(trim($message))->send();

正如您从这个确切的示例中看到的那样,有很多空格是由“空格”而不是制表符缩进的。

当我将该消息发送到我的其中一个电子邮件时,我会得到以下输出:

您好,Zlatan 欢迎访问我们的网站 Domain.tdl。您现在可以 使用我们在这里提供的所有服务。访问:www.domain.tdl - 有关我们服务的更多信息和新闻!问候!

它只是以某种方式去除所有换行符和长度超过两个的空格,并将它们全部合并在一起,所以我失去了我最初想要的电子邮件格式。

我认为Mailsend 中的这一行可能会导致问题:

$mailBody = str_replace('  ', '', $mailBody);

但事实并非如此,到目前为止,我还没有找到任何原因导致这种情况发生并且无法阻止它继续进行。

有没有人用过类似的东西?有没有可能我在自己的代码中遗漏了什么?

【问题讨论】:

  • 是的...在有人将此标记为可能重复之前...我在 STO 上找到的所有答案都没有解决同样的问题,对我没有帮助!
  • 不,它不会删除它。但是您假设客户端会尊重这些制表符和空格(这是错误的)
  • 您如何阅读电子邮件?会不会是您的电子邮件阅读器导致了问题?
  • @zerkms 相信我,这不是我目前最大的问题:) 我想解决问题,我在这个问题中详细解释了这个问题! :)
  • @Zlatan O.:我再重复一遍:mail() 没有任何条纹,空格和制表符在电子邮件中。但是 html 客户端确实会将几个空格折叠成一个空格。

标签: php email newline line-breaks


【解决方案1】:

&lt;br&gt;一起使用

$message = "Hello, " . $model->fullname . "<br>,

                    Welcome to our Website, Domain.tdl. You are now able to use all of our services which we provide here.<br>

                    Visit: www.domain.tdl - for more information and news about our services!<br>

                    Greets!";

【讨论】:

  • 我应该修改邮件功能的标题吗?
  • @ZlatanO。不,没有必要。
  • 傻我!我什至没有注意到这是 text/html 输出格式,直到现在!
  • nl2br :) 做了魔术!谢谢你的指导!我会在大约 2-3 分钟内接受你的回答!
【解决方案2】:

使用&lt;br /&gt; 代替\r\n

添加此标头以使您的内容为 HTML 格式:

Content-type: text/html; charset=UTF-8

当您想插入标签时,请改用多个&amp;nbsp;

【讨论】:

    【解决方案3】:

    您正在使用以下标题:

    $mailHeader .= "Content-type: text/html; charset=UTF-8\r\n";
    

    但即将发送纯文本电子邮件。改成

    $mailHeader .= "Content-type: text/plain; charset=UTF-8\r\n";
    

    或将您的电子邮件格式化为 html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2017-08-17
      • 2010-11-16
      • 2012-06-26
      相关资源
      最近更新 更多