如何在C#中通过SMTP将邮件发送至指定文件夹而非收件箱
解决思路与代码修改说明
首先要明确:SMTP协议仅负责将邮件发送到收件人的邮件服务器,无法直接指定收件方邮箱的存储文件夹——收件邮件的存储路径由收件方的邮件服务器或客户端规则决定。要实现目标,有两种可行方案:
方案1:发送后通过IMAP移动邮件到指定文件夹
发送邮件后,使用IMAP协议登录收件邮箱,将刚收到的邮件移动到目标自定义文件夹。推荐使用MailKit库(比原生System.Net.Mail更稳定且支持IMAP操作),步骤如下:
- 通过NuGet安装MailKit:
Install-Package MailKit - 修改代码如下:
using MailKit.Net.Smtp; using MailKit.Net.Imap; using MimeKit; using System; static string smtpAddress = "smtp.gmail.com"; static int smtpPort = 587; static bool enableSSL = true; static string senderEmail = "xxxxx"; static string senderPassword = "xxxxxxx"; static string receiverEmail = "xxxx@yyy.com"; static string subject = "Hello"; static string body = "Hello, This is Email sending test using gmail."; // 收件邮箱的目标文件夹名称 static string targetFolder = "自定义文件夹"; public static void SendEmailAndMoveToFolder() { // 1. 发送邮件 var message = new MimeMessage(); message.From.Add(new MailboxAddress("发件人", senderEmail)); message.To.Add(new MailboxAddress("收件人", receiverEmail)); message.Subject = subject; message.Body = new TextPart("html") { Text = body }; using (var smtpClient = new SmtpClient()) { smtpClient.Connect(smtpAddress, smtpPort, enableSSL); smtpClient.Authenticate(senderEmail, senderPassword); smtpClient.Send(message); smtpClient.Disconnect(true); } // 2. 登录收件邮箱,移动邮件到目标文件夹 using (var imapClient = new ImapClient()) { imapClient.Connect("imap.gmail.com", 993, true); imapClient.Authenticate(receiverEmail, "收件邮箱密码或应用专用密码"); // 打开收件箱 var inbox = imapClient.Inbox; inbox.Open(MailKit.FolderAccess.ReadWrite); // 筛选刚发送的邮件(可根据发件人、主题、发送时间调整条件) var query = SearchQuery.FromContains(senderEmail) .And(SearchQuery.SubjectContains(subject)) .And(SearchQuery.SentOn(DateTime.Today)); var targetUids = inbox.Search(query); // 获取或创建目标文件夹 var personalNamespace = imapClient.GetPersonalNamespaces()[0]; var targetFolderObj = imapClient.GetFolder(personalNamespace).GetSubfolder(targetFolder); targetFolderObj ??= imapClient.GetFolder(personalNamespace).CreateSubfolder(targetFolder); // 移动邮件到目标文件夹 inbox.MoveTo(targetUids, targetFolderObj); imapClient.Disconnect(true); } }
注意事项:
- 若使用Gmail,需先开启IMAP服务,且启用两步验证时需使用应用专用密码登录IMAP。
- 邮件筛选条件可根据实际场景调整,确保精准匹配目标邮件。
方案2:通过邮件标记让客户端自动过滤
无需修改发送逻辑,给邮件添加自定义头或关键字,再在收件方邮件客户端设置过滤规则:
- 给原生
MailMessage添加自定义标记头:
mail.Headers.Add("X-Custom-Tag", "指定文件夹标记");
- 在收件人邮箱(如Gmail)中设置过滤规则:包含该标记的邮件自动移动到指定文件夹。
这种方案更轻量,无需获取收件邮箱的IMAP操作权限。
内容的提问来源于stack exchange,提问作者senthil .k
相关产品推荐
相关产品推荐

