Enregistrer le courrier vers le fichier msg en utilisant L'API EWS
J'utilise Exchange Web Services Managed API 1.1 Pour me connecter à Exchange server 2010 et ensuite découvrir les nouveaux e-mails reçus. Maintenant je veux sauver une copie de la .msg fichier dans un dossier sur le disque.
Je ne veux pas utiliser un tiers payé pour intégrer.
Toute aide sera appréciée.
8 réponses
si vous êtes heureux d'enregistrer dans le format .eml
à la place, il peut être fait très facilement en utilisant EWS et pas de bibliothèques tiers. Le .eml
fichier contiendra les mêmes informations et peut être ouvert par Outlook de la même manière .msg (et aussi par d'autres programmes).
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();
code nettoyé:
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);
}
il n'y a pas de support natif pour les fichiers MSG utilisant EWS. C'est strictement un format Outlook.
la spécification MSG est publiée à http://msdn.microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx . C'est un peu compliqué à comprendre, mais faisable. Vous devriez tirer vers le bas toutes les propriétés pour le message et le sérialiser dans un ole format de fichier structuré. Ce n'est pas une tâche facile.
À la fin, vous sont probablement mieux d'aller avec une bibliothèque de tiers sinon il pourrait être une grande tâche à accomplir.
cette suggestion a été publiée en tant que commentaire par @mack, mais je pense qu'elle mérite sa propre place en tant que réponse, si ce n'est pour aucune autre raison que le formatage et la lisibilité des réponses par rapport aux commentaires.
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);
}
si le format eml est une option et que php est la langue utilisée, base64_decode sur le contenu de la mémoire avant de l'enregistrer dans le fichier.
si vous utilisez https://github.com/Heartspring/Exchange-Web-Services-for-PHP ou https://github.com/hatsuseno/Exchange-Web-Services-for-PHP ajouter
$newmessage->mc = $messageobj->MimeContent->_;
à la ligne 245 ou 247.
vous pouvez facilement accéder au contenu MIME du message par message.MimeContent et sauvegardez le message dans un fichier EML. Les dernières versions (2013 et 2016) D'Outlook seront en mesure d'ouvrir des fichiers EML directement.
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();
si vous avez encore besoin de convertir au format MSG, vous avez quelques options:
1) le format de fichier MSG est documenté - il s'agit d'un fichier de stockage OLE. Voir https://msdn.microsoft.com/en-us/library/cc463912 (V = echg.80).aspx
2) Utilisez un tiers MSG File wrapper, comme celui de Independentsoft: http://www.independentsoft.de/msg/index.html . Définir toutes les propriétés que Outlook attend peut être difficile.
3) convertir le fichier EML en MSG directement en utilisant rachat :
set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.CreateMessageFromMsgFile("c:\test.msg")
Msg.Import("c:\test.eml", 1024)
Msg.Save
C'est ainsi que j'ai résolu le problème de télécharger à partir de EWS le message e-mail .format eml via le code vbs
' 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
si vous allez de L'EntryID D'Outlook via VSTO (Hex) à EwsID, vous devez regarder ici: http://bernhardelbl.wordpress.com/2013/04/15/converting-entryid-to-ewsid-using-exchange-web-services-ews/
M'a sauvé. Je n'arrêtais pas de recevoir un "les données sont corrompues." message.
vous pouvez télécharger toutes les pièces jointes en utilisant L'API EWS et C# . Voici l'exemple donné:
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++;
}
}
}
}
code ci-dessus convertit toutes les pièces jointes en octets. Une fois que vous avez octets, vous pouvez convertir des octets dans votre format requis. Pour convertir des octets en fichiers et enregistrer dans le disque suivez les liens ci-dessous: Écrire des octets dans le fichier http://www.digitalcoding.com/Code-Snippets/C-Sharp/C-Code-Snippet-Save-byte-array-to-file.html