diff --git a/Wino.Core/Synchronizers/OutlookSynchronizer.cs b/Wino.Core/Synchronizers/OutlookSynchronizer.cs index 073c84b0..1fc533c7 100644 --- a/Wino.Core/Synchronizers/OutlookSynchronizer.cs +++ b/Wino.Core/Synchronizers/OutlookSynchronizer.cs @@ -520,6 +520,56 @@ namespace Wino.Core.Synchronizers }); } + public override IEnumerable> SendDraft(BatchSendDraftRequestRequest request) + { + var sendDraftPreparationRequest = request.Request; + + // 1. Delete draft + // 2. Create new Message with new MIME. + // 3. Make sure that conversation id is tagged correctly for replies. + + var mailCopyId = sendDraftPreparationRequest.MailItem.Id; + var mimeMessage = sendDraftPreparationRequest.Mime; + + var batchDeleteRequest = new BatchDeleteRequest(new List() + { + new DeleteRequest(sendDraftPreparationRequest.MailItem) + }); + + var deleteBundle = Delete(batchDeleteRequest).ElementAt(0); + + mimeMessage.Prepare(EncodingConstraint.None); + + var plainTextBytes = Encoding.UTF8.GetBytes(mimeMessage.ToString()); + var base64Encoded = Convert.ToBase64String(plainTextBytes); + + var outlookMessage = new Message() + { + ConversationId = sendDraftPreparationRequest.MailItem.ThreadId + }; + + // Apply importance here as well just in case. + if (mimeMessage.Importance != MessageImportance.Normal) + outlookMessage.Importance = mimeMessage.Importance == MessageImportance.High ? Importance.High : Importance.Low; + + var body = new Microsoft.Graph.Me.SendMail.SendMailPostRequestBody() + { + Message = outlookMessage + }; + + var sendRequest = _graphClient.Me.SendMail.ToPostRequestInformation(body); + + sendRequest.Headers.Clear(); + sendRequest.Headers.Add("Content-Type", "text/plain"); + + var stream = new MemoryStream(Encoding.UTF8.GetBytes(base64Encoded)); + sendRequest.SetStreamContent(stream, "text/plain"); + + var sendMailRequest = new HttpRequestBundle(sendRequest, request); + + return [deleteBundle, sendMailRequest]; + } + public override async Task DownloadMissingMimeMessageAsync(IMailItem mailItem, MailKit.ITransferProgress transferProgress = null, CancellationToken cancellationToken = default)