Mfc 带有Outlook的MAPISendMail有时会导致winmail.dat

Mfc 带有Outlook的MAPISendMail有时会导致winmail.dat,mfc,mapisendmail,winmail.dat,Mfc,Mapisendmail,Winmail.dat,我在MFC应用程序中使用MAPISendMail(),但我遇到一个问题,即webmail客户端有时会收到winmail.dat附件,而不是“真正的”附件 我做了很多研究,发现其他人也遇到了这个问题,但没有找到解决办法 我认为问题可能出在我的MapiFileDesc结构中,在该结构中,我将lpFileType成员保留为NULL,以便邮件程序(在我的示例中是Outlook 2010)自动确定文件类型。 lpFiletype是一种MapiFileTagExt结构,文档说明如下: NULL值表示未知的文

我在MFC应用程序中使用MAPISendMail(),但我遇到一个问题,即webmail客户端有时会收到winmail.dat附件,而不是“真正的”附件

我做了很多研究,发现其他人也遇到了这个问题,但没有找到解决办法

我认为问题可能出在我的MapiFileDesc结构中,在该结构中,我将lpFileType成员保留为NULL,以便邮件程序(在我的示例中是Outlook 2010)自动确定文件类型。 lpFiletype是一种MapiFileTagExt结构,文档说明如下: NULL值表示未知的文件类型或由操作系统确定的文件类型

因此,我认为这应该适用于常见类型,如JPEG或GIF等

我了解到winmail.dat是由Outlook发送的邮件使用微软专有的ms tnef编码引起的。但是,在发送电子邮件时,Outlook会突出显示“HTML”,而不是RTF

有没有人遇到过这个问题并妥善解决了

通过SMTP发送,这不是一个选项,因为用户应该在其“已发送邮件”文件夹中拥有邮件的副本。
使用Outlook对象模型不是一个选项,因为这需要用户安装Outlook,而不是任何与MAPI兼容的客户端。

我也遇到过类似的问题

我在“一次性寻址”一节中发现了一个有趣的信息,即当地址以[SMTP:SMTP地址]格式提供时,电子邮件总是以富文本格式发送

对我来说,修复方法根本不是设置MapiRecipDesc对象的“Address”属性。相反,我将地址放在Name属性中。打开的对话框起初不会解析地址,但在发送之前会解析地址,然后不会以RTF格式发送

我甚至把收件人的名字和地址联系起来:

MapiRecipDesc.Name = "Firstname Lastname <mail@address.com>";
MapiRecipDesc.Name=“Firstname Lastname”;

我也将jclmail.JclEmail、InternalSendOrSave例程的所有附件作为WinMail.Dat文件获取,该例程由JclEmail.Send调用

我所做的基本上是遵循jtmnt的答案并进行了更改:

 RealAddresses[I] := FAddress; //do not add the Recipients.AddressesType +     AddressTypeDelimiter
我改变了:

lpszName := PAnsiChar('"' + AnsiString(RealNames[I])+'" <' +
            AnsiString(RealAddresses[I]) + '>');
lpszAddress := '';
不再在Windows 8中工作,但在Windows 7中仍能正常工作。)


谢谢你的解决方案。您可能想知道如何将其应用于jclMapi代码,以及Win8中OLE的这个问题。

奇怪的是,Outlooks行为与收件人的域名长度无关!如果电子邮件地址域是12个字符或更多(我不知道确切的限制是什么),那么我们将面临有问题的TNEF编码。
因此:a@hutsfluts.nl出了问题。虽然abacadabraandmore@hf.nl将导致纯文本编码。 我想这不是故意的

上述解决方案: 将最近的电子邮件地址放在MapiRecipDesc的lpszName中,并让lpszAddress指向一个空字符串(不是null!)解决了这个问题。
不要问我为什么,因为我不知道为什么这会影响编码。

谢谢你的回答。明天我会在工作中试试,看看会发生什么。是的,这确实有效!尽管Outlook只会将LastName或Firstname搞乱。解决方法是使用“Firstname Lastname”并将地址字段留空。你试过看看这是否也适用于其他MAPI客户端吗?我已经在旧的XP机器上测试过,默认邮件客户端是Thunderbird,它在那里工作。我真的不知道其他邮件客户。我想,由于邮件客户端必须识别您手动在地址字段中键入的任何内容,因此他们应该能够从名称解析地址。谢谢您的回复。我只是想确保其他客户也能处理这个问题,但正如你所说的,他们应该能够像Outlook一样推断。再次感谢你的帮助!这也解决了outlook.com接收每个字符前带有问号的邮件时出现的问题(unicode问题?)。到目前为止,只有一个客户有这个问题。我仍然想知道微软为什么用这种方式实现它。关于域名长度的有趣观察。我不知道12个字符有什么限制因素,但我相当肯定这个限制不是任意的。
OutlookApp := GetActiveOleObject('Outlook.Application') and  
OutlookApp := CreateOleObject('Outlook.Application')