J'utilise Exchange Web Services Managed API 1.1 pour me connecter au serveur Exchange 2010, puis découvrir les nouveaux e-mails reçus. Maintenant, je veux enregistrer une copie du fichier .msg dans un dossier sur le disque.
Je ne souhaite pas utiliser de tiers rémunéré pour m'intégrer.
Toute aide serait appréciée.
Si vous êtes plutôt heureux d'enregistrer au format .eml
, Cela peut être fait très facilement en utilisant simplement EWS et aucune bibliothèque tierce. Le fichier .eml
Contiendra toutes les mêmes informations et peut être ouvert par Outlook de la même manière que .msg (et également 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. Il s'agit strictement d'un format Outlook.
La spécification MSG est publiée sur http://msdn.Microsoft.com/en-us/library/cc463912%28EXCHG.80%29.aspx . C'est un peu compliqué à comprendre, mais faisable. Vous devez dérouler toutes les propriétés du message, puis le sérialiser dans un format de fichier structuré OLE. Ce n'est pas une tâche facile.
En fin de compte, vous feriez probablement mieux d'aller avec une bibliothèque tierce, sinon cela pourrait être une grosse 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, ne serait-ce que pour 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 php est la langue, utilisez base64_decode sur le Mimencontent avant d'enregistrer sur fichier.
Si vous utilisez https://github.com/Heartspring/Exchange-Web-Services-for-PHP ou https://github.com/hatsuseno/Exchange-Web-Services-for -PHP besoin d'ajouter
$newmessage->mc = $messageobj->MimeContent->_;
à la ligne 245 ou 247.
Vous pouvez facilement accéder au contenu MIME du message via message.MimeContent et enregistrer le message en tant que fichier EML. Les dernières versions (2013 et 2016) d'Outlook pourront ouvrir directement des fichiers 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();
Si vous avez encore besoin de convertir au format MSG, vous avez quelques options:
1) MSG est documenté - il s'agit d'un fichier de magasin OLE (IStorage). Voir https://msdn.Microsoft.com /en-us/library/cc463912(v=exchg.80).aspx
2) Utilisez un tiers MSG, tel que celui d'Independentsoft: http://www.independentsoft.de/msg/index.html . Setting toutes les propriétés attendues par Outlook peuvent être difficiles.
3) Convertissez le fichier EML en MSG directement en utilisant Redemption :
set Session = CreateObject("Redemption.RDOSession")
set Msg = Session.CreateMessageFromMsgFile("c:\test.msg")
Msg.Import("c:\test.eml", 1024)
Msg.Save
Voici comment j'ai résolu le problème pour télécharger à partir d'EWS le message électronique au 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
Vous pouvez télécharger toutes les pièces jointes à l'aide de l'API EWS et de 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++;
}
}
}
}
Le code ci-dessus convertit toutes les pièces jointes en octets. Une fois que vous avez des octets, vous pouvez convertir les octets au format requis. Pour convertir des octets en fichiers et les enregistrer sur le disque, suivez les liens ci-dessous: Écrire des octets dans un fichierhttp://www.digitalcoding.com/Code-Snippets/C-Sharp/C- Code-Snippet-Save-byte-array-to-file.html
Si vous passez de 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é. J'ai continué à recevoir un message "Les données sont corrompues". message.