Парсинг писем в Outlook с использованием C # через POP3 сервер - PullRequest
0 голосов
/ 31 мая 2018

Итак, я пытаюсь получить определенные данные из электронных писем, которые я получаю на работе, чтобы я мог взять нужные данные и поместить их в документ Excel (возможно, потребуется задать вопросы по этому вопросу позже).До сих пор я успешно прочитал всю свою электронную почту и нашел нужные мне письма с определенного адреса.Моя программа на данный момент сохраняет эти электронные письма в папку в виде файлов .eml.

Теперь мой вопрос: как мне прочитать текст электронных писем, чтобы я мог разобрать, что мне от них нужно?

Мои первые попытки использовать Microsoft CDO.Я пытаюсь вызвать метод, который я собрал из исследования в Интернете, но, похоже, не могу заставить его работать.Visual Studio говорит: «Ссылка на объект требуется для нестатического поля, метода или свойства» receivemail.Program.ReadMessage (string) '

Любая помощь будет отличной, и я могу ответить на все вопросывопросы, если это слишком широко или кому-то нужно больше подробностей.Я вставлю свой код ниже.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Reflection;

// Add EAGetMail namespace
using EAGetMail;

// Add CDO
using CDO.Message;

namespace receiveemail
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create a folder named "inbox" under current directory
            // to save the email retrieved.
            string curpath = Directory.GetCurrentDirectory();
            string mailbox = String.Format("{0}\\WorkOrders", curpath);

            // If the folder is not existed, create it.
            if (!Directory.Exists(mailbox))
            {
                Directory.CreateDirectory(mailbox);
            }

            MailServer oServer = new MailServer("pop-mail.outlook.com",
                        "email@email.com", "pass", ServerProtocol.Pop3);

            MailClient oClient = new MailClient("TryIt");

            //POP3 SSL connection
            oServer.SSLConnection = true;
            oServer.Port = 995;

            try
            {
                oClient.Connect(oServer);
                MailInfo[] infos = oClient.GetMailInfos();
                for (int i = 0; i < infos.Length; i++)
                {
                    MailInfo info = infos[i];
                    Console.WriteLine("Index: {0}; Size: {1}; UIDL: {2}",
                        info.Index, info.Size, info.UIDL);

                    // Receive email from POP3 server
                    Mail oMail = oClient.GetMail(info);
                    if (oMail.From.ToString() == "johndoe@yahoo.com")
                    {
                        Console.WriteLine("From: {0}", oMail.From.ToString());
                        Console.WriteLine("Subject: {0}\r\n", oMail.Subject);

                        // Generate an email file name based on date time.
                        System.DateTime d = System.DateTime.Now;
                        System.Globalization.CultureInfo cur = new
                        System.Globalization.CultureInfo("en-US");
                        string sdate = d.ToString("yyyyMMddHHmmss", cur);
                        string fileName = String.Format("{0}\\{1}{2}{3}.eml",
                        mailbox, sdate, d.Millisecond.ToString("d3"), i);

                        // Save email                   
                        oMail.SaveAs(fileName, true);
                        CDO.Message msg = ReadMessage(fileName);
                        Console.WriteLine(msg.TextBody);
                    } // end if

                    // Mark email as deleted from POP3 server.
                    oClient.Delete(info);
                }
                // Quit and purge emails marked as deleted from POP3 server.
                // oClient.Quit();

            } catch (Exception ep)
            {
                Console.WriteLine(ep.Message);
            } // end catch

        } // end method

        protected CDO.Message ReadMessage(String emlFileName)
        {
            CDO.Message msg = new CDO.MessageClass();
            ADODB.Stream stream = new ADODB.StreamClass();
            stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty);
            stream.LoadFromFile(emlFileName);
            stream.Flush();
            msg.DataSource.OpenObject(stream, "_Stream");
            msg.DataSource.Save();
            return msg;
        }

    } // end class

} // end namespace 

Обратите внимание, что это не настоящие адреса электронной почты и пароли ;-)

1 Ответ

0 голосов
/ 31 мая 2018

Метод ReadMessage не является статическим, и вы пытаетесь вызвать его из статического метода Main.Поэтому либо сделайте ReadMessage статическим, либо создайте экземпляр класса Program, а затем вызовите ReadMessage для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...