Я теряю периоды в письме, отправленном с помощью Java Mail - PullRequest
7 голосов
/ 23 сентября 2008

Я отправляю новостные рассылки с Java-сервера, и одна из гиперссылок пропускает период, делая его бесполезным:

Please print your <a href=3D"http://xxxxxxx.xxx.xx.edu=
au//newsletter2/3/InnovExpoInviteVIP.pdf"> VIP invitation</a> for future re=
ference and check the Innovation Expo website <a href=3D"http://xxxxxxx.xx=
xx.xx.edu.au/2008/"> xxxxxxx.xxxx.xx.edu.au</a> for updates.

В приведенном выше примере был потерян период между edu и au в первой гиперссылке.

Мы определили, что тело письма переносится строкой, а перенос разбивает строку на точку, и что запрещено начинать строку с точкой в ​​электронной почте SMTP:

http://tools.ietf.org/html/rfc2821#section-4.5.2

У меня такой вопрос: какие настройки я должен использовать, чтобы гарантировать, что перенос подходит для периода и / или не выполняется в первую очередь?

ОБНОВЛЕНИЕ: После лота тестирования и отладки оказалось, что с нашим кодом все в порядке - клиентский сервер Linux поставлялся с очень старой версией Java и старыми классами Mail были все еще в одной из папок lib и подбирались к нашим. JDK до 1.2 имеет эту ошибку.

Ответы [ 8 ]

5 голосов
/ 23 сентября 2008

С точки зрения SMTP, вы можете начать строку с периода, но вместо этого вам нужно отправить два периода. Если используемый вами SMTP-клиент этого не делает, вы можете столкнуться с описанной вами проблемой.

Возможно, стоит попробовать IP-сниффер, чтобы увидеть, где на самом деле проблема. Скорее всего, при отправке этой электронной почты участвуют как минимум две отдельные SMTP-транзакции.

3 голосов
/ 14 июля 2011

У меня была похожая проблема в электронных письмах HTML: таинственные пропущенные периоды и в одном случае странно усеченное сообщение. JavaMail отправляет электронную почту в формате HTML, используя кодировку для печати в кавычках, которая переносит строки в любой точке (т. Е. Не только в пробелах), чтобы ни одна строка не превышала 76 символов. (Он использует '=' в конце строки в качестве мягкого возврата каретки, поэтому получатель может повторно собрать строки.) Это может легко привести к строке, начинающейся с точки, которая должна быть удвоена. (Это называется «расстановка точек»). Если нет, период будет съеден принимающим SMTP-сервером или, что еще хуже, если период является единственным символом в строке, он будет интерпретироваться SMTP-сервером как конец сообщение.

Я проследил это до реализации GNU JavaMail 1.1.2 (он же classpathx javamail). Нет более новой версии этой реализации, и она не обновлялась в течение 4 или 5 лет. Глядя на источник, он частично реализует заполнение точками - он пытается обрабатывать период в строке сам по себе, но есть ошибка, которая препятствует работе даже этого случая.

К сожалению, это была реализация по умолчанию на нашей платформе (Centos 5), поэтому я думаю, что это также значение по умолчанию на RedHat.

Исправление в Centos - установка Sun (или я должен теперь сказать Oracle) реализации JavaMail (я использовал 1.4.4) и использование команды Centos альтернатив , чтобы установить ее вместо стандартной. реализация. (Использование альтернатив гарантирует, что установка исправлений Centos не вызовет возврата к реализации GNU.)

1 голос
/ 08 января 2009

У меня похожая проблема, но я использую ASP.NET 2.0. Для журналов приложений указана правильная ссылка в электронном письме http://www.3rdmilclassrooms.com/', однако клиент получает сообщение электронной почты, в котором отсутствует точка 'http://www3rdmilclassrooms.com'

Я сделал все возможное, чтобы доказать, что письмо отправляется с правильной ссылкой. Я подозреваю, что это почтовый клиент или программное обеспечение фильтра спама, которые изменяют гиперссылку. Возможно ли, что программное обеспечение для фильтрации спама в электронной почте сделает это?

1 голос
/ 23 сентября 2008

Убедитесь, что весь ваш контент является RFC2045 дружественным благодаря котируемой печати. Используйте класс MimeUtility в таком методе.


    private String mimeEncode (String input)
    {
    ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    OutputStream out;
    try
    {
        out = MimeUtility.encode( bOut, "quoted-printable" );
        out.write( input.getBytes( ) );
        out.flush( );
        out.close( );
        bOut.close( );
    } catch (MessagingException e)
    {
        log.error( "Encoding error occured:",e );
        return input;
    } catch (IOException e)
    {
        log.error( "Encoding error occured:",e );
        return input;
    }

    return bOut.toString( );
    }


0 голосов
/ 08 января 2009

Как указал Грег, проблема в вашем SMTP-клиенте, который не выполняет набивку точек (удваивая начальную точку).

Похоже, что электронная почта кодируется в цитируемой печатной форме. Переключение на base64 (я полагаю, вы можете сделать это с текущей реализацией Java MIME) решит проблему.

0 голосов
/ 08 января 2009

У меня была похожая проблема с программной отправкой электронной почты на учетную запись Yahoo. Они получат одну очень длинную строку текста и добавят свои собственные разрывы строк в электронное письмо в формате HTML, думая, что это не вызовет проблемы, но, конечно, это будет.

Хитрость была не в том, чтобы попытаться отправить такую ​​длинную линию. Поскольку электронные письма в формате HTML не заботятся о разрыве строк, вы должны добавлять свои собственные каждые несколько блоков или непосредственно перед ошибочной строкой, чтобы гарантировать, что ваш URL-адрес не будет разбит в такой период.

Мне пришлось изменить ASP VB с

var html;
html = "Blah Blah Blah Blah ";
html = html & " More Text Here....";

до

var html;
html = "Blah Blah Blah Blah " & VbCrLf;
html = html & " More Text Here....";

И это все, что потребовалось для очистки выходных данных, обрабатываемых на их конце.

0 голосов
/ 23 сентября 2008

Вы устанавливаете тип Mime на «text / html»? У вас должно быть что-то вроде этого:

BodyPart bp = new MimeBodyPart();
bp.setContent(message,"text/html");
0 голосов
/ 23 сентября 2008

Я не уверен, но это выглядит так, как будто ваша электронная почта кодируется. 0x3D - это шестнадцатеричный символ 61, который является символом равенства ('=').

Какие классы / библиотеки вы используете для отправки электронных писем? Проверьте настройки кодировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...