.Net 访问电子邮箱

发布时间 2023-03-23 15:37:23作者: C余L小R鱼

访问电子邮件有两种协议

IMAP

  • 客户端与服务端同步(包括阅读、标记、移动、删除等操作) 本质是从邮件服务读取邮件信息,而不是将其下载至本地客户端进行存储
  • 仅在单击邮件时下载邮件 不会自动下载附件 相较于pop可以更快的检查邮件
  • 删除 仅是将其标记为“已删除”,并在收件箱中隐藏;也可以通过设置在服务器、客户端中真正删除
  • 实现代码
using System;
using MailKit.Net.Imap;
using MailKit;
using MimeKit;

// IMAP服务器地址
string imapServer = "imap.email.com";
// IMAP服务器端口号
int imapPort = 993;
// 邮箱账号
string email = "your@email.com";
// 邮箱密码
string password = "yourpassword";

// 创建IMAP客户端
using (var client = new ImapClient())
{
    // 连接IMAP服务器
    client.Connect(imapServer, imapPort, true);
    // 登录邮箱
    client.Authenticate(email, password);
    // 获取收件箱
    var inbox = client.Inbox;
    // 打开收件箱
    inbox.Open(FolderAccess.ReadOnly);

    // 订阅收件箱更新事件
    inbox.CountChanged += Inbox_CountChanged;

    Console.WriteLine("已经订阅邮件更新事件。");
    Console.ReadLine();

    // 取消订阅
    inbox.CountChanged -= Inbox_CountChanged;

    // 断开连接
    client.Disconnect(true);
}

// 收件箱更新事件处理函数
private static void Inbox_CountChanged(object sender, EventArgs e)
{
    var inbox = (ImapFolder)sender;
    Console.WriteLine("新邮件到达,当前共有 {0} 封邮件。", inbox.Count);
    // 获取邮件数量
    int count = inbox.Count;

    // 循环获取每封邮件
    for (int i = 0; i < count; i++)
    {
        var message = inbox.GetMessage(i);
        Console.WriteLine("主题:" + message.Subject);
        Console.WriteLine("发送人:" + message.From.DisplayName);
        Console.WriteLine("时间:" + message.Date);
        Console.WriteLine("内容:" + message.TextBody);
        Console.WriteLine("---------------------------------------");
    }
}

POP

  • 工作原理是从邮件服务下载所有新邮件包括附件 至客户端电脑上 并将其从邮件服务器中进行删除 【所以 同一封邮件 只会被一台计算机客户端进行查看、操作 无法被第二台客户端获取到】 已发送的邮件也只存储在本地客户端 不会上传到邮件服务器上
  • 删除 真正删除 无法恢复
  • 代码
csharp
using System.Net.Mail;
using System.Net;

// POP3服务器地址
string popServer = "pop.email.com";
// POP3服务器端口号
int popPort = 995;
// 邮箱账号
string email = "your@email.com";
// 邮箱密码
string password = "yourpassword";

// 创建POP3客户端
using (var client = new Pop3Client())
{
    // 连接POP3服务器
    client.Connect(popServer, popPort, true);
    // 登录邮箱
    client.Authenticate(email, password);

    // 获取邮件数量
    int count = client.GetMessageCount();

    // 循环获取每封邮件
    for (int i = 1; i <= count; i++)
    {
        var message = client.GetMessage(i);
        Console.WriteLine("主题:" + message.Subject);
        Console.WriteLine("发送人:" + message.From.DisplayName);
        Console.WriteLine("时间:" + message.Date);
        Console.WriteLine("内容:" + message.Body);
        Console.WriteLine("---------------------------------------");
    }

    // 断开连接
    client.Disconnect(true);
}

两者区别

  • IMAP是双向通信 可以订阅邮箱更新;POP是单向 仅支持获取简单-已读/未读状态
  • IMAP 支持多台设备同时登录查看同一附件 但是POP仅支持一台设备查看某个邮件
  • IMAP可以做到逻辑删除 可恢复;POP是物理删除 且服务器端无备份 不可恢复
  • IMAP更灵活方便,POP3更适合独享邮件的场景