Azureでメールを送信してみる(Python編)

# Azureでメールを送信してみる(Python編)

## 事前準備

- [WindowsのHyper-VにUbuntu乗せてVSCodeだけでなんとかしたい](https://qiita.com/cactanaka/items/2f25078e86acd8d6434a)
- [Azureでメールを送信してみる(準備編)](https://qiita.com/cactanaka/items/151aafce3ef8fb5de6fe)

上の続きです。

## VMを起動しておく

ローカル側でHyper-Vマネージャーを起動します。
作成したVMを「起動」で起動しておきます。

## VisualStudioCode(VSC)で接続する

VSCを立ち上げます。
左下の><から「ホストへ接続する」を選択して接続先のVMを選択して接続します。

もしようこそ画面しか出ていなくてエクスプローラーがまっさらな場合は左側の一番上から「フォルダーを開く」を選択してホームディレクトリかなんかを開いておきます。

## スクリプトファイルの作成

まぁ、別にホームディレクトリでやってもいいですが念のためディレクトリを切り分けます。
VSC左側のエクスプローラーから「新しいフォルダ」で作成します。
(今回は azmail という名前で作っています。)

エクスプローラーで作成したディレクトリを選択し、「新しいファイル」を選択します。
(今回は azmail.py という名前で作成しています。)

## Azureからサンプルコードを持ってくる

Azureポータルにログインします。
「通信サービス」を選択し、作成したリソースを選択します。
「メール」の下に「メールを試す」があるのでそれを選択します。

「メールの送信元」と「送信者のメールユーザー名」をドロップダウンから選択します。
「受信者のメールアドレス」には受信可能なメールアドレスを設定します。

右側のサンプルコードに反映されたのが確認できると思います。
タブを「Python」に切り替えて、「接続文字列を挿入する」にチェックを入れます。

「接続文字列を選択する」の右側に「コピー」ボタンがあるので押します。
これでクリップボードにサンプルコードがコピーされるので、作成したファイルに貼り付けます。

## 実行する前に

このままで実行できそうな気配を見せておいて実は色々足りない状態です。

### pipのインストール

VSCの下側にコマンドプロンプトというかCLIというかがあると思います。
(ない人は「表示」から「ターミナル」で表示させてください。)
ターミナルの中は普通にSSHで接続した状態になっています。
とりあえずまずはpipをインストールします。

```
sudo apt install python3-pip
```

### Azure Communication Services Email SDK パッケージのインストール

[クイック スタート: Azure Communication Services を使用して電子メールを送信する方法](https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email?tabs=windows%2Cconnection-string%2Csend-email-and-get-status-async%2Csync-client&pivots=programming-language-python)

公式のドキュメントには書いてありますが、SDKをインストールしないと動きません。
ということでインストールします。

※ システム全体へのグローバルインストール用のコマンドです。venv使ってるとかの場合は公式のドキュメントの方のコマンドでやってください。

```
sudo pip install azure-communication-email --break-system-packages
```

## 試しに送ってみる

とりあえずスクリプトのあるディレクトリに移動します。

```
cd ~/azmail
```

実行権限つけときましょう。

```
chmod 755 azmail.py
```

おくりまーす

```
python3 azmail.py
```

### やっぱりサンプル壊れとるやんけ

```
  File "/home/puipui/azmail/azmail.py", line 5
    connection_string = ""endpoint=https://<puipui>.japan.communication.azure.com/;accesskey=<puipui>""
                                                                                                    ^
SyntaxError: invalid decimal literal
```

なんとなくそうかなーとは思ってましたが、まぁ変ですよね。

```
"" なんでここに文字列？ ""
"ここに文字列だよね"
```
ということで直します

```python
# connection_string = ""endpoint=https://<puipui>.japan.communication.azure.com/;accesskey=<puipui>""
connection_string = "endpoint=https://<puipui>.japan.communication.azure.com/;accesskey=<puipui>"
```

気を取り直して再送

```
$ python3 azmail.py
'dict' object has no attribute 'message_id'
```

ヴぉーん？
オブジェクトの中にmessage_idなんか無いぞって言ってますね。

コードでいうと28行目のこれですね。

```
        print("Message sent: ", result.message_id)
```

ドキュメント読むのもめんどいのでそのままダンプしてみてみます。

```
        print(result)
        print("Message sent: ", result.message_id)
```

ちょっと通りますよっと。

```
$ python3 azmail.py
{'id': 'puipui-pui-pui-pui-puipui', 'status': 'Succeeded', 'error': None}
'dict' object has no attribute 'message_id'
```

message_idじゃなくてidに変わってるみたいですね。
(というかPythonってドットアクセスできるんだっけ？[公式](https://docs.python.org/3/library/stdtypes.html#typesmapping)みてもそれっぽいの無いような。。。)

ということでとりあえず直しておきます。

```python
        # print("Message sent: ", result.message_id)
        print("Message sent: ", result['id'])
```

気を取り直して送信しましょう。

```
$ python3 azmail.py
{'id': 'puipui-pui-pui-pui-puipui', 'status': 'Succeeded', 'error': None}
Message sent:  puipui-pui-pui-pui-puipui
```

### ということで修正したサンプルコード

```python
from azure.communication.email import EmailClient

def main():
    try:
        connection_string = "endpoint=https://<puipui>.japan.communication.azure.com/;accesskey=<puipui>"
        client = EmailClient.from_connection_string(connection_string)

        message = {
            "senderAddress": "okuri-puipui@localhost",
            "recipients": {
                "to": [{"address": "jusin-puipui@localhost"}]
            },
            "content": {
                "subject": "テスト メール",
                "plainText": "メールで Hello World。",
                "html": """
				<html>
					<body>
						<h1>メールで Hello World。</h1>
					</body>
				</html>"""
            },
        }

        poller = client.begin_send(message)
        result = poller.result()
        print("Message sent: ", result['id'])

    except Exception as ex:
        print(ex)

main()
```

### メールが届かない場合

どっかに書いたと思いますが、たぶんメールプロバイダーが弾いています。
gmailとかoutlookなら届くのでそっちに送ってみましょう。