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.

26
demandé sur JasonMArcher 2011-06-09 16:58:59

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);
}
51
répondu Colin Pickard 2014-03-31 15:33:05

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.

6
répondu Joe Doyle 2011-06-15 00:10:03

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); 
}
2
répondu WEFX 2014-07-24 17:19:58

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.

1
répondu jplfl 2012-10-10 10:31:16

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
1
répondu Dmitry Streblechenko 2016-03-17 20:11:21

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
0
répondu user2270629 2014-04-05 16:38:41

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.

0
répondu Spencer Williamson 2014-04-28 19:49:10

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

0
répondu Tapash 2018-09-12 13:07:25