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

dimetrius

  • Осваиваюсь на форуме
  • 160
  • 7
Ну и снова добрый день  ;)
Начну немного из далека...
Решил настроить 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

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

smart

  • Администратор
  • 6846
  • 1298
Хм, информация интересная, сделать заплатку для этого можно. Но еще интереснее другое - откуда такая кривая коррекция длины строки. На этот вопрос легко ответить если посмотреть код в файле:

[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

  • Осваиваюсь на форуме
  • 160
  • 7
Вот такая штука получается:
Спойлер
[свернуть]
Что-то не учитывается...
*

smart

  • Администратор
  • 6846
  • 1298
Хм, странно. Может быть это то письмо, что было в очереди на отправку еще до того, как вы внесли изменения?
*

dimetrius

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

smart

  • Администратор
  • 6846
  • 1298
Ну давайте ради эксперимента в моем патче поменяем 998, допустим на 700? Так сказать с запасом и посмотрим...
*

dimetrius

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

smart

  • Администратор
  • 6846
  • 1298
Не совсем понимаю, как такое может быть, ведь мы режем текст сообщения еще до того, как он попадает куда-либо, и строки по длине заведомо меньше, чем 1000 символов.
*

dimetrius

  • Осваиваюсь на форуме
  • 160
  • 7
smart, попробуйте у себя, или могу дать доступ к сайту.
*

Lukigrad

  • Новичок
  • 3
  • 0
У нас примерно похожая ситуация. Но символы в тексте письма не особо смущают, проблема несколько в другом - режется адрес ссылки в итоге на почту приходит совсем не рабочая ссылка. Например (для адреса справки для примера взят адрес форума):
Вот дословный текст комментария
Код
Доброго. Ваш дед, рядовой 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

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

Lukigrad

  • Новичок
  • 3
  • 0
dimetrius, большое спасибо, всё заработало как надо!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Защита от спамботов (captcha) не отключается в jcomments 3.0

Автор banker7

Ответов: 4
Просмотров: 5854
Последний ответ 13.08.2017, 20:36:47
от Anna01
[Решено] Не отображаются аватары CommunityBuilder в JComments

Автор Ishti39

Ответов: 10
Просмотров: 748
Последний ответ 11.07.2017, 19:09:32
от warlocksp
Отключение JComments на нужных материалах

Автор miheich_man

Ответов: 2
Просмотров: 136
Последний ответ 12.06.2017, 16:37:23
от miheich_man
[Решено] Не удаляются комментарии в админке. (Joomla 2.5.28, JComments 3.0.5)

Автор Esken

Ответов: 5
Просмотров: 427
Последний ответ 08.05.2017, 17:47:54
от Esken
Где спрятались комментарии Jcomments?

Автор VasyaGoomla

Ответов: 0
Просмотров: 156
Последний ответ 04.04.2017, 09:46:12
от VasyaGoomla