首页 > 编程语言 >C#使用 MailKit 收发邮件

C#使用 MailKit 收发邮件

时间:2024-10-15 09:10:47浏览次数:7  
标签:MailKit get C# await 收发 服务器 message data 邮件

目录

获取QQ邮箱授权码

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

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

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

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

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

安装 MailKit

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

dotnet add package MailKit

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

配置邮件服务器信息

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

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

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

实现邮件收发方法

邮件收发方法如下,这里只接收最新的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;

        // 设置正文
        message.Body = new BodyBuilder
        {
            TextBody = data.TextBody,
            HtmlBody = data.HtmlBody
        }.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 - 5, 1); 
            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}");
            }
            // 断开连接
            await client.DisconnectAsync(true);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"接收邮件失败:{ex.Message}");
    }
}

注意接受邮件时 message.Body 部分的内容需要特殊的解析规则,不能直接打印 ToString() 方法。

测试邮件收发

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

static async Task Main(string[] args)
{
    var data = new EmailData
    {
        From = "[email protected]",
        Password = "**********",
        To = "[email protected]",
        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
        }

    };

    await SendEmail(data);
    await GetEmail(data);
}

参考文章

标签:MailKit,get,C#,await,收发,服务器,message,data,邮件
From: https://www.cnblogs.com/timefiles/p/18466070

相关文章

  • 错误:1001 SQLSTATE: HY000 (ER_NISAMCHK)
    遇到 SQLSTATE:HY000(ER_NISAMCHK) 错误通常表示MySQL在处理某些操作时出现了内部错误。这个错误代码并不常见,但通常与数据文件或表结构的完整性有关。以下是可能的原因及解决步骤:数据文件损坏数据文件可能已经损坏,导致MySQL无法正确读取或处理数据。表结构问题......
  • GESP2024年6月认证C++四级( 第三部分编程题(1))
    参考程序代码:#include<bits/stdc++.h>usingnamespacestd;constintN=55;intw[N][N];intn,m;boolcheck(intxa,intya,intxb,intyb){ inta[2]={0,0}; for(inti=xa;i<=xb;i++) { for(intj=ya;j<=yb;j++) { a[w[1][j]]++; } } returna[0......
  • 【C语言】sizeof
    tmp_buf=(char*)malloc(size)不可以直接使用`sizeof`来查看动态分配内存的大小。在C语言中,`sizeof`操作符是在编译时确定类型或对象的大小,并不能用于动态获取malloc分配的内存大小。下面解释为什么不能用`sizeof(tmp_buf)`查看动态分配的内存大小:1.编译时vs运行时:siz......
  • 实战篇:(二)React 创建项目并连接 MySQL 后台的实战教程
    React创建项目并连接MySQL后台的实战教程一、项目概述本篇博客将介绍如何使用React搭建前端项目,并通过Node.js和MySQL实现简单的后台数据连接。通过这个项目,你将掌握从前端到后端数据库的基础开发流程,适合初学者或正在项目实战中的开发者。二、项目准备1.环境......
  • 【愚公系列】《AIGC辅助软件开发》042-AI辅助提升程序员求职、招聘与面试效率:用 ChatG
    标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度......
  • 【愚公系列】《AIGC辅助软件开发》043-AI辅助提升程序员求职、招聘与面试效率:用ChatGP
    标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度......
  • CVPR-2024-卫星遥感图像相关论文 16篇
    CVPR-2024-卫星遥感图像相关论文16篇GeoChat:GroundedLargeVision-LanguageModelforRemoteSensing文章解读:http://www.studyai.com/xueshu/paper/detail/00ffce4794文章链接:(https://openaccess.thecvf.com/content/CVPR2024/html/Kuckreja_GeoChat_Grounde......
  • PCL 渐进式形态学滤波
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介如果不太了解点云数学形态学的基本理论,可以先阅读这篇文章:https://blog.csdn.net/dayuhaitang1/article/details/123172437。形态学中的窗口结构一直存在着这样的问题:如果窗口结构元尺寸过小,则无法去......
  • Manacher 学习笔记
    Manacher,又名马拉车算法,是一种能在\(O(n)\)的时间复杂度之内求出一个字符串的最长回文字串的巧妙算法,其与exKMP有一点相似之处Part1:实现步骤step1:改造字符串首先,我们要对字符串进行改造因为在原字符串中会有奇回文串和偶回文串,要分两种情况,不好处理,所以我们要改造......
  • uwsig 随系统启动 (centos)
    uwsig随系统启动(centos) uwsig随系统启动(centos)要在CentOS系统中让uWSGI随系统启动,你可以创建一个系统服务单元文件。以下是一个基本的uWSGI服务文件示例:首先,找到你的uWSGI配置文件(通常是.ini文件)的位置。创建一个新的服务单元文件,例如/usr/lib/systemd/system/uwsgi.ser......