如何让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
相关产品推荐
相关产品推荐

