codeigniter html电子邮件更改字符

时间:2013-02-17 00:42:18

标签: php codeigniter html-email

我的电子邮件有问题,html是好的,但是当我打开它们时,文本中的错误和链接中的某些字符变为= =

Thanks for joining . your log=n details are here ma=e sure you keep them safe.
To verify your email address, please follow this link:

 Finish your registration...

Link doesn't work? Copy the following link to your browser address bar:  http://www.myurl.com/dev=l/panel/auth/activate/123131/123131

Please verify your email within 123131 hours, otherwise your registration =ill become invalid and you will have to register again.

每个图像和链接甚至文本都是borken 我认为它与{unwrap}有关,但没有帮助

这是config / email.php

$config['email_notification']['protocol'] = 'smtp';
$config['email_notification']['smtp_host'] = 'smtp.live.com';
$config['email_notification']['smtp_user'] = 'xxxxx';
$config['email_notification']['smtp_pass'] = 'xxxxxxx';
$config['email_notification']['smtp_port'] = '587';
$config['email_notification']['mailtype'] = 'html';
$config['email_notification']['charset'] = 'utf-8';
$config['email_notification']['wordwrap'] = false;
$config['email_notification']['smtp_crypto'] = 'tls';

这是控制器

 $this->load->library('email');



    $this->email->initialize($this->config->item('email_notification'));
    $this->email->subject('Email Test');

    $this->email->set_newline("\r\n");
    $this->email->from('xxxxxx'); // change it to yours
    $this->email->to('xxxxx');
    $this->email->subject('Email Test');

    $data=array(
        'site_name'=>'tralalalal',
        'user_id'=>'123131',
        'new_email_key'=>'123131',
        'activation_period'=>'123131',
        'email'=>'123131',
        'title'=>'123131',

    );
    $this->email->message($this->load->view('email/activate_account/en',$data,true));

电子邮件正文

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<style type="text/css">
    /* Client-specific Styles */
#outlook a{padding:0;} /* Force Outlook to provide a "view in browser" button. */
body{width:100% !important;} .ReadMsgBody{width:100%;} .ExternalClass{width:100%;} /* Force Hotmail to display emails at full width */
body{-webkit-text-size-adjust:none;} /* Prevent Webkit platforms from changing default text sizes. */

    /* Reset Styles */
body{margin:0; padding:0;}
img{border:0; height:auto; line-height:100%; outline:none; text-decoration:none;}
table td{border-collapse:collapse;}
#backgroundTable{height:100% !important; margin:0; padding:0; width:100% !important;}
</style>
</head>
<body>

感谢

3 个答案:

答案 0 :(得分:2)

我找到了答案,所以如果有人有同样的问题

有原因

  

该标准对于数量有两个限制   一行中的字符。每行字符必须不超过
  998个字符,不应超过78个字符,不包括
  CRLF。

     

998字符限制是由于许多限制   发送,接收或存储Internet消息的实现   格式化消息,无法处理超过998个字符   在一条线上。接收实现将很好地处理   为了鲁棒性,一行中任意大量的字符   清酒。但是,有很多实现(in   符合[RFC2821]的运输要求)   接受包含超过1000个字符的消息,包括   每行CR和LF,对于不执行的实现很重要   创造这样的信息。

     

更为保守的78字符建议是适应   显示这些的用户界面的许多实现   可能截断或灾难性地包装的信息   尽管有这样的事实,但每行超过78个字符   实现不符合本文的意图   规范(和[RFC2821]的规范,如果它们实际上导致
  信息丢失)。同样,即使有这种限制   消息,它是显示消息

的实现的障碍

这是您更改代码以覆盖此限制的位置 系统/库/ email.php

原单

protected function _prep_quoted_printable($str, $charlim = '')
{
    // Set the character limit
    // Don't allow over 76, as that will make servers and MUAs barf
    // all over quoted-printable data
    if ($charlim == '' OR $charlim > '76')
    {
        $charlim = '76';
    }

QUICK FIX :)

