在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的一个问题,哪个“错误”了邮件的标题?这个订单有问题吗?这有关系吗?
答案 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 的评论:我发布此代码是因为对我而言,此代码适用于所有主要邮件客户端。代码是自解释的,创建带附件的消息,保存它。我发布了一个有效的解决方案。我没有时间(我正在工作)来比较原始代码的标题或消息来源以及我发布的代码,以了解我的工作原理。原始海报可以免费提交并报告。