Стандарты email рассылок и работа Jcomments

  • 12 Ответов
  • 3139 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн dimetrius

Ну и снова добрый день  ;)
Начну немного из далека...
Решил настроить DKIM подпись писем своего домена, для этого используется postfix + opendkim.
Всё как бы хорошо, работает, подписывается, но иногда приходят письма, у которых
в яндексе: dkim=fail
у mail.ru: dkim=fail reason=bodyhash_mismatch
начал думать что же не так...
Заметил что письма, которые не проходят проверку, содержат в себе где-то посреди какого-то слова вот такие значки:
� �ну например вот так
Lorem Ipsum в 60-х годах и, в боле� � недавнее время
А вот исходный код, который показывает нам яндекс:
Спойлер
[свернуть]
Посмотрите на строку, которая начинается на <div style="border:, а особенно как она заканчивается и начинается следующая.
И ещё одно, она обрезана ровно после 1000 символа.

В общем выходит так... postfix отдаёт opendkim письмо для подписи, потом его проверяет и если есть строки длиною больше 1000 символов принудительно создаёт перенос на новую строку. Причём если это английский текст, то никаких проблем не возникает, т.к. лишних символов нет, а вот если текст русский в UTF-8 допустим, то количество символов при этом меняется и письмо, которое отправляет postfix уже после обрезания становится уже не валидно подписанное DKIM. В связи с чем все почтовые сервисы и твердят нам что подпись не верна.
------------------
Вернёмся к нашей 1000 символов и при чём здесь Jcomments...

Вот ссылка, по которой расписаны некоторые требования http://www.faqs.org/rfcs/rfc821.html
Выписка
Цитировать
text line

               The maximum total length of a text line including the
               <CRLF> is 1000 characters (but not counting the leading
               dot duplicated for transparency).
Из чего следует что в email длина строки не должна превышать 998 символов, а лучше не более 988, т.к. некоторые обрезают не на 1000, а на 990. Пишу на 2 меньше, потому что в любом случае есть ещё вот эти CRLF, хз что это  ;D

В общем очень-очень прошу Смарта следить за этим именно в Jcomments, т.к. больше некому.
Ну и мнение тоже интересно.
Прошу строго не судить, может в чём-то не прав, или что не совсем верно описал, но суть должна быть ясна.

*

Оффлайн dimetrius

Эти же значки раньше наблюдались и без DKIM подписи, но тогда они просто напрягали глаз, а сейчас могут повлиять на не доставку сообщений пользователям сайта.

*

Оффлайн smart

  • *******
  • 6856
  • [+]1311 / [-]14
  • снова дома...
    • Просмотр профиля
    • Новости Joomla на русском
Хм, информация интересная, сделать заплатку для этого можно. Но еще интереснее другое - откуда такая кривая коррекция длины строки. На этот вопрос легко ответить если посмотреть код в файле:

[spoiler title=/libraries/phpmailer/smtp.php]
Код: (php) [Выделить]
   $max_line_length = 998; // used below; set here for ease in change

    while(list(, $line) = @each($lines)) {
      $lines_out = null;
      if($line == '' && $in_headers) {
        $in_headers = false;
      }
      // ok we need to break this line up into several smaller lines
      while(strlen($line) > $max_line_length) {
        $pos = strrpos(substr($line, 0, $max_line_length), ' ');

        // Patch to fix DOS attack
        if(!$pos) {
          $pos = $max_line_length - 1;
          $lines_out[] = substr($line, 0, $pos);
          $line = substr($line, $pos);
        } else {
          $lines_out[] = substr($line, 0, $pos);
          $line = substr($line, $pos + 1);
        }

        /* if processing headers add a LWSP-char to the front of new line
         * rfc 822 on long msg headers
         */
        if($in_headers) {
          $line = "\t" . $line;
        }
      }
      $lines_out[] = $line;

      // send the lines to the server
      while(list(, $line_out) = @each($lines_out)) {
        if(strlen($line_out) > 0)
        {
          if(substr($line_out, 0, 1) == '.') {
            $line_out = '.' . $line_out;
          }
        }
        $this->client_send($line_out . $this->CRLF);
      }
    }
[/spoiler]

Теперь о том, как это исправить (привожу код для JComments 3.0):

1. Открываем файл /components/com_jcomments/helpers/notification.php
2. Находим строчку:
Код: (php) [Выделить]
return $tmpl->renderTemplate($templateName);заменяем на:
Код: (php) [Выделить]
$text = $tmpl->renderTemplate($templateName);
$max_line_length = 998;
$lines = explode("\n", $text);
$body = array();

foreach($lines as $line) {
$line = trim($line);
if (JString::strlen($line) > $max_line_length) {
$pos = JString::strrpos(JString::substr($line, 0, $max_line_length), ' ');
$body[] = JString::substr($line, 0, $pos);
$body[] = JString::substr($line, $pos, JString::strlen($line));
} else {
$body[] = $line;
}
}

return implode("\r\n", $body);

Этого должно быть вполне достаточно. Буду благодарен, если вы протестируете и отпишитесь о результатах.

*

Оффлайн dimetrius

