0

在 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、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 的问题,它“畸形”了消息的标题?这个订单有问题吗?这有关系吗?

4

3 回答 3

1

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

问题似乎出在邮件标题中:

内容类型:多部分/混合;边界="oIROJ8Yu4KsL8BbjOo0fc\=_O7oAqLVq97i"

边界标识符内的“=”前面带有一个“\”(可能是为了转义它),但在邮件正文中,边界看起来像这样:

--oIROJ8Yu4KsL8BbjOo0fc=_O7oAqLVq97i

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

于 2010-03-18T09:26:07.037 回答
0

RFC 1521 明确指出:

根据本文档编写的消息必须包含这样的头字段,并带有以下逐字文本:

MIME 版本:1.0

请注意,它是一个标头字段:

标题字段是由字段名称、后跟冒号 (":")、字段正文和以 CRLF 终止的行组成的。(RFC 2822)

因此,如果 Indy 未将其设置为标头字段,则它是 Indy 错误,恕我直言,其语法无效,不能在内容类型行中设置(可能只是缺少 CRLF?) - TB 只是逐字遵循 RFC ,而其他人知道 RFC 通常不完全遵循并随时处理文档。

于 2010-03-16T14:15:40.270 回答
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的评论如下:我发布了这段代码,因为对我来说,这段代码适用于所有主要的邮件客户端。该代码是不言自明的,创建带有附件的消息,保存它。我发布了一个有效的解决方案。我没有时间(我在工作)来比较原始代码的标题或消息源和我发布的代码,以了解我的工作原理。原始海报可以免费进行并报告。

于 2010-03-16T16:34:13.950 回答