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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:48:14