Graph APIメール送信タイムアウトのエラーの解消：12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR

Graph APIのメール送信を開発時（c#）、下記のエラーが出ました。

「Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'」
調べた結果は、パソコン端末のプロキシの原因になります。(WinHTTPの設定)
IEのインターネットオプションのプロキシ設定はWebブラウザでインターネットを利用する時に利用されます。
しかし、Windows Update等、システムが利用するプロキシ設定はWinHTTPという設定を利用します。
WinHTTPはGUIでは設定出来ないため、netshコマンドで設定します。

# エラー内容
```
Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'
Status Code: 0
Microsoft.Graph.ServiceException: Code: generalException
Message: An error occurred sending the request.
---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: Error 12002 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, '処理がタイムアウトになりました'.
   場所 System.Threading.Tasks.RendezvousAwaitable`1.GetResult()
   場所 System.Net.Http.WinHttpHandler.<StartRequestAsync>d__122.MoveNext()
   --- 内部例外スタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.RedirectHandler.<SendAsync>d__6.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.RetryHandler.<SendAsync>d__9.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.CompressionHandler.<SendAsync>d__2.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.AuthenticationHandler.<SendAsync>d__16.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.HttpProvider.<SendRequestAsync>d__19.MoveNext()
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.Graph.HttpProvider.<SendRequestAsync>d__19.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.HttpProvider.<SendAsync>d__18.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.BaseRequest.<SendRequestAsync>d__40.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Microsoft.Graph.BaseRequest.<SendAsync>d__33.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.GetResult()
   場所 SmartWorksBatch.Program.<Main>d__7.MoveNext() 場所 Ctest\test\Program.cs:行 382

```

# コマンドプロントでエラー対応方法
1.現在の設定の確認
```
netsh winhttp show proxy
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/97389703-ed44-0fca-d7cd-e51a9beb070b.png)

2.IE設定のインポート
```
netsh winhttp import proxy source=ie
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/cb1a5766-d351-0111-5f3c-ee577d277080.png)


上記の二つ対応で、問題なくGraph APIメール送信ができました！


# ソース側のエラーの解消

①プログラム側でWinHTTPのプロキシ設定する場合 ：
```
//プロキシを設定する 
string[] bypass = new string[] { "*.test.co.jp", ";*.test.co.jp" }; 
string proxyAdress = "http://proxy.test.co.jp:8080"; 
var winHttpProxy = new WebProxy(proxyAdress, false, bypass); 

HttpClient httpClient = GraphClientFactory.Create(authProvider,proxy:winHttpProxy); 
var graphClient = new GraphServiceClient(httpClient);

```

②プログラム側でインターネットオプションのWinHTTPプロキシ設定と同じものを利用する場合 ：
```
//IEのWinHTTPのプロキシ設定をインポート
var winHttpProxy = WebRequest.GetSystemWebProxy(); 

HttpClient httpClient = GraphClientFactory.Create(authProvider, proxy:winHttpProxy); 
var graphClient = new GraphServiceClient(httpClient);

```

# 参考サイト
https://lig-log.com/configure-winhttp-proxy/