MailKit:如何遍历最近的电子邮件以获取具有给定主题的电子邮件
MailKit: How to iterate through recent emails to get the email with a given subject
我正在使用 .NET Core 2.1 创建一个框架。我使用了 MailKit 并尝试了几种方法,如他们的页面和 Whosebug 中所述,但仍然没有成功。
到目前为止,我能够获取最近邮件的 UID,但似乎无法遍历列表以获取具有特定主题的电子邮件。
测试调用方法:
Core core = new Core(driver);
bool isEmailPresent = core.EnsureUnreadEmailExists("Your application details" , "emailAddress");
Assert.True(isEmailPresent);
核心 (Class):
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 (Class)
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;
}
方法(在核心 class 中)我无法完成迭代 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;
}
}
我想做的是添加一两个 class 并具有可重用的方法,以便我可以在未来的任何测试中使用它们。
1. 访问 gmail 并验证具有特定主题的电子邮件是否存在
2. 从该电子邮件中提取某些内容(例如安全密码)并将其添加到文本文件中。
3. 查看邮件内容
您可以像这样遍历 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);
}
}
你可以试试
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;
}
我正在使用 .NET Core 2.1 创建一个框架。我使用了 MailKit 并尝试了几种方法,如他们的页面和 Whosebug 中所述,但仍然没有成功。
到目前为止,我能够获取最近邮件的 UID,但似乎无法遍历列表以获取具有特定主题的电子邮件。
测试调用方法:
Core core = new Core(driver);
bool isEmailPresent = core.EnsureUnreadEmailExists("Your application details" , "emailAddress");
Assert.True(isEmailPresent);
核心 (Class):
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 (Class)
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;
}
方法(在核心 class 中)我无法完成迭代 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;
}
}
我想做的是添加一两个 class 并具有可重用的方法,以便我可以在未来的任何测试中使用它们。 1. 访问 gmail 并验证具有特定主题的电子邮件是否存在 2. 从该电子邮件中提取某些内容(例如安全密码)并将其添加到文本文件中。 3. 查看邮件内容
您可以像这样遍历 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);
}
}
你可以试试
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;
}