1515using Google . Apis . Auth . OAuth2 . Responses ;
1616using Google . Apis . Gmail . v1 ;
1717using Google . Apis . Gmail . v1 . Data ;
18+ using Google . Apis . Requests ;
1819using Google . Apis . Services ;
1920using Google . Apis . Util . Store ;
2021using Microsoft . Bot . Solutions . Data ;
@@ -31,7 +32,7 @@ namespace EmailSkill
3132 public class GMailService : IMailService
3233 {
3334 private static GmailService service ;
34- private int pageSize ;
35+ private readonly int pageSize ;
3536 private string pageToken = string . Empty ;
3637
3738 /// <summary>
@@ -75,6 +76,49 @@ public static GmailService GetServiceClient(GoogleClient config, string token)
7576 return service ;
7677 }
7778
79+ public static string Base64UrlEncode ( string text )
80+ {
81+ var textBytes = Encoding . UTF8 . GetBytes ( text ) ;
82+
83+ var result = System . Convert . ToBase64String ( textBytes ) ;
84+ result = result . Split ( '=' ) [ 0 ] ; // Remove any trailing '='s
85+ result = result . Replace ( '+' , '-' ) ; // 62nd char of encoding
86+ result = result . Replace ( '/' , '_' ) ; // 63rd char of encoding
87+ return result ;
88+ }
89+
90+ // decode from base64url to utf-8 bytes
91+ public static byte [ ] Base64UrlDecode ( string text )
92+ {
93+ string result = text ;
94+ result = result . Replace ( '-' , '+' ) ; // 62nd char of encoding
95+ result = result . Replace ( '_' , '/' ) ; // 63rd char of encoding
96+
97+ // Pad with trailing '='s
98+ switch ( result . Length % 4 )
99+ {
100+ case 0 : break ; // No pad chars in this case
101+ case 2 : result += "==" ; break ; // Two pad chars
102+ case 3 : result += "=" ; break ; // One pad char
103+ default :
104+ throw new System . Exception (
105+ "Illegal base64url string!" ) ;
106+ }
107+
108+ byte [ ] textBytes = Convert . FromBase64String ( result ) ;
109+ return textBytes ;
110+ }
111+
112+ // decode to mimeMessage
113+ public static MimeMessage DecodeToMessage ( string text )
114+ {
115+ byte [ ] msg = Base64UrlDecode ( text ) ;
116+ MemoryStream mm = new MemoryStream ( msg ) ;
117+ MimeKit . MimeMessage mime = MimeKit . MimeMessage . Load ( mm ) ;
118+ return mime ;
119+ }
120+
121+ /// <inheritdoc/>
78122 public async Task ForwardMessageAsync ( string id , string content , List < Recipient > recipients )
79123 {
80124 try
@@ -131,28 +175,33 @@ public async Task ForwardMessageAsync(string id, string content, List<Recipient>
131175 content = quoted . ToString ( ) ;
132176 }
133177
134- await service . Users . Messages . Send (
178+ var sendRequest = service . Users . Messages . Send (
135179 new GmailMessage ( )
136180 {
137181 Raw = Base64UrlEncode ( forward . ToString ( ) + content ) ,
138182 ThreadId = threadId ,
139- } , "me" ) . ExecuteAsync ( ) ;
183+ } , "me" ) ;
184+ await ( ( IClientServiceRequest < GmailMessage > ) sendRequest ) . ExecuteAsync ( ) ;
140185 }
141186 catch ( GoogleApiException ex )
142187 {
143188 throw GoogleClient . HandleGoogleAPIException ( ex ) ;
144189 }
145- }
190+ }
146191
147- public async Task SendMessageAsync ( string content , string subject , List < Recipient > recipients )
192+ public async Task SendMessageAsync ( string content , string subject , List < Recipient > recipients )
148193 {
149194 try
150195 {
151196 // get from address
152- var user = service . Users . GetProfile ( "me" ) . Execute ( ) ;
153- var mess = new MailMessage ( ) ;
154- mess . Subject = subject ;
155- mess . From = new MailAddress ( user . EmailAddress ) ;
197+ var profileRequest = service . Users . GetProfile ( "me" ) ;
198+ var user = ( ( IClientServiceRequest < Profile > ) profileRequest ) . Execute ( ) ;
199+ var mess = new MailMessage
200+ {
201+ Subject = subject ,
202+ From = new MailAddress ( user . EmailAddress )
203+ } ;
204+
156205 foreach ( var re in recipients )
157206 {
158207 mess . To . Add ( new MailAddress ( re . EmailAddress . Address ) ) ;
@@ -164,11 +213,12 @@ public async Task SendMessageAsync(string content, string subject, List<Recipien
164213 mess . AlternateViews . Add ( adds ) ;
165214
166215 var mime = MimeMessage . CreateFromMailMessage ( mess ) ;
167- await service . Users . Messages . Send (
216+ var sendRequest = service . Users . Messages . Send (
168217 new GmailMessage ( )
169- {
170- Raw = Base64UrlEncode ( mime . ToString ( ) ) ,
171- } , "me" ) . ExecuteAsync ( ) ;
218+ {
219+ Raw = Base64UrlEncode ( mime . ToString ( ) ) ,
220+ } , "me" ) ;
221+ await ( ( IClientServiceRequest < GmailMessage > ) sendRequest ) . ExecuteAsync ( ) ;
172222 }
173223 catch ( GoogleApiException ex )
174224 {
@@ -238,12 +288,13 @@ public async Task<List<MSMessage>> ReplyToMessageAsync(string id, string content
238288 content = quoted . ToString ( ) ;
239289 }
240290
241- await service . Users . Messages . Send (
242- new GmailMessage ( )
291+ var sendRequest = service . Users . Messages . Send (
292+ new GmailMessage ( )
243293 {
244294 Raw = Base64UrlEncode ( reply . ToString ( ) + content ) ,
245295 ThreadId = threadId ,
246- } , "me" ) . ExecuteAsync ( ) ;
296+ } , "me" ) ;
297+ await ( ( IClientServiceRequest < GmailMessage > ) sendRequest ) . ExecuteAsync ( ) ;
247298 return null ;
248299 }
249300 catch ( GoogleApiException ex )
@@ -256,7 +307,8 @@ public async Task<List<MSMessage>> GetMyMessagesAsync(DateTime fromTime, DateTim
256307 {
257308 try
258309 {
259- var user = service . Users . GetProfile ( "me" ) . Execute ( ) ;
310+ var profileRequest = service . Users . GetProfile ( "me" ) ;
311+ var user = ( ( IClientServiceRequest < Profile > ) profileRequest ) . Execute ( ) ;
260312 var userAddress = user . EmailAddress ;
261313
262314 string searchOperation = string . Empty ;
@@ -302,7 +354,7 @@ public async Task<List<MSMessage>> GetMyMessagesAsync(DateTime fromTime, DateTim
302354 var tempReq = service . Users . Messages . List ( "me" ) ;
303355 tempReq . MaxResults = skip ;
304356 tempReq . Q = searchOperation ;
305- var tempRes = tempReq . Execute ( ) ;
357+ var tempRes = ( ( IClientServiceRequest < ListMessagesResponse > ) tempReq ) . Execute ( ) ;
306358 if ( tempRes . NextPageToken != null && tempRes . NextPageToken != string . Empty )
307359 {
308360 this . pageToken = tempRes . NextPageToken ;
@@ -316,8 +368,8 @@ public async Task<List<MSMessage>> GetMyMessagesAsync(DateTime fromTime, DateTim
316368 request . PageToken = this . pageToken ;
317369 }
318370
319- ListMessagesResponse response = await request . ExecuteAsync ( ) ;
320- List < MSMessage > result = new List < MSMessage > ( ) ;
371+ var response = await ( ( IClientServiceRequest < ListMessagesResponse > ) request ) . ExecuteAsync ( ) ;
372+ var result = new List < MSMessage > ( ) ;
321373
322374 // response.Messages only have id and threadID
323375 if ( response . Messages != null )
@@ -326,7 +378,7 @@ public async Task<List<MSMessage>> GetMyMessagesAsync(DateTime fromTime, DateTim
326378 {
327379 var req = service . Users . Messages . Get ( "me" , temp . Id ) ;
328380 req . Format = UsersResource . MessagesResource . GetRequest . FormatEnum . Raw ;
329- return req . ExecuteAsync ( ) ;
381+ return ( ( IClientServiceRequest < GmailMessage > ) req ) . ExecuteAsync ( ) ;
330382 } ) ) ;
331383 if ( messages != null && messages . Length > 0 )
332384 {
@@ -379,46 +431,21 @@ public string AppendFilterString(string old, string filterString)
379431 return result ;
380432 }
381433
382- private static string Base64UrlEncode ( string text )
383- {
384- var textBytes = Encoding . UTF8 . GetBytes ( text ) ;
385- return System . Convert . ToBase64String ( textBytes )
386- . Replace ( '+' , '-' )
387- . Replace ( '/' , '_' )
388- . Replace ( "=" , string . Empty ) ;
389- }
390-
391- // decode from base64url to utf-8 bytes
392- private static byte [ ] Base64UrlDecode ( string text )
393- {
394- var temp = text . Replace ( '-' , '+' )
395- . Replace ( '_' , '/' ) ;
396- byte [ ] textBytes = Convert . FromBase64String ( temp ) ;
397- return textBytes ; // Encoding.UTF8.GetString(textBytes);
398- }
399-
400- // decode to mimeMessage
401- private static MimeMessage DecodeToMessage ( string text )
402- {
403- byte [ ] msg = Base64UrlDecode ( text ) ;
404- MemoryStream mm = new MemoryStream ( msg ) ;
405- MimeKit . MimeMessage mime = MimeKit . MimeMessage . Load ( mm ) ;
406- return mime ;
407- }
408-
409434 private async Task < ( MimeMessage , string ) > GetMessageById ( string id )
410435 {
411436 var request = service . Users . Messages . Get ( "me" , id ) ;
412437 request . Format = UsersResource . MessagesResource . GetRequest . FormatEnum . Raw ;
413- var response = await request . ExecuteAsync ( ) ;
438+ var response = await ( ( IClientServiceRequest < GmailMessage > ) request ) . ExecuteAsync ( ) ;
414439 var mime = DecodeToMessage ( response . Raw ) ;
415440 return ( mime , response . ThreadId ) ;
416441 }
417442
418443 private MSMessage MapMimeMessageToMSMessage ( MimeMessage mime )
419444 {
420- MSMessage message = new MSMessage ( ) ;
421- message . ReceivedDateTime = mime . Date ;
445+ MSMessage message = new MSMessage
446+ {
447+ ReceivedDateTime = mime . Date
448+ } ;
422449 if ( mime . To != null )
423450 {
424451 var to = new List < Recipient > ( ) ;
0 commit comments