L'analyse des emails dans outlook avec C#
Je suis en train d'écrire un programme pour lire tous mes e-mails outlook, finalement, la recherche sera plus spécifique, mais pour l'instant je veux lire tous les e-mails dans ma boîte de réception. j'ai l'exécution de code qui lit ce que je veux jusqu'à 169 pour une raison...
namespace reademail
{
static class Program
{
public static Microsoft.Office.Interop.Outlook.Application myApp;
public static void Main(string[] args)
{
//myApp = new Microsoft.Office.Interop.Outlook.Application();
//myApp.NewMailEx += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_NewMailExEventHandler(OutlookNewMailReceived);
ReadMail();
}
static void ReadMail()
{
Microsoft.Office.Interop.Outlook.Application app = null;
Microsoft.Office.Interop.Outlook._NameSpace ns = null;
Microsoft.Office.Interop.Outlook.MailItem item = null;
Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
app = new Microsoft.Office.Interop.Outlook.Application();
ns = app.GetNamespace("MAPI");
//ns.Logon(null, null, false, false);
inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
//subFolder = inboxFolder.Folders["Inbox"]; //folder.Folders[1]; also works
Console.WriteLine("Folder Name: {0}, EntryId: {1}", inboxFolder.Name, inboxFolder.EntryID);
Console.WriteLine("Num Items: {0}", inboxFolder.Items.Count.ToString());
//System.IO.StreamWriter strm = new System.IO.StreamWriter("C:/Test/Inbox.txt");
for (int counter = 1; counter <= inboxFolder.Items.Count; counter++)
{
Console.Write(inboxFolder.Items.Count + " " + counter);
item = (Microsoft.Office.Interop.Outlook.MailItem)inboxFolder.Items[counter];
Console.WriteLine("Item: {0}", counter.ToString());
Console.WriteLine("Subject: {0}", item.Subject);
Console.WriteLine("Sent: {0} {1}", item.SentOn.ToLongDateString(), item.SentOn.ToLongTimeString());
Console.WriteLine("Sendername: {0}", item.SenderName);
Console.WriteLine("Body: {0}", item.Body);
//strm.WriteLine(counter.ToString() + "," + item.Subject + "," + item.SentOn.ToShortDateString() + "," + item.SenderName);
}
//strm.Close();
}
}
}
La boucle lit jusqu'à 169 e-mails et puis se bloque, il en commence la lecture des e-mails à ce qui semble être une date arbitraire...je ne suis pas sûr de quoi l'empêcher de lire tous les e-mails...
Folder Name: Inbox, EntryId: 000000003527EA8DB4FFC04EB6ABA4DE31CB4BA40100C6D3EBA
DBDB57E438D0B53C5FB515CC50000660627C70000
Num Items: 1048
System.InvalidCastException: Unable to cast COM object of type 'System.__ComObje
ct' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'. This operatio
n failed because the QueryInterface call on the COM component for the interface
with IID '{00063034-0000-0000-C000-000000000046}' failed due to the following er
ror: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERF
ACE)).
at CallSite.Target(Closure , CallSite , Object )
at reademail.Program.ReadMail() in C:\Documents and Settings\DBubel\my docume
nts\visual studio 2010\Projects\reademail\reademail\Program.cs:line 60
Appuyez sur n'importe quelle touche pour continuer . . .
Vous devez nous dire ce que le spécifique
ici est l'exception:
Exception
est quand il se bloque afin que nous puissions résoudre le problème.ici est l'exception:
OriginalL'auteur stihl | 2012-03-12
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous avez des articles dans votre boîte de réception qui ne s'appliquent pas Microsoft.Bureau de.Interop.Outlook.MailItem de l'interface et par conséquent, le code se bloque lors de son passage dans la boucle, et tentant de jeter. Une solution de contournement possible, si vous êtes en utilisant .NET4 car il a le soutien de dynamique, est de ne pas jeter de l'objet, mais plutôt de passer à une variable dynamique.
dynamic item = inboxFolder.Items[counter];
Cela a fonctionné pour moi en tant que votre code a été d'avoir des problèmes de gestion des invitations de réunion dans le dossier boîte de réception.
Complet code modifié:
Oui, j'ai juste eu à supprimer de la déclaration de la variable sur le dessus. (Voir texte intégral de modifié le code ci-dessus)
OriginalL'auteur Roberto Hernandez
Si vous ne souhaitez que
MailItems
ensuite, vous devriez vérifier que l'élément que vous récupérez est valideMailItem
au lieu de supposer que vous en avez un. Il pourrait êtreCalendarItem
,DocumentItem
, etc. qui varie parolItemType
. Votre code actuel explicitement suppose que vous ne disposezMailItems
dans votre boîte de réception.Votre erreur indique que vous pouvez avoir un
MailItem
- mais il pourrait être un Mail de Rapport de remise (confirmation de Lecture, etc.). Voir ce post pour référence avec l'erreur de casting. Ils suggèrent en tirant parti de la Perspectives Tableau de l'interface comme une solution de contournement et de la vérification de l'objetClass
. Cela peut être une autre option pour vous.je vais essayer je suis sur le point de rentrer à la maison. je vais revenir plus tard.
OriginalL'auteur SliverNinja - MSFT