web-dev-qa-db-fra.com

Enregistrer le courrier dans un fichier msg à l'aide de l'API EWS

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.

30
Bhanu Prakash

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);
}
58
Colin Pickard

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.

7
Joe Doyle

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); 
}
2
WEFX

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.

1
jplfl

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
1

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
0
user2270629

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

0
Tapash

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.

0
Spencer Williamson