LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 使用 MailKit 收发邮件

admin
2024年11月5日 21:2 本文热度 276

前言

在.NET 中处理邮件收发操作时,MailKit是一个非常强大的库。

它支持SMTP、POP3、IMAP等多种协议,可以轻松实现发送、接收、以及管理邮件的功能。

下面我们将通过一个详细的示例,展示如何在.NET 项目中使用MailKit来收发邮件,并对关键代码进行解释。

获取QQ邮箱授权码

打开QQ邮箱,进入 设置->账号 页面:

在 POP3/IMAP/SMTP 中开启 SMTP服务,然后点击 授权码复制授权码:

QQ邮箱服务器的参数如下,详细内容参考SMTP/IMAP服务:

  • 接收邮件服务器:imap.qq.com,使用SSL,端口号993

  • 发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587

网易邮箱服务器的参数如下,详细内容参考网易邮箱服务器参数如何设置?:

安装 MailKit

在项目中安装 MailKit 库,可以通过NuGet包管理器安装它或者使用以下命令:

dotnet add package MailKit

MailKit 是在 MimeKit 之上构建的跨平台邮件客户端库,目标是成为 .NET 的最佳电子邮件框架。

配置邮件服务器信息

配置邮件服务器信息,包括主机、端口、用户名、密码等,封装成 EmailData 类:

/// <summary>
/// 邮件数据
/// </summary>
class EmailData
{
    /// <summary>
    /// 发件人
    /// </summary>
    public string From { getset; }
    /// <summary>
    /// 授权码
    /// </summary>
    public string Password { getset; }
    /// <summary>
    /// 收件人
    /// </summary>
    public string To { getset; }
    /// <summary>
    /// 主题
    /// </summary>
    public string Subject { getset; }
    /// <summary>
    /// 纯文本内容
    /// </summary>
    public string TextBody { getset; }
    /// <summary>
    /// HTML内容
    /// </summary>
    public string HtmlBody { getset; }

    /// <summary>
    /// 发送邮件服务器
    /// </summary>
    public HostInfo SMTP { getset; }
    /// <summary>
    /// 接受邮件服务器
    /// </summary>
    public HostInfo IMAP { getset; }
}
/// <summary>
/// 服务器信息
/// </summary>
class HostInfo
{
    /// <summary>
    /// 服务器地址
    /// </summary>
    public string Host { getset; }
    /// <summary>
    /// 服务器端口
    /// </summary>
    public int Port { getset; }
}

实现邮件收发方法

邮件收发方法如下,这里只接收最新的10封邮件便于实现交互逻辑:

static async Task SendEmail(EmailData data)
{
    try
    {
        // 创建一个新的 MIME 消息对象
        var message = new MimeMessage();

        // 设置发件人
        message.From.Add(MailboxAddress.Parse(data.From));

        // 设置收件人
        message.To.Add(MailboxAddress.Parse(data.To));

        // 设置主题
        message.Subject = data.Subject;

        // 创建邮件正文
        var builder = new BodyBuilder();
        builder.TextBody = data.TextBody;
        builder.HtmlBody = data.HtmlBody;

        // 添加附件
        using (var stream = new FileStream("file.txt", FileMode.Open))
        {
            builder.Attachments.Add("file.txt", stream);
        }
        // 设置正文
        message.Body = builder.ToMessageBody();

        // 使用 SMTP 客户端发送邮件
        using (var client = new SmtpClient())
        {
            await client.ConnectAsync(data.SMTP.Host, data.SMTP.Port, SecureSocketOptions.StartTls);

            // 注:用户名和密码应妥善保管,不要硬编码到源码中
            await client.AuthenticateAsync(data.From, data.Password);

            // 发送邮件
            await client.SendAsync(message);

            // 断开与服务器的连接
            await client.DisconnectAsync(true);
        }

        Console.WriteLine("邮件已成功发送!");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"邮件发送失败:{ex.Message}");
    }
}

static async Task GetEmail(EmailData data)
{
    try
    {
        // 连接到 IMAP 服务器
        using (var client = new ImapClient())
        {
            await client.ConnectAsync(data.IMAP.Host, data.IMAP.Port, true); // 通常使用 TLS 加密

            // 认证用户
            await client.AuthenticateAsync(data.From, data.Password);

            // 选择收件箱
            var inbox = client.Inbox;
            await inbox.OpenAsync(FolderAccess.ReadOnly);

            // 获取邮件数量
            int totalMessages = inbox.Count;
            // 确保开始位置不会小于1
            int start = Math.Max(totalMessages - 51); 
            int end = totalMessages;


            // 获取最新的10封邮件的信息
            var messages = inbox.Fetch(start, end, MessageSummaryItems.Envelope | MessageSummaryItems.UniqueId);

            // 遍历邮件信息并打印出来
            foreach (var summary in messages)
            {
                var uid = summary.UniqueId;
                var message = await inbox.GetMessageAsync(uid);
                Console.WriteLine($"Subject: {message.Subject}");
                Console.WriteLine($"From: {message.From}");
                Console.WriteLine($"To: {message.To}");
                Console.WriteLine($"Date: {message.Date}");
    Console.WriteLine($"HtmlBody: {message.HtmlBody}");
     Console.WriteLine($"TextBody: {message.TextBody}");
            }
            // 断开连接
            await client.DisconnectAsync(true);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"接收邮件失败:{ex.Message}");
    }
}

注意接受邮件时 message.Body 部分内容需要特殊的解析规则,比如附件部分、历史邮件部分。

测试邮件收发

使用时关键信息替换成自己的:

static async Task Main(string[] args)
{
    var data = new EmailData
    {
        From = "qqqqqq@qq.com",
        Password = "**********",
        To = "qqqqqq@qq.com",
        Subject = "来自 .NET Core 的测试邮件",
        TextBody = "这是纯文本消息内容。",
        HtmlBody = "<h1>这是HTML消息</h1><p>这封邮件是通过MailKit从 .NET Core 发送的。</p>",
        SMTP = new HostInfo()
        {
            Host = "smtp.qq.com",
            Port = 587
        },
        IMAP = new HostInfo()
        {
            Host = "imap.qq.com",
            Port = 993
        }

    };
    File.WriteAllText("file.txt""This is a test file.");
    await SendEmail(data);
    await GetEmail(data);
}

总结

MailKit在.NET 中提供了一个强大而灵活的接口来处理邮件收发操作。无论是通过SMTP发送邮件,还是通过IMAP/POP3接收邮件,MailKit都能轻松实现。

这个示例代码涵盖了最常见的邮件处理场景,并且可以直接复制使用。

在实际应用中,你可以根据需要扩展这些功能,例如处理附件、管理邮件文件夹、或实现更复杂的邮件过滤和处理逻辑。

作者:二次元攻城狮

出处:cnblogs.com/timefiles/p/18466070
声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!


该文章在 2024/11/6 10:19:45 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved