使用MailKit从Office365共享邮箱发信,已发送邮件存个人邮箱求助
解决Office 365共享邮箱发送邮件后保存到共享邮箱已发送的问题
你的代码使用SMTP协议发送邮件,由于认证的是个人账号,默认会将已发送邮件保存到个人邮箱的已发送文件夹。因为没有管理员权限,无法通过Exchange后台配置自动保存到共享邮箱,以下是两种可行的代码解决方案:
方法一:用MailKit的IMAP手动将邮件移至共享邮箱已发送
发送邮件后,通过IMAP连接到个人邮箱,将刚发送的邮件上传到共享邮箱的已发送文件夹,可选删除个人邮箱中的副本:
Dim contenutomail As New MimeKit.BodyBuilder Dim smtpclient As New MailKit.Net.Smtp.SmtpClient Dim mail As New MimeKit.MimeMessage ' 原发送邮件代码 smtpclient.Connect("smtp.office365.com", 587, MailKit.Security.SecureSocketOptions.StartTls) smtpclient.Authenticate("eurostar_italia@mycompany.com", "Aprile22") mail.From.Add(New MimeKit.MailboxAddress("", "customeroffice@mycompany.com")) mail.Subject = "你的邮件主题" ' 建议添加主题,方便后续查找 For i = 0 To mailinglist.Count - 1 mail.Bcc.Add(New MimeKit.MailboxAddress("", mailinglist(i).ToString)) Next contenutomail.TextBody = "" contenutomail.HtmlBody = "hello world" mail.Body = contenutomail.ToMessageBody smtpclient.Send(mail) smtpclient.Disconnect(True) ' 新增IMAP操作:将邮件保存到共享邮箱已发送 Using imapClient As New MailKit.Net.Imap.ImapClient() imapClient.Connect("outlook.office365.com", 993, MailKit.Security.SecureSocketOptions.SslOnConnect) imapClient.Authenticate("eurostar_italia@mycompany.com", "Aprile22") ' 获取共享邮箱根文件夹 Dim sharedMailboxRoot = imapClient.GetFolder("customeroffice@mycompany.com") ' 获取共享邮箱的已发送文件夹(中文环境用"已发送邮件",英文用"Sent Items") Dim sharedSentFolder = sharedMailboxRoot.GetSubfolder("已发送邮件") ' 上传邮件到共享邮箱已发送,标记为已读 sharedSentFolder.Append(mail, MailKit.MessageFlags.Seen) ' 可选:删除个人邮箱已发送中的副本 Dim personalSentFolder = imapClient.GetFolder(imapClient.PersonalNamespaces(0).GetSubfolder("已发送邮件")) ' 通过主题查找刚发送的邮件(可根据需求调整查询条件) Dim searchQuery = MailKit.Search.SearchQuery.SubjectEquals(mail.Subject) Dim matchedUids = personalSentFolder.Search(searchQuery) If matchedUids.Count > 0 Then personalSentFolder.AddFlags(matchedUids, MailKit.MessageFlags.Deleted, True) personalSentFolder.Expunge() End If imapClient.Disconnect(True) End Using
方法二:使用Exchange Web Services(EWS)直接发送并保存到共享邮箱
EWS是Office 365的原生API,可直接指定发送后保存的文件夹,无需手动移动:
首先需要通过NuGet安装Microsoft.Exchange.WebServices包,然后使用以下代码:
Imports Microsoft.Exchange.WebServices.Data ' 初始化EWS服务 Dim ewsService As New ExchangeService(ExchangeVersion.Exchange2013_SP1) ewsService.Credentials = New WebCredentials("eurostar_italia@mycompany.com", "Aprile22") ' 自动发现EWS地址 ewsService.AutodiscoverUrl("eurostar_italia@mycompany.com", AddressOf ValidateRedirectionUrl) ' 创建邮件 Dim emailMsg As New EmailMessage(ewsService) emailMsg.From = "customeroffice@mycompany.com" emailMsg.Subject = "你的邮件主题" emailMsg.Body = New MessageBody(BodyType.HTML, "hello world") ' 添加BCC收件人 For Each addr In mailinglist emailMsg.Bcc.Add(New EmailAddress(addr.ToString)) Next ' 指定共享邮箱的已发送文件夹作为保存位置 Dim sharedMailbox = New Mailbox("customeroffice@mycompany.com") Dim sharedSentFolderId = New FolderId(WellKnownFolderName.SentItems, sharedMailbox) ' 发送邮件并保存到指定文件夹 emailMsg.SendAndSaveCopy(sharedSentFolderId) ' 自动发现URL验证函数 Private Function ValidateRedirectionUrl(redirectionUrl As String) As Boolean ' 仅允许HTTPS地址,保证安全 Return redirectionUrl.ToLower().StartsWith("https://") End Function
注意事项
- 确保你的个人账号对共享邮箱的已发送文件夹有写入权限(通常使用共享邮箱发送的账号都会被授予该权限)
- IMAP方法中,共享邮箱的文件夹名称需匹配实际语言环境(中文用“已发送邮件”,英文用“Sent Items”)
- 不要硬编码密码,建议使用环境变量、密钥管理器等安全方式存储凭证
- EWS方法需要确保Office 365租户未禁用EWS访问(大部分默认是启用的)
内容的提问来源于stack exchange,提问作者fabio
相关产品推荐
相关产品推荐

