2013-12-17 8 views
0

Так что это странно.Что не так в этой теме? Ошибка 451 CodeIgniter Класс электронной почты

Я получаю 451 ошибку на сообщение электронной почты, который генерируется, за исключением того, что вызывает это является простой текстовый часть сюжетной линии: s

Эта сюжетная линия проходит через штрафа:

$this->email->subject('New task in "'.$data['property_name'].'"'); 

Это один вызывает 451 ошибку:

$this->email->subject('A user has completed their task in "'.$data['property_name'].'"'); 

Для ссылка, ошибка 451 для голых LF (http://cr.yp.to/docs/smtplf.html). Обычно это вызвано не объявлением правил окончания строки в настройках или использованием одинарных кавычек, т. Е. «/ R/n /» вместо «/ r/n». Мои настройки верны, и электронные письма работают нормально.

что-то заметное в отладчике, является то, что больше появляется линия так:

Subject: =?utf-8?Q?A_user_has_completed_their_task_in_"TASKNAME 
?= 
=?utf-8?Q?"?= 

В то время как работает один выглядит как:

Subject: =?utf-8?Q?New_task_in_"TASKNAME"?= 

Является ли это CI ошибка?

ответ

0

Я думаю, что вы смешиваете одиночные и двойные кавычки. Попытка:

$this->email->subject('A user has completed their task in '.$data['property_name']); 
+0

Hi Mudshark - эти двойные кавычки не являются частью строки, т. Е. - новая задача в «Foo». –

+0

@NathanHornby Они могут нарушать кодировку строки в этом запросе. Вы пытались удалить цитаты, чтобы увидеть, проходит ли она без них. – mic

+0

Привет @micb - даже если это так, оно не представляет собой решение, потому что оно должно быть там - и почему оно будет отвергать их только тогда, когда текст до него немного длиннее? Я дам ему попробовать, это просто похоже на не-стартер для меня. Мне кажется, что длина строки является проблемой, по крайней мере, учитывая разницу в выходе в отладке. По крайней мере, если бы это была проблема, я бы предположил, что это будет более явная ошибка. –

0

Откуда вы получаете ошибку 451? Я вижу, что 451 сообщается как local error in processing.

Класс Email разбивает предметную строку, если она длиннее, чем 76 символов:

109 // Line length must not exceed 76 characters, so we adjust for 
110 // a space, 7 extra characters =??Q??=, and the charset that we will add to each line 

Вы можете увидеть его в действии:

function test() 
{ 
    echo "<pre>"; 
    print_r($this->_prep_q_encoding('A user had completed their task in "Going to change string to something"')); 
} 


function _prep_q_encoding($str, $from = FALSE) 
{ 
    $this->crlf= "\n"; 
    $this->charset = 'utf-8'; 
    $str = str_replace(array("\r", "\n"), array('', ''), $str); 

    // Line length must not exceed 76 characters, so we adjust for 
    // a space, 7 extra characters =??Q??=, and the charset that we will add to each line 
    $limit = 75 - 7 - strlen($this->charset); 

    // these special characters must be converted too 
    $convert = array('_', '=', '?'); 

    if ($from === TRUE) 
    { 
     $convert[] = ','; 
     $convert[] = ';'; 
    } 

    $output = ''; 
    $temp = ''; 

    for ($i = 0, $length = strlen($str); $i < $length; $i++) 
    { 
     // Grab the next character 
     $char = substr($str, $i, 1); 
     $ascii = ord($char); 

     // convert ALL non-printable ASCII characters and our specials 
     if ($ascii < 32 OR $ascii > 126 OR in_array($char, $convert)) 
     { 
      $char = '='.dechex($ascii); 
     } 

     // handle regular spaces a bit more compactly than =20 
     if ($ascii == 32) 
     { 
      $char = '_'; 
     } 

     // If we're at the character limit, add the line to the output, 
     // reset our temp variable, and keep on chuggin' 
     if ((strlen($temp) + strlen($char)) >= $limit) 
     { 
      $output .= $temp.$this->crlf; 
      $temp = ''; 
     } 

     // Add the character to our temporary line 
     $temp .= $char; 
    } 

    $str = $output.$temp; 

    // wrap each line with the shebang, charset, and transfer encoding 
    // the preceding space on successive lines is required for header "folding" 
    $str = trim(preg_replace('/^(.*)$/m', ' =?'.$this->charset.'?Q?$1?=', $str)); 

    return $str; 
} 

который выводит

=?utf-8?Q?A_user_had_completed_their_task_in_"Going_to_change_string_to_?= 
=?utf-8?Q?something"?= 

I «У других были проблемы с настройкой настроек электронной почты. У вас есть

$config['crlf'] = "\r\n"; //double quotes ("), not single (') 
$config['newline'] = "\r\n"; //double quotes ("), not single (') 

комплект?

+0

Привет, Stormdrain. Похоже, что ваше письмо было отправлено с использованием почты, а не SMTP, это, вероятно, значительная разница, учитывая, что ошибка 451 является ошибкой SMTP. –

+0

EDIT: Также стоит отметить, что результирующая строка из переменной «property_name» намного длиннее, чем пример «TASKNAME», что-то вроде «Lorem ipsum dolor sit amet pro» сделает для лучшей тестовой строки, поскольку у меня есть чувство длина важна. Спасибо за ваш вклад! –

+0

Приношу свои извинения. Да, длина важна. Строка «TASKNAME» содержит специальные символы (одиночная/двойная кавычка, амперсанд и т. Д.)? – stormdrain