You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MailKit发送的邮件在服务器保存并显示于Roundcube?

问题:MailKit发送的邮件未显示在Roundcube的已发送文件夹中

我正在使用MailKit库开发一个简单的WPF应用来自动发送邮件。我租用了使用cPanel的主机来创建Roundcube邮箱,并使用该邮箱的信息进行连接、登录等操作。当我手动登录Roundcube时,发现测试发送的邮件并未出现在已发送文件夹中。我可以通过以下代码正常发送邮件:

public static async Task SendMail(BilletInfo info, string m)
{
    try
    {
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress(Server.Name, Server.Login));
        message.To.Add(new MailboxAddress(info.ClientName, info.Mail));
        message.Subject = MessageController.GetChargeTitle(info);

        var bodyBuilder = new BodyBuilder();
        bodyBuilder.TextBody = m;
        bodyBuilder.Attachments.Add(info.AttachmentPath);

        message.Body = bodyBuilder.ToMessageBody();

        using(var client = new MailKit.Net.Smtp.SmtpClient())
        {
            client.Connect(Server.ServerName, Server.SMTPPort, SecureSocketOptions.Auto);
            client.Authenticate(Server.Login, Server.Password);

            await client.SendAsync(message);
            client.Disconnect(true);
        }

    }
    catch (Exception ex)
    {
        MessageBoxController.ShowError($"{ex.Message}");
    }
}

但这些邮件并未显示在Roundcube客户端中。请问有没有办法让MailKit发送的邮件保存到服务器端,使其能在Roundcube客户端中显示?


解决方案

要让MailKit发送的邮件同步到Roundcube的已发送文件夹,需要在SMTP发送完成后,通过IMAP协议将邮件副本上传到服务器对应的文件夹。具体实现如下:

修改后的完整代码

public static async Task SendMail(BilletInfo info, string m)
{
    try
    {
        var message = new MimeMessage();
        message.From.Add(new MailboxAddress(Server.Name, Server.Login));
        message.To.Add(new MailboxAddress(info.ClientName, info.Mail));
        message.Subject = MessageController.GetChargeTitle(info);

        var bodyBuilder = new BodyBuilder();
        bodyBuilder.TextBody = m;
        bodyBuilder.Attachments.Add(info.AttachmentPath);

        message.Body = bodyBuilder.ToMessageBody();

        // 通过SMTP发送邮件
        using(var smtpClient = new MailKit.Net.Smtp.SmtpClient())
        {
            smtpClient.Connect(Server.ServerName, Server.SMTPPort, SecureSocketOptions.Auto);
            smtpClient.Authenticate(Server.Login, Server.Password);

            await smtpClient.SendAsync(message);
            smtpClient.Disconnect(true);
        }

        // 通过IMAP将邮件保存到已发送文件夹
        using(var imapClient = new MailKit.Net.Imap.ImapClient())
        {
            // 替换为你的IMAP服务器地址和端口(cPanel主机通常是993端口+SSL)
            imapClient.Connect(Server.IMAPServerName, Server.IMAPPort, SecureSocketOptions.Auto);
            imapClient.Authenticate(Server.Login, Server.Password);

            // 获取已发送文件夹:优先用SpecialFolder枚举,Roundcube默认对应"Sent"
            var sentFolder = imapClient.GetFolder(SpecialFolder.Sent);
            // 如果枚举无法匹配,改用名称查找(根据服务器实际文件夹名调整)
            // var sentFolder = imapClient.GetFolder("Sent");

            // 追加邮件到文件夹并标记为已读
            await sentFolder.AppendAsync(message, MessageFlags.Seen);
            imapClient.Disconnect(true);
        }

    }
    catch (Exception ex)
    {
        MessageBoxController.ShowError($"{ex.Message}");
    }
}

关键注意事项

  • 确认你的cPanel主机已开启IMAP服务,使用正确的IMAP服务器地址和端口(通常993为SSL加密端口,143为非加密端口)。
  • 如果SpecialFolder.Sent无法定位到文件夹,可以遍历所有个人文件夹确认名称:
foreach (var folder in imapClient.GetFolders(imapClient.PersonalNamespaces[0]))
{
    Console.WriteLine(folder.Name);
}

打印出所有文件夹名称后,替换为对应的已发送文件夹名称即可。

内容的提问来源于stack exchange,提问作者Enrisco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:30:19