我正在使用 Exchange Web Services Managed API 1.1 连接到 Exchange server 2010,然后找出收到的新电子邮件。现在我想将 .msg 文件的副本保存到磁盘上的文件夹中。
我不想使用任何付费第三方来集成。
任何帮助将不胜感激。
我正在使用 Exchange Web Services Managed API 1.1 连接到 Exchange server 2010,然后找出收到的新电子邮件。现在我想将 .msg 文件的副本保存到磁盘上的文件夹中。
我不想使用任何付费第三方来集成。
任何帮助将不胜感激。
如果您愿意保存为该.eml
格式,则只需使用 EWS 即可轻松完成,无需第三方库。该.eml
文件将包含所有相同的信息,并且可以由 Outlook 以与 .msg 相同的方式打开(也可以由其他程序打开)。
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mc = message.MimeContent;
FileStream fs = new FileStream("c:\test.eml", FileMode.Create);
fs.Write(mc.Content, 0, mc.Content.Length);
fs.Close();
清理代码:
message.Load(new PropertySet(ItemSchema.MimeContent));
var mimeContent = message.MimeContent;
using (var fileStream = new FileStream(@"C:\Test.eml", FileMode.Create))
{
fileStream.Write(mimeContent.Content, 0, mimeContent.Content.Length);
}
使用 EWS 没有对 MSG 文件的本机支持。它严格来说是一种 Outlook 格式。
MSG 规范发布在http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx。理解起来有点复杂,但是可行。您需要下拉消息的所有属性,然后将其序列化为 OLE 结构化文件格式。这不是一件容易的事。
最后,您最好使用 3rd 方库,否则可能是一项艰巨的任务。
您可以通过邮件轻松访问邮件的 MIME 内容,并将邮件message.MimeContent
保存为 EML 文件。最新(2013 和 2016)版本的 Outlook 将能够直接打开 EML 文件。
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mimcon = message.MimeContent;
FileStream fStream = new FileStream("c:\test.eml", FileMode.Create);
fStream.Write(mimcon.Content, 0, mimcon.Content.Length);
fStream.Close();
如果您仍需要转换为 MSG 格式,您有几个选择:
记录了 MSG 文件格式 - 它是一个 OLE 存储 (IStorage) 文件。请参阅https://msdn.microsoft.com/en-us/library/cc463912(v=exchg.80).aspx
使用第三方 MSG 文件包装器,例如来自 Independentsoft 的包装器:http: //www.independentsoft.de/msg/index.html。设置 Outlook 期望的所有属性可能具有挑战性。
使用Redemption直接将 EML 文件转换为 MSG :
set Session = CreateObject("Redemption.RDOSession") set Msg = Session.CreateMessageFromMsgFile("c:\test.msg") Msg.Import("c:\test.eml", 1024) Msg.Save
请记住,MIME 不会保留所有 MAPI 特定属性。您可以使用ExportItems EWS 操作使用的快速传输流 (FTS) 格式(与 MSG 格式一样,它保留了大多数 MAPI 属性)。然后可以使用 Redemption (RDOSession./RDOMail./) 将 FTS 数据转换(不损失任何保真度)为MSG格式CreateMessageFromMsgFile
Import(..., olFTS)
RDOMail.Save
RDOSession session = new RDOSession(); RDOMail msg = session.CreateMessageFromMsgFile(@"c:\temp\test.msg"); msg.Import(@"c:\temp\test.fts", rdoSaveAsType.olFTS); msg.Save();
这个建议是由@mack 作为评论发布的,但我认为它应该有自己的位置作为答案,如果除了格式和答案与评论的可读性之外没有其他原因。
using (FileStream fileStream =
File.Open(@"C:\message.eml", FileMode.Create, FileAccess.Write))
{
message.Load(new PropertySet(ItemSchema.MimeContent));
MimeContent mc = message.MimeContent;
fileStream.Write(mc.Content, 0, mc.Content.Length);
}
如果 eml 格式是一个选项并且 php 是语言,则在保存文件之前在 Mimencontent 上使用 base64_decode。
如果使用https://github.com/Heartspring/Exchange-Web-Services-for-PHP或https://github.com/hatsuseno/Exchange-Web-Services-for-PHP需要添加
$newmessage->mc = $messageobj->MimeContent->_;
在第 245 或 247 行。
如果您要通过 VSTO (Hex) 从 Outlook 的 EntryID 转到 EwsID,则需要查看此处:http ://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web -服务-新闻/
救了我。我不断收到“数据已损坏”。信息。
这就是我如何解决通过 vbs 代码从 EWS 下载 .eml 格式的电子邮件的问题
' This is the function that retrieves the message:
function CreaMailMsg(ItemId,ChangeKey)
Dim MailMsg
Dim GetItemSOAP,GetItemResponse,Content
LogFile.WriteLine (Now() & "-" & ":CreaMailMsg:ID:" & ItemId)
GetItemSOAP=ReadTemplate("GetItemMsg.xml")
GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMID-->", ItemId)
GetItemSOAP=Replace(GetItemSOAP, "<!--ITEMCHANGEKEY-->", ChangeKey)
LogFile.WriteLine (Now() & ":GetItemSOAP:" & GetItemSOAP)
set GetItemResponse=SendSOAP(GetItemSOAP,TARGETURL,"",USERNAME,PASSWORD)
' Check we got a Success response
if not IsResponseSuccess(GetItemResponse, "m:GetItemResponseMessage","ResponseClass") then
LogFile.WriteLine (Now() & "-" & ":ERRORE:Fallita GetItemMsg:" & GetItemResponse.xml)
Chiusura 1
end if
' LogFile.WriteLine (Now() & "-" & ":DEBUG:riuscita GetItemMsg:" & GetItemResponse.xml)
Content = GetItemResponse.documentElement.getElementsByTagName("t:MimeContent").Item(0).Text
' LogFile.WriteLine (Now() & ":Contenuto MIME" & Content)
CreaMailMsg = WriteAttach2File(Content,"OriginaryMsg.eml")
' MailMsg.close
CreaMailMsg = true
end function
'###########################################################################
' These are the functions the save the message in .eml format
'###########################################################################
function WriteAttach2File(Content,nomeAttach)
Dim oNode,oXML,Base64Decode
' Read the contents Base64 encoded and Write a file
set oXML=CreateObject("MSXML2.DOMDocument")
set oNode=oXML.CreateElement("base64")
oNode.DataType="bin.base64"
oNode.Text = Content
Base64Decode = Stream_Binary2String(oNode.nodeTypedValue,nomeAttach)
Set oNode = Nothing
Set oXML = Nothing
end function
'###########################################################################
function Stream_Binary2String(binary,nomeAttach)
Const adTypeText = 2
Const adTypeBinary = 1
Dim BinaryStream
Set BinaryStream=CreateObject("ADODB.Stream")
BinaryStream.Type=adTypeBinary' Binary
BinaryStream.Open
BinaryStream.Write binary
BinaryStream.Position=0
BinaryStream.Type=adTypeText
BinaryStream.CharSet = "us-ascii"
Stream_Binary2String=BinaryStream.ReadText
'msgbox Stream_Binary2String
BinaryStream.SaveToFile ShareName & "\" & nomeAttach,2
Set BinaryStream=Nothing
end function
您可以使用 EWS API 和 C# 下载所有附件。下面是给出的例子:
byte[][] btAttachments = new byte[3][]; //To store 3 attachment
if (item.HasAttachments) {
EmailMessage message = EmailMessage.Bind(objService, new ItemId(item.Id.UniqueId.ToString()), new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments));
noOfAttachment = message.Attachments.Count;
// Iterate through the attachments collection and load each attachment.
foreach(Attachment attachment in message.Attachments)
{
if (attachment is FileAttachment)
{
FileAttachment fileAttachment = attachment as FileAttachment;
// Load the file attachment into memory and print out its file name.
fileAttachment.Load();
//Get the Attachment as bytes
if (i < 3) {
btAttachments[i] = fileAttachment.Content;
i++;
}
}
// Attachment is an item attachment.
else
{
// Load attachment into memory and write out the subject.
ItemAttachment itemAttachment = attachment as ItemAttachment;
itemAttachment.Load(new PropertySet(EmailMessageSchema.MimeContent));
MimeContent mc = itemAttachment.Item.MimeContent;
if (i < 3) {
btAttachments[i] = mc.Content;
i++;
}
}
}
}
上面的代码将所有附件转换为字节。一旦有了字节,就可以将字节转换为所需的格式。要将字节转换为文件并保存在磁盘中,请点击以下链接: 将字节写入文件 http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to -file.html