Indy IdSMTP и вложения в Thunderbird - PullRequest
0 голосов
/ 16 марта 2010

Использование последнего снимка Indy тибурона на D2010. Очень простой проект, такой как:

var
  stream: TFileStream; (s is TidSMTP and m is TidMessage)
begin
  s.Connect;
  Stream := TFileStream.Create('c:\Test.zip', fmOpenRead or fmShareExclusive);
  try
    with TIdAttachmentMemory.Create(m.MessageParts, Stream) do
    begin
      ContentType := 'application/x-zip-compressed';
      Name := ExtractFilePath('C:\'); //'
      FileName := 'Test.zip';
    end;
  finally
    FreeAndNil(Stream);
  end;
  s.Send(m);
  s.Disconnect();
end;

В Outlook, The bat !, OE, Yahoo и т. Д. Все работает нормально. Но в Thunderbird вложение не отображается. Глядя на источник сообщения в Thunderbird, там есть вложение. Единственное различие, которое я могу найти между сообщениями, посылаемыми indy и другими клиентами, состоит в том, что сообщения Indy имеют следующий порядок:

Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1"
MIME-Version: 1.0

, в то время как другие клиенты имеют заказ:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1"

Не знаю, является ли это источником проблемы, но если это так: это ошибка в Thunderbird или проблема в indy, которая "искажает" заголовки сообщений? Этот заказ - проблема? Это имеет значение в любом случае?

Ответы [ 3 ]

1 голос
/ 18 марта 2010

В последней версии (как и сегодня) Indy есть проблема в заголовках:

Кажется, проблема в строке заголовка письма с:

Тип контента: составной / смешанный; граница = "oIROJ8Yu4KsL8BbjOo0fc \ = _ O7oAqLVq97i"

"=" внутри идентификатора границы начинается с "\" (возможно, чтобы его избежать), но в теле письма граница выглядит так:

- oIROJ8Yu4KsL8BbjOo0fc = _O7oAqLVq97i

Если вы посмотрите на источник Indy, в файле idGlobalProtocols ReplaceHeaderSubItem вызывает QuoteString, который добавляет обратную косую черту. Вы можете тщательно изменить логику и перекомпилировать Indy.

0 голосов
/ 16 марта 2010

Вы должны попробовать что-то вроде этого: (Примечание. Код не показывает, как отправить сообщение, а только как его создать. Существует другая служба, которая отправляет электронные письма).

Msg := TIdMessage.Create(nil);
try
  {create the message}
  Msg.Subject := Subject;
  with Msg.Recipients.Add do
  begin
    Text := EMailAddress;
  end;
  Msg.From.Address := From;
  Msg.From.Name := Copy(From, 1, pos('@', From) - 1);
  with Msg.ReplyTo.Add do
  begin
    Text := From;
  end;
  with TIdMessageBuilderHtml.Create do
  try
    {plain text}
    PlainText.Text := 'body text'
    {html body}
    Html.Text := '<html><body><p>' + 'body text' + '</p></body></html>';
    {attachments}
    for i := 0 to AttachFiles.Count - 1 do
        Attachments.Add(AttachFiles.Strings[i]);
    FillMessage(Msg);
  finally
    Free;
  end;
  {save the message for sending}
  Msg.NoEncode := False;
  Msg.NoDecode := False;
  Msg.SaveToFile(locfilename + TempExt);
finally
  Msg.Free;
end;

Ответ на комментарий Роба Кеннеди ниже: я разместил этот код, потому что для меня этот код работает со всеми основными почтовыми клиентами. Код не требует пояснений, создает сообщение с вложениями, сохраняет его. Я разместил решение, которое работает. У меня нет времени (я на работе), чтобы сравнить заголовки или исходный код сообщения с исходным кодом, который я разместил, чтобы понять, почему мой работает. Оригинальный постер может сделать это бесплатно и доложить.

0 голосов
/ 16 марта 2010

RFC 1521 прямо заявляет:

Сообщения составлены в соответствии с этот документ ДОЛЖЕН включать такой поле заголовка, со следующим дословный текст:

MIME-версия: 1.0

И обратите внимание, это поле заголовка:

Поля заголовка - это строки, состоящие из имя поля, за которым следует двоеточие (":"), сопровождаемый полевым телом, и прекращено CRLF. (rfc 2822)

Таким образом, если Indy не устанавливает его в качестве поля заголовка, это ошибка Indy, IMHO его синтаксис недопустим, его нельзя установить в строке типа содержимого (может быть, просто отсутствует CRLF?) - и TB просто следует дословно RFC, в то время как другие знают, что RFC часто не соблюдаются полностью и обрабатывают документ в любом случае.

...