protected function _prep_quoted_printable($str, $charlim = '')
{
    // Set the character limit
    // Don't allow over 76, as that will make servers and MUAs barf
    // all over quoted-printable data
    if ($charlim == '' OR $charlim > '76')
    {
        $charlim = '200';
    }

答案 1 :(得分:0)

我认为问题出在_prep_quoted_printable函数中。幸运的是,从v5.3开始,这个函数的本机PHP版本

我能够通过使用PHP本机函数quoted_printable_encode替换Email类中的_prep_quoted_printable实例来解决类似问题。

这相当于我的_build_message(),如下所示:

    /**
 * Build Final Body and attachments
 *
 * @access  protected
 * @return  void
 */
protected function _build_message()
{
    if ($this->wordwrap === TRUE  AND  $this->mailtype != 'html')
    {
        $this->_body = $this->word_wrap($this->_body);
    }

    $this->_set_boundaries();
    $this->_write_headers();

    $hdr = ($this->_get_protocol() == 'mail') ? $this->newline : '';
    $body = '';

    switch ($this->_get_content_type())
    {
        case 'plain' :

            $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
            $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding();

            if ($this->_get_protocol() == 'mail')
            {
                $this->_header_str .= $hdr;
                $this->_finalbody = $this->_body;
            }
            else
            {
                $this->_finalbody = $hdr . $this->newline . $this->newline . $this->_body;
            }

            return;

        break;
        case 'html' :

            if ($this->send_multipart === FALSE)
            {
                $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
                $hdr .= "Content-Transfer-Encoding: quoted-printable";
            }
            else
            {
                $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline;

                $body .= $this->_get_mime_message() . $this->newline . $this->newline;
                $body .= "--" . $this->_alt_boundary . $this->newline;

                $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
                $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
                $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;

                $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
                $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;
            }

            // $this->_finalbody = $body . $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline;
            $this->_finalbody = $body . quoted_printable_encode($this->_body) . $this->newline . $this->newline;


            if ($this->_get_protocol() == 'mail')
            {
                $this->_header_str .= $hdr;
            }
            else
            {
                $this->_finalbody = $hdr . $this->_finalbody;
            }


            if ($this->send_multipart !== FALSE)
            {
                $this->_finalbody .= "--" . $this->_alt_boundary . "--";
            }

            return;

        break;
        case 'plain-attach' :

            $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline;

            if ($this->_get_protocol() == 'mail')
            {
                $this->_header_str .= $hdr;
            }

            $body .= $this->_get_mime_message() . $this->newline . $this->newline;
            $body .= "--" . $this->_atc_boundary . $this->newline;

            $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
            $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;

            $body .= $this->_body . $this->newline . $this->newline;

        break;
        case 'html-attach' :

            $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline;

            if ($this->_get_protocol() == 'mail')
            {
                $this->_header_str .= $hdr;
            }

            $body .= $this->_get_mime_message() . $this->newline . $this->newline;
            $body .= "--" . $this->_atc_boundary . $this->newline;

            $body .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline;
            $body .= "--" . $this->_alt_boundary . $this->newline;

            $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline;
            $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline;
            $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline;

            $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline;
            $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline;

            // $body .= $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline;
            $body .= quoted_printable_encode($this->_body) . $this->newline . $this->newline;
            $body .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline;

        break;
    }

    $attachment = array();

    $z = 0;

    for ($i=0; $i < count($this->_attach_name); $i++)
    {
        $filename = $this->_attach_name[$i];
        $basename = basename($filename);
        $ctype = $this->_attach_type[$i];

        if ( ! file_exists($filename))
        {
            $this->_set_error_message('lang:email_attachment_missing', $filename);
            return FALSE;
        }

        $h  = "--".$this->_atc_boundary.$this->newline;
        $h .= "Content-type: ".$ctype."; ";
        $h .= "name=\"".$basename."\"".$this->newline;
        $h .= "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline;
        $h .= "Content-Transfer-Encoding: base64".$this->newline;

        $attachment[$z++] = $h;
        $file = filesize($filename) +1;

        if ( ! $fp = fopen($filename, FOPEN_READ))
        {
            $this->_set_error_message('lang:email_attachment_unreadable', $filename);
            return FALSE;
        }

        $attachment[$z++] = chunk_split(base64_encode(fread($fp, $file)));
        fclose($fp);
    }

    $body .= implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--";


    if ($this->_get_protocol() == 'mail')
    {
        $this->_finalbody = $body;
    }
    else
    {
        $this->_finalbody = $hdr . $body;
    }

    return;
}

答案 2 :(得分:0)

使用Outlook封闭环境,不希望发送到另一个邮件客户端。

相似的结果,但是不同版本的codeigniter。 我有一个wrapchars变量可以更改它。 问题是它在_prep_quoted_printable中使用了硬编码76。 我将76更改为

    $this->wrapchars 

一切都变得美好。