EWS转Microsoft Graph:.NET Core 6邮件作为附件转发问题解决
将邮件作为附件转发:从EWS迁移到Microsoft Graph(.NET Core 6)
我正在将基于.NET Framework 4、使用Exchange Web Services(EWS)开发的Exchange邮件客户端升级为基于.NET Core 6、使用Microsoft Graph的版本。大部分功能已完成迁移,但在实现「将邮件作为附件转发」功能时遇到了困难。
EWS中的原有实现
// 此方法会调用EWS的GetItem接口。 var msgToAttach = EWS.EmailMessage.Bind( ServiceInstance, message.Source.Id, new EWS.PropertySet(EWS.ItemSchema.MimeContent, EWS.ItemSchema.Subject)); // 创建邮件并设置属性 var forward = new EWS.EmailMessage(ServiceInstance); if (!bodyType.HasValue) bodyType = message.BodyType; forward.Subject = subject == null ? $"FW: {message.Subject}" : subject; forward.Body = new EWS.MessageBody( bodyType.Value == BodyTypes.Html ? EWS.BodyType.HTML : EWS.BodyType.Text, body ?? "请参考附件中的邮件"); // 添加收件人 if (to?.Any() ?? false) forward.ToRecipients.AddRange(to); if (cc?.Any() ?? false) forward.CcRecipients.AddRange(cc); if (bcc?.Any() ?? false) forward.BccRecipients.AddRange(bcc); // 添加附件前需保存草稿,否则会抛出异常 forward.Save(); // 添加邮件作为项附件并设置属性 EWS.ItemAttachment<EWS.EmailMessage> itemAttachment = forward.Attachments.AddItemAttachment<EWS.EmailMessage>(); itemAttachment.Item.MimeContent = msgToAttach.MimeContent; itemAttachment.Name = msgToAttach.Subject; // 发送邮件并在已发送邮件中保存副本,此方法会调用EWS的CreateItem和SendItem接口 forward.Update(EWS.ConflictResolutionMode.AlwaysOverwrite); forward.Send();
解决方案:Microsoft Graph实现方式
关键要点:
- 通过
_serviceInstance.Users[UserId].Messages[message.Id].Content.GetAsync()读取目标邮件的MIME内容 - 返回的流需转换为字节数组作为附件内容
- 附件名称必须以
.eml结尾,否则Outlook无法识别为邮件(即使设置ContentType为message/rfc822也无效)
完整实现代码:
public void ForwardMessageAsAttachment( Message message, IEnumerable<string> to, string subject = null, string body = null, BodyType? bodyType = null) { // 下载指定邮件的MIME内容 var mimeContentStream = _serviceInstance .Users[UserId] .Messages[message.Id] .Content .Request() .GetAsync() .GetAwaiter() .GetResult(); // 将MIME内容流写入缓冲区 var buffer = new Span<Byte>(new byte[mimeContentStream.Length]); var mimeContent = mimeContentStream.Read(buffer); // 附件名称必须以.eml结尾,否则Outlook无法识别为邮件 // 即使设置contentType为message/rfc822也不行 var messageAsAttachment = new FileAttachment { ContentBytes = buffer.ToArray(), ContentType = "message/rfc822", Name = $"{message.Subject}.eml" }; // 创建新邮件 var forward = new Message() { Attachments = new MessageAttachmentsCollectionPage(), Subject = String.IsNullOrWhiteSpace(subject) ? subject : $"FW: {message.Subject}".Trim(), Body = new ItemBody { ContentType = bodyType, Content = body }, ToRecipients = to.Select(x => new Recipient { EmailAddress = new EmailAddress { Address = x } }) }; // 添加EML附件 forward.Attachments.Add(messageAsAttachment); _serviceInstance .Users[UserId] .SendMail(forward) .Request() .PostAsync() .GetAwaiter() .GetResult(); }
内容的提问来源于stack exchange,提问作者Rhett Leech
相关产品推荐
相关产品推荐