Вот такая штука получается:
Спойлер
[свернуть]
Что-то не учитывается...

*

Оффлайн smart

  • *******
  • 6856
  • [+]1311 / [-]14
  • снова дома...
    • Просмотр профиля
    • Новости Joomla на русском
Хм, странно. Может быть это то письмо, что было в очереди на отправку еще до того, как вы внесли изменения?

*

Оффлайн dimetrius

Так там же в коде есть переносы без этих значков, а есть со значками...
Скорее всего без значков делались именно с помощью Jcomments, а со значками почтовым сервером.

*

Оффлайн smart

  • *******
  • 6856
  • [+]1311 / [-]14
  • снова дома...
    • Просмотр профиля
    • Новости Joomla на русском
Ну давайте ради эксперимента в моем патче поменяем 998, допустим на 700? Так сказать с запасом и посмотрим...

*

Оффлайн dimetrius

Уже 170 поставил, всё равно получаем вот что
Спойлер
[свернуть]
Сначала вношу изменения в файл, потом оставляю комментарий к теме, на которую подписан ящик.
-----------------
Вот ещё...
В настройках Joomla для отправки почты у меня стоит PHP Mail, на Sendmail ситуация полностью идентичная. А вот на SMTP строки корректно разбиваются. Вероятно это именно то, что вы заметили выше, о файле /libraries/phpmailer/smtp.php
Но эти изменения производятся не Jcomments, а именно Joomla и только если использовать SMTP.
Хотелось бы всё таки не ограничиваться.
« Последнее редактирование: 16.10.2013, 01:20:32 от dimetrius »

*

Оффлайн smart

  • *******
  • 6856
  • [+]1311 / [-]14
  • снова дома...
    • Просмотр профиля
    • Новости Joomla на русском
Не совсем понимаю, как такое может быть, ведь мы режем текст сообщения еще до того, как он попадает куда-либо, и строки по длине заведомо меньше, чем 1000 символов.

*

Оффлайн dimetrius

smart, попробуйте у себя, или могу дать доступ к сайту.

У нас примерно похожая ситуация. Но символы в тексте письма не особо смущают, проблема несколько в другом - режется адрес ссылки в итоге на почту приходит совсем не рабочая ссылка. Например (для адреса справки для примера взят адрес форума):
Вот дословный текст комментария
Доброго. Ваш дед, рядовой 1192 СП, был ранен осколком и умер в расположении 356 ХППГ. Об этом имеются записи в Книге умерших этого госпиталя и в Книге погребения. Но там он учтён как Урынцев.
Ссылки на документы
http://obd-memorial.ru/memorial/fullimage?id=33030954&id1=abaf68aa888f15e85425566c84e0b421&path=Ekt/001/356_КП/00000010.jpg
http://obd-memorial.ru/memorial/fullimage?id=55953419&id1=45da0f5a8d153780c5762ced441962e6&path=Z/004/058-А-0083627-1094/00000055.jpg

Касательно исправления фамилии в паспорте и на стеле Вам необходимо обратится в военкомат (адрес у нас в справке http://joomlaforum.ru/ ). В список на сайте я внесу фамилию в скобках.

В теле письма код выглядит так:
<div style="border: 1px solid #ccc; padding: 10px 5px; margin: 5px 0; font: normal 1em Verdana, Arial, Sans-Serif;">Доброго. Ваш дед, рядовой 1192 СП, был ранен осколком и умер в расположении 356 ХППГ. Об этом имеются записи в Книге умерших этого госпиталя и в Книге погребения. Но там он учтён как Урынцев.<br />Ссылки на документы<br />http://obd-memorial.ru/memorial/fullimage?id=33030954&id1=abaf68aa888f15e85425566c84e0b421&path=Ekt/001/356_КП/00000010.jpg<br />http://obd-memorial.ru/memorial/fullimage?id=55953419&id1=45da0f5a8d153780c5762ced441962e6&path=Z/004/058-А-0083627-1094/00000055.jpg<br /><br />Касательно исправления фамилии в паспорте и на стеле Вам необходимо обратится в военкомат (адрес у нас в справке http://joomlaf
 orum.ru/ ). В список на сайте я внесу фамилию в скобках.</div>
Быстрая модерация <a href="....
т.е. в коде идёт перенос на новую строку без всяких тегов и появляется символ "пробел", при этом почтовой службой это воспринимается как два разных участка текста, а не единая ссылка. В Word'е этот символ определяется как Shift+Enter, т.е. абзац не заканчивается — заканчивается лишь строка абзаца.

Joomla 2.5.28
JComments 3.0.5
В версии JComments 2.3.0 ситуация аналогична, собственно в ней и заметили, обновили до 3.0.5, проблема осталась. Описанный способ с файлом notification.php не помог. Изменение параметра "Разбивать длинные слова" не помогает. Если судить по коду письма, то с предыдущего переноса строки обрезка происходит на 739 знаке (включая пробелы)

*

Оффлайн dimetrius

Lukigrad, я тогда нашёл способ. Выбираем в настройках email "использовать smtp сервер" и будет порядок.

dimetrius, большое спасибо, всё заработало как надо!