加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中从Gmail读取电子邮件

发布时间:2020-12-15 03:55:43 所属栏目:百科 来源:网络整理
导读:我正在尝试从Gmail读取电子邮件.我已经尝试过我可以找到的每个API /开源项目,不能让任何一个工作. 有没有人有一个工作代码的样本,可以让我从Gmail帐户验证和下载电子邮件? 最终工作版本如下:https://stackoverflow.com/a/19570553/550198 解决方法 使用库
我正在尝试从Gmail读取电子邮件.我已经尝试过我可以找到的每个API /开源项目,不能让任何一个工作.

有没有人有一个工作代码的样本,可以让我从Gmail帐户验证和下载电子邮件?

最终工作版本如下:https://stackoverflow.com/a/19570553/550198

解决方法

使用库: http://mailsystem.codeplex.com/

以下是我的完整代码示例:

电子邮件存储库

using System.Collections.Generic;
using System.Linq;
using ActiveUp.Net.Mail;

namespace GmailReadImapEmail
{
    public class MailRepository
    {
        private Imap4Client client;

        public MailRepository(string mailServer,int port,bool ssl,string login,string password)
        {
            if (ssl)
                Client.ConnectSsl(mailServer,port);
            else
                Client.Connect(mailServer,port);
            Client.Login(login,password);
        }

        public IEnumerable<Message> GetAllMails(string mailBox)
        {
            return GetMails(mailBox,"ALL").Cast<Message>();
        }

        public IEnumerable<Message> GetUnreadMails(string mailBox)
        {
            return GetMails(mailBox,"UNSEEN").Cast<Message>();
        }

        protected Imap4Client Client
        {
            get { return client ?? (client = new Imap4Client()); }
        }

        private MessageCollection GetMails(string mailBox,string searchPhrase)
        {
            Mailbox mails = Client.SelectMailbox(mailBox);
            MessageCollection messages = mails.SearchParse(searchPhrase);
            return messages;
        }
    }
}

用法

[TestMethod]
public void ReadImap()
{
    var mailRepository = new MailRepository(
                            "imap.gmail.com",993,true,"yourEmailAddress@gmail.com","yourPassword"
                        );

    var emailList = mailRepository.GetAllMails("inbox");

    foreach (Message email in emailList)
    {
        Console.WriteLine("<p>{0}: {1}</p><p>{2}</p>",email.From,email.Subject,email.BodyHtml.Text);
        if (email.Attachments.Count > 0)
        {
            foreach (MimePart attachment in email.Attachments)
            {
                Console.WriteLine("<p>Attachment: {0} {1}</p>",attachment.ContentName,attachment.ContentType.MimeType);
            }
        }
    }
}

另一个例子,这次使用MailKit

public class MailRepository : IMailRepository
{
    private readonly string mailServer,login,password;
    private readonly int port;
    private readonly bool ssl;

    public MailRepository(string mailServer,string password)
    {
        this.mailServer = mailServer;
        this.port = port;
        this.ssl = ssl;
        this.login = login;
        this.password = password;
    }

    public IEnumerable<string> GetUnreadMails()
    {
        var messages = new List<string>();

        using (var client = new ImapClient())
        {
            client.Connect(mailServer,port,ssl);

            // Note: since we don't have an OAuth2 token,disable
            // the XOAUTH2 authentication mechanism.
            client.AuthenticationMechanisms.Remove("XOAUTH2");

            client.Authenticate(login,password);

            // The Inbox folder is always available on all IMAP servers...
            var inbox = client.Inbox;
            inbox.Open(FolderAccess.ReadOnly);
            var results = inbox.Search(SearchOptions.All,SearchQuery.Not(SearchQuery.Seen));
            foreach (var uniqueId in results.UniqueIds)
            {
                var message = inbox.GetMessage(uniqueId);

                messages.Add(message.HtmlBody);

                //Mark message as read
                //inbox.AddFlags(uniqueId,MessageFlags.Seen,true);
            }

            client.Disconnect(true);
        }

        return messages;
    }

    public IEnumerable<string> GetAllMails()
    {
        var messages = new List<string>();

        using (var client = new ImapClient())
        {
            client.Connect(mailServer,SearchQuery.NotSeen);
            foreach (var uniqueId in results.UniqueIds)
            {
                var message = inbox.GetMessage(uniqueId);

                messages.Add(message.HtmlBody);

                //Mark message as read
                //inbox.AddFlags(uniqueId,true);
            }

            client.Disconnect(true);
        }

        return messages;
    }
}

用法

[Test]
public void GetAllEmails()
{
    var mailRepository = new MailRepository("imap.gmail.com","YOUREMAILHERE@gmail.com","YOURPASSWORDHERE");
    var allEmails = mailRepository.GetAllMails();

    foreach(var email in allEmails)
    {
        Console.WriteLine(email);
    }

    Assert.IsTrue(allEmails.ToList().Any());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读