From f7054b8230e43854da50d4157a2b342154afe62c Mon Sep 17 00:00:00 2001 From: Ben Olden-Cooligan Date: Sat, 6 Jul 2024 12:55:37 -0700 Subject: [PATCH] Oauth: Implement autosend for Outlook Web --- .../ImportExport/Email/Oauth/OauthProvider.cs | 6 ++++++ .../Email/Oauth/OutlookWebEmailProvider.cs | 14 +++++++++++--- .../Email/Oauth/OutlookWebOauthProvider.cs | 13 +++++++++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/NAPS2.Lib/ImportExport/Email/Oauth/OauthProvider.cs b/NAPS2.Lib/ImportExport/Email/Oauth/OauthProvider.cs index 93170e25b..5fe7f552b 100644 --- a/NAPS2.Lib/ImportExport/Email/Oauth/OauthProvider.cs +++ b/NAPS2.Lib/ImportExport/Email/Oauth/OauthProvider.cs @@ -169,6 +169,12 @@ public abstract class OauthProvider return JObject.Parse(response); } + protected async Task PostAuthorizedNoResponse(string url) + { + using var client = AuthorizedClient(); + await client.UploadStringTaskAsync(url, "POST", ""); + } + private WebClient AuthorizedClient() { var client = new WebClient(); diff --git a/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebEmailProvider.cs b/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebEmailProvider.cs index 23c47b924..123bc2ffb 100644 --- a/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebEmailProvider.cs +++ b/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebEmailProvider.cs @@ -31,10 +31,18 @@ internal class OutlookWebEmailProvider : IEmailProvider ["contentBytes"] = Convert.ToBase64String(File.ReadAllBytes(attachment.FilePath)) })) }; - var respUrl = await _outlookWebOauthProvider.UploadDraft(messageObj.ToString(), progress); + var draft = await _outlookWebOauthProvider.UploadDraft(messageObj.ToString(), progress); - // Open the draft in the user's browser - ProcessHelper.OpenUrl(respUrl + "&ispopout=0"); + + if (emailMessage.AutoSend) + { + await _outlookWebOauthProvider.SendDraft(draft.MessageId); + } + else + { + // Open the draft in the user's browser + ProcessHelper.OpenUrl(draft.WebLink + "&ispopout=0"); + } return true; } diff --git a/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebOauthProvider.cs b/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebOauthProvider.cs index c3bebf1fc..296ca2f0c 100644 --- a/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebOauthProvider.cs +++ b/NAPS2.Lib/ImportExport/Email/Oauth/OutlookWebOauthProvider.cs @@ -67,11 +67,20 @@ public class OutlookWebOauthProvider : OauthProvider return resp.Value("mail") ?? throw new InvalidOperationException("Could not get Id from Outlook profile response"); } - public async Task UploadDraft(string messageRaw, ProgressHandler progress = default) + public async Task UploadDraft(string messageRaw, ProgressHandler progress = default) { var resp = await PostAuthorized("https://graph.microsoft.com/v1.0/me/messages", messageRaw, "application/json", progress); - return resp.Value("webLink") ?? throw new InvalidOperationException("Could not get WebLink from Outlook messages response"); + var webLink = resp.Value("webLink") ?? throw new InvalidOperationException("Could not get WebLink from Outlook messages response"); + var messageId = resp.Value("id") ?? throw new InvalidOperationException("Could not get ID from Outlook messages response"); + return new DraftInfo(webLink, messageId); } + public async Task SendDraft(string draftMessageId) + { + await PostAuthorizedNoResponse($"https://graph.microsoft.com/v1.0/me/messages/{draftMessageId}/send"); + } + + public record DraftInfo(string WebLink, string MessageId); + #endregion } \ No newline at end of file