2013-05-07 3 views
1

У меня есть каталог, полный файлов электронной почты, которые я хочу импортировать в Outlook.Импорт файлов электронной почты в Outlook программно

Эти файлы должны быть, AFAIK, в формате RFC822. Открытие их Notepad ++ показывает следующее и более открытым текстом

Return-Path: XXX 
Received: XXX 
Authentication-Results: XXX 
X-Message-Status: XXX 
X-SID-PRA: XXX 
X-SID-Result: XXX 
X-AUTH-Result: XXX 
X-Message-Delivery: XXX 
X-Message-Info: XXXX 
Received: from XXX 
Received: from XXX 
DomainKey-Signature: XXX 

Так что я предполагаю, что они находятся в простом старом формате. Теперь я хотел бы импортировать их в PST-файл, чтобы индексировать и сделать их исправными. У меня очень плохое знание Outlook Interop.

Переименование файлов без названия в .eml работает, я могу открыть их с помощью Outlook 2010. Перетаскивание их в окна Outlook работает наполовину: электронные письма не просматриваются, но я могу их дважды щелкнуть. Не все электронные письма импортируются (я говорю о 3000 + сообщениях), а Outlook не содержит поврежденных файлов, поэтому либо все, либо ничего.

Я изучал внешний вид Outlook.

Основная идея заключается в следующем: для каждого текстового файла импортируйте его как электронную почту в заданную папку.

Я пробовал писать, но еще не проверить, следующий код

Application outlook = GetApplicationObject(); 

outlook.Session.AddStore(pstPath); 

Store theStore = outlook.Session.Stores.Cast<Store>().FirstOrDefault(store => store.FilePath == pstPath); 

if (theStore == null) throw new Exception(); 

try 
{ 
    string[] files = Directory.GetFiles(dataDirectory, "*", SearchOption.AllDirectories); 

    Folder folder = (Folder)theStore.GetRootFolder(); 

    foreach (string file in files.Where(file => file.EndsWith(".eml"))) 
    { 
     //What? 


    } 
} 
finally 
{ 
    //Dispose?? 
} 

Где GetApplicationObject скопировано с другого SO ответа.

Вопрос: возможно ли создать MailItem на основе содержимого файла? Или мне нужно использовать электронную почту, а затем создать поле MailItem по полю? Как Далее я писал ...

IMail mail = builder.CreateFromEmlFile(file); 

MailItem outlookMail = outlook.CreateItem(OlItemType.olMailItem); 
outlookMail.Body = mail.GetBodyAsText(); 
outlookMail.CC = string.Join("; ", mail.Cc.Select(x => x.Render())); 
outlookMail.HTMLBody = mail.GetBodyAsHtml(); 

if (MimeImportance.High.Equals(mail.Importance)) 
    outlookMail.Importance = OlImportance.olImportanceHigh; 
else if (MimeImportance.Low.Equals(mail.Importance)) 
    outlookMail.Importance = OlImportance.olImportanceLow; 
else 
    outlookMail.Importance = OlImportance.olImportanceNormal; 

outlookMail.Sender=outlook.CreateItem() 

библиотека Я пытаюсь от http://www.limilabs.com/mail

+0

Нет такой вещи, как «Outlook 2012». Там 2010 (ПК), 2011 (Mac) и 2013 (ПК). Можете ли вы проверить версию, которую используете? – Charles

+0

Извините. Я имел в виду Office 2010 –

ответ

0

Если вы используете C++ или Delphi, вы можете использовать интерфейс IConverterSession MAPI (вы можете играть с ним в OutlookSpy, если вы нажмете кнопку IConverterSession). В противном случае вы можете Redemption и его объект RDOMail - его метод импорта поддерживает формат MIME (среди десятков других форматов).

set Session = CreateObject("Redemption.RDOSession") 
    Session.MAPIOBJECT = Application.Session.MAPIOBJECT 
    set Inbox = Session.GetDefaultFolder(olFolderInbox) 
    set Msg = Inbox.Items.Add 
    Msg.Sent = true 
    Msg.Import "C:\Temp\test.eml", 1024 
    Msg.save 
Смежные вопросы