【问题标题】:MailKit: How to iterate through recent emails to get the email with a given subjectMailKit:如何遍历最近的电子邮件以获取具有给定主题的电子邮件
【发布时间】:2020-03-19 02:20:30
【问题描述】:

我正在使用 .NET core 2.1 创建一个框架。我使用 MailKit 并尝试了他们的页面和 StackOverflow 中解释的几种方法,但仍然没有运气。

到目前为止,我能够获取最近邮件的 UID,但似乎无法遍历列表以获取具有特定主题的电子邮件。

测试调用方法:

                 Core core = new Core(driver);

                 bool isEmailPresent = core.EnsureUnreadEmailExists("Your application details" , "emailAddress");

                 Assert.True(isEmailPresent);

核心(类):

          public bool EnsureUnreadEmailExists(string emailSubject, string emailBox)

          {

                 bool emailExists = true;

                 //start stopwatch to monitor elapsed time

                 Stopwatch sw = Stopwatch.StartNew();

                 //long maximumTimeout = 180000; //exit loop when maximumTimeout is reached

                 long maximumTimeout = 10000; //exit loop when maximumTimeout is reached



                 int sleepWait = 500;

                 //check if email exists and is readable

                 while (CheckEmailExistsAndIsReadable(GetGmailMessage(emailBox), emailSubject) && sw.ElapsedMilliseconds <= maximumTimeout)

                 {

                       //loop until email has arrived and is activated or maximumTimeout exceeded

                       Thread.Sleep(sleepWait);

                       Console.WriteLine("Time elapsed : {0}ms", sw.ElapsedMilliseconds);

                 }



                 try

                 {

                        //try

                       emailExists = false;

                 }

                 catch (Exception ae)

                 {
                     //exception message
                       emailExists = false;

                 }

                 sw.Stop();

                 return emailExists;

          }

          private IList<UniqueId> GetGmailMessage(string emailBox)

          {

                 // Switch on the string - emailBox.

                 switch (emailBox.ToUpper())

                 {

                        case "emailAddress1":

                              GMailHandler gmh1 = new GMailHandler("imap.gmail.com", 993, true,

                              "emailAddress", "password");

                              return gmh1.GetRecentEmails();

                       default:

                              throw new Exception("Mail box not defined");

                 }



          }

GMailHandler(类)

          public GMailHandler(string mailServer, int port, bool ssl, string login, string password)

          {

                 if (ssl)

                       Client.Connect(mailServer, port);

                 else

                       Client.Connect(mailServer, port);

                 Client.Authenticate(login, password);

                 Client.Inbox.Open(FolderAccess.ReadOnly);

          }



          public IList<UniqueId> GetRecentEmails()

          {

                 IList<UniqueId> uids = client.Inbox.Search(SearchQuery.Recent);

                 return uids;

          }

方法(在核心类中)我无法完成遍历 UID 以获取具有给定主题的电子邮件

          public static bool CheckEmailExistsAndIsReadable(IList<UniqueId> uids, string emailSubject)

          {

                 try

                 {

                       Console.WriteLine("Attempt to read email messages .....");

                       string htmlBody = "";

                       string Subject = "";

                       bool EmailExists = false;

                       foreach (UniqueId msgId in uids)

                       {

                        //Incomplete
                              if (msgId.)

                              {

                                     htmlBody = email.BodyHtml.Text;

                                     Subject = email.Subject.ToString();

                                     Console.WriteLine("Subject: " + Subject);

                                     Match match = Regex.Match(Subject, emailSubject);

                                     Console.WriteLine("match: " + match.Groups[0].Value.ToString());

                                     if (match.Success)

                                     {

                                            Console.WriteLine("Email exists with subject line: " + emailSubject);

                                            EmailExists = true;

                                     }

                                     break;

                              }



                       }

                       if (EmailExists)

                       {

                              //email found so exit poll

                              Console.WriteLine("email found return false ");

                              return false;

                       }

                       else

                       {

                              //email not found so contiue to poll

                              Console.WriteLine("email not found return true ");

                              return true;

                       }





                 }

                 catch (IOException)

                 {

                       //the email with specific subject line has not yet arrived:

                       //may be still in transit

                       //or being processed by another thread

                       //or does not exist (has already been processed)

                       Console.WriteLine("Email has not arrived or still in transit. Continue to poll ... ");

                       return true;

                 }



          }

我想做的是添加一两个类并拥有可重用的方法,以便我可以在以后的任何测试中使用它们。 1.访问gmail并验证具有特定主题的电子邮件是否存在 2. 从该电子邮件中提取某些内容(例如安全密码)并将其添加到文本文件中。 3.查看邮件内容

【问题讨论】:

    标签: c# .net selenium gmail mailkit


    【解决方案1】:

    您可以遍历 uid 并像这样下载消息:

    foreach (uid in uids) {
        var message = client.GetMessage (uid);
        if (message.Subject == subject) {
            // we found the message
        }
    }
    

    或者您可以提高效率并使用以下方法:

    var uids = client.Inbpx.Search (SearchQuery.SubjectContains (subject).And (SearchQuery.Recent));
    

    如果 uids.Count > 0 则消息存在。

    下载消息后,您可以遍历所有正文部分并像这样提取它们:

    foreach (var part in message.BodyParts.OfType<MimePart> ()) {
        var fileName = part.FileName;
    
        using (var stream = File.Create (fileName)) {
            part.Content.DecodeTo (stream);
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试

                public GMailHandler(string mailServer, int port, bool ssl, string login, string password)
      
                {
      
                        if (ssl)
      
                        {
      
                               client.Connect(mailServer, port);
      
                        }
      
                        else
      
                               client.Connect(mailServer, port);
      
                        client.Authenticate(login, password);
      
                        inbox = client.Inbox;
      
                }
      
      
      
                public IEnumerable<string> GetEmailWithSubject (string emailSubject)
      
                {
      
                        var messages = new List<string>();
      
      
      
                        inbox.Open(FolderAccess.ReadWrite);
      
                        var results = inbox.Search(SearchOptions.All, SearchQuery.Not(SearchQuery.Seen));
      
                        foreach (var uniqueId in results.UniqueIds)
      
                        {
      
                               var message = client.Inbox.GetMessage(uniqueId);
      
      
      
                               if (message.Subject.Contains(emailSubject))
      
                               {
      
                                      messages.Add(message.HtmlBody);
      
                               }
      
      
      
                               //Mark message as read
      
                               inbox.AddFlags(uniqueId, MessageFlags.Seen, true);
      
                        }
      
      
      
                        client.Disconnect(true);
      
      
      
                        return messages;
      
                }
      

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 2021-03-04
        • 2023-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-14
        • 2018-04-29
        相关资源
        最近更新 更多