MailKit IMAP:邮件日期/大小获取错误及服务器邮件删除求助
VB.NET + MailKit 连接Outlook 365的两个问题解决指引
问题1:InternalDate和Size存入数据库值异常(32/64)
这种情况几乎都是赋值环节的错误,而非MailKit获取的数据本身有问题。大概率是你误将枚举常量(比如MessageFlags的某个值)或者类型标识赋值给了数据库字段,而非邮件的真实InternalDate和Size属性。
正确的取值与赋值示例:
' 遍历邮件时正确获取InternalDate和Size For Each msgSummary In inbox.Fetch(0, -1, MessageSummaryItems.InternalDate Or MessageSummaryItems.Size) ' 直接取邮件的真实属性值 Dim mailDate As DateTime = msgSummary.InternalDate Dim mailSize As Integer = msgSummary.Size ' 写入数据库时使用上述变量(以SqlCommand为例) cmd.Parameters.AddWithValue("@Inbox_TempDate", mailDate) cmd.Parameters.AddWithValue("@Inbox_Size", mailSize) ' 执行数据库写入操作... Next
同时检查数据库字段类型:Inbox_TempDate需设为datetime/datetime2类型,Inbox_Size设为int/bigint类型,避免因类型不匹配导致的隐式转换错误。
问题2:使用AddFlags标记删除邮件的正确语法
MailKit操作IMAP删除邮件需要两步:标记Deleted标记 + 执行Expunge(彻底删除),Outlook 365的IMAP完全支持此流程,VB.NET下的正确语法如下:
' 先收集要删除的邮件UniqueId集合(示例:获取所有已下载的邮件ID) Dim deleteIds As New List(Of UniqueId)() ' 此处填充deleteIds,比如从已下载记录中获取对应UniqueId... ' 标记邮件为Deleted状态(第三个参数True表示同步到服务器) inbox.AddFlags(deleteIds, MessageFlags.Deleted, True) ' 彻底删除已标记的邮件(如果省略参数,会删除所有标记为Deleted的邮件) inbox.Expunge(deleteIds)
补充说明:
- 若只标记
Deleted而不执行Expunge,Outlook 365会将邮件移至「已删除邮件」文件夹,不会从服务器彻底移除; - 确保你的IMAP账号拥有邮件删除权限;
- 批量操作时,
deleteIds必须是准确的邮件UniqueId集合,可通过Fetch或Search方法获取。
内容的提问来源于stack exchange,提问作者gchq
相关产品推荐
相关产品推荐

