Indy IdSMTP和Thunderbird中的附件

时间:2010-03-16 13:57:37

标签: delphi indy

在D2010上使用Indy tiburon的最新快照。一个非常简单的项目,如:

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,蝙蝠!,OE,雅虎等......但是在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 个答案:

答案 0 :(得分:1)

Indy的最新版本(如今)在标题中存在问题:

问题似乎在邮件标题中的行周围:

内容类型:multipart / mixed;边界= “oIROJ8Yu4KsL8BbjOo0fc \ = _ O7oAqLVq97i”

边界标识符中的“=”前面带有“\”(可能是为了逃避它),但在邮件正文中,边界如下所示:

- oIROJ8Yu4KsL8BbjOo0fc = _O7oAqLVq97i

如果你看一下Indy的来源,在文件idGlobalProtocols中,ReplaceHeaderSubItem调用QuoteString,这是添加反斜杠的那个。您可以在这里仔细更改逻辑并重新编译Indy。

答案 1 :(得分:0)

RFC 1521明确指出:

  

按照组成的消息   这个文件必须包括这样一个   标题字段,具有以下内容   逐字文本:

     

MIME-Version:1.0

请注意它是一个标题字段:

  

标题字段是由a组成的行   字段名称,后跟冒号(“:”),   然后是一个场体,和   由CRLF终止。   (rfc 2822)

因此,如果Indy没有将它设置为标题字段,那么它是一个Indy错误,恕我直言它的语法无效,它不能在内容类型行中设置(可能只是一个丢失的CRLF?) - 而TB只是如下RFC逐字逐句,而另一方知道RFC通常不会完全遵循并随时处理文档。

答案 2 :(得分:0)

你应该尝试这样的事情: (注意:代码不会向您显示如何发送消息,只是如何创建消息。还有另一种服务可以发送电子邮件)。

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;

回答 Rob Kennedy 的评论:我发布此代码是因为对我而言,此代码适用于所有主要邮件客户端。代码是自解释的,创建带附件的消息,保存它。我发布了一个有效的解决方案。我没有时间(我正在工作)来比较原始代码的标题或消息来源以及我发布的代码,以了解我的工作原理。原始海报可以免费提交并报告。