Basic認証を回避してメールを送信できるようにプロキシを作成してみた

# 目的
Microsoft Outlookのメールアカウントで、OAuth 2.0を使用してSMTP/IMAP/POPのプロキシサーバを構築し、BizRobo!から安全にメール操作できるようにします。
なお、Microsoft による「SMTP AUTHの基本認証の完全廃止」が2025年9月に予定されているため、これに対応するOAuth 2.0認証方式の導入が必要になります。

# 使用ツール
Email OAuth 2.0 Proxy
Microsoft Azure ポータル（アプリ登録）
Python（pywebview ライブラリなど）

# 構築手順
⚠️MCサーバとRSサーバを別建てにしている場合は、RSサーバに構築してください。

## Azureアプリの作成
1. **Azureポータルでアプリ登録**
    Azureポータルにログイン → 「アプリの登録」へ  
    「新規登録」  
    名前: 任意（例: メール送信_プロキシ）  
    アカウント種別: この組織のディレクトリのみに含まれるアカウント  
    リダイレクト URI: http://localhost  
    
    作成後に表示される以下をメモ：  
    アプリケーション (クライアント) ID → client_id  
    ディレクトリ (テナント) ID → tenant_id
　　　
2. **APIアクセスの構成（APIアクセス許可）**
    「API のアクセス許可」 > 「許可の追加」
    「Microsoft Graph」または「Outlook」関連API
    下記スコープを追加（すべて「委任されたアクセス許可」）

    IMAP.AccessAsUser.All
    POP.AccessAsUser.All
    SMTP.Send
    offline_access

    「管理者の同意を与える」ボタンをクリック
　
3. **クライアントシークレット作成**
    「証明書とシークレット」→ 「新しいクライアントシークレット」
    シークレット値をコピーして控えておく（client_secret）

## Pythonのインストール

1. **以下の公式ページにアクセス**
    https://www.python.org/downloads/windows/
　　　
2. **最新の Windows installer (64-bit) をダウンロード**
　
3. **インストーラー起動時に以下を必ずチェック**
    「Add Python.exe to PATH」にチェックを入れる
    次に「Install Now」を選択
　　　
4. **インストール完了後、コマンドプロンプトを再起動し、python --version で動作確認**



## プロキシの設定
①**プロキシの本体コードをダウンロード**
GitHub にアクセス
URL: https://github.com/simonrob/email-oauth2-proxy
    
緑の「Code」ボタン → 「Download ZIP」
　→ ダウンロード後、ZIPを解凍（例: C:\emailproxy\）

②**必要な Python パッケージのインストール**
    解凍したフォルダに移動し、以下のコマンドを実行
```bash
cd C:\emailproxy
pip install -r requirements-core.txt -r requirements-gui.txt
```

> ⚠️以下のようなエラーが出た場合はpipをupgradeしてください。
    
```bash
    C:\emailproxy>pip install -r requirements.txt
    
    [notice] A new release of pip is available: 25.0.1 -> 25.1.1
    [notice] To update, run: python.exe -m pip install --upgrade pip
    ERROR: Could not open requirements file: [Errno 2] No such file or directory: 'requirements.txt'
```
　
③**emailproxy.config を修正**
    アカウントの設定を以下のように修正してください。
    ※Outlookの設定以外不要であれば他のアカウント設定は削除しても構いません。
    
```
    [利用するメールアドレス(例：xxx@xxx.co.jp)]
    permission_url = https://login.microsoftonline.com/<テナントID>/oauth2/v2.0/authorize
    token_url = https://login.microsoftonline.com/<テナントID>/oauth2/v2.0/token
    oauth2_scope = https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access
    redirect_uri = http://localhost
    client_id = <アプリのクライアントID>
    client_secret = <クライアントシークレット>
```
 > ⚠️<テナントID>には「common」ではなく実際のテナントIDを指定。
    common だと AADSTS50194 エラーが発生します。

　
④**Proxyサーバ起動**
以下のコマンドでPythonを起動します。
 
```
python emailproxy.py --config emailproxy.config
```
    
ローカルでIMAP/POP/SMTPのプロキシが起動（例: 127.0.0.1:1587）

## 認証をする
1. **MCのSMTPの設定を変更する**
    下記のように設定します。
    ユーザー名はconfigファイルに設定したアカウントをご利用ください。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/d5c2b677-50db-4953-9e1a-6c9f944f1e53.png)
　
2. **MCからエラー通知を出す**
    認証するために実際にMCからエラー通知を出します。
    ロボットエラーが起きるロボットをMCから実行してください。
　
3. **認証**
    プロキシサーバーが起動していればアイコンが表示されますので、右クリックから該当の箇所をクリックするとアクセスしてきたユーザーが表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/d0724a3b-be5c-46d0-900f-e5769fec0f1d.png)
    
    このユーザーを選択するとMicrosoftの認証画面が表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124412/52bba6b0-7819-423d-a15c-119b7e26522b.png)

    認証が成功すれば、再度MCからエラー通知を出すとメールが届くようになります。

## サービス登録
PC起動時に自動でEmail OAuth2.0 Proxyを起動できるようにサービスに登録します、
また、手動でコマンドを実行しなくても常時バックグラウンドで稼働できるようになります。

①**nssmのダウンロードと展開**
公式サイトから nssm をダウンロード
https://nssm.cc/download

ZIPを解凍し、nssm.exe を任意のフォルダ（例：C:\nssm\nssm.exe）に配置

②**サービスの作成**
管理者権限のコマンドプロンプトで以下を実行：
```
C:\nssm\nssm.exe install EmailProxyService
```
するとGUIが表示されるので、以下のように入力：

Peth:
C:\Users\Administrator\AppData\Local\Programs\Python\Python313\python.exe

Arguments:
C:\emailproxy\emailproxy.py

Startup directory:
C:\emailproxy

「Install Service」をクリック

③**サービスの起動**
以下のコマンドでサービス起動：
```
net start EmailProxyService
```
※ 正常に起動すれば、ブラウザなしでもメールクライアントから接続できます。


**サービスの停止・削除（必要に応じて）**
net stop EmailProxyService
nssm remove EmailProxyService confirm

# まとめ
Basic認証廃止で様々なサービスに影響が出ていると思います。
BizRobo!も同様でシステム改修に時間を要することが想定されます。
９月までに間に合えばいいですが、間に合わない場合にメール通知がこないと運用上問題となるケースが多いと思いますので本記事を参考にしていただければ幸いです。