Workato から SMTP でメールを送信する

# はじめに
Microsoft 365(Outlook) や Gmail であれば、Workatoの標準コネクターを使用して、API経由でメールを送信することができます。

2024年3月現在、SMTP を用いてメールを送る「SMTPコネクター」は、Workatoでは提供されておりません。メールゲートウェイ製品などを経由するなどの目的で、SMTP を用いてメールを送信したい場合はどうしたらよいのでしょうか？

# Python コネクターを使ってSMTPでメールを送信
答えは、Python コネクターを使います。Python には、[smtplib](https://docs.python.org/ja/3/library/smtplib.html) という SMTPプロトコルクライアント が標準ライブラリとして提供されています。

Workato の Python コネクターは、[公式ドキュメント](https://docs.workato.com/connectors/python.html#supported-features)によると Python 3.9以降となっているので、この smtplib も利用可能です。このライブラリを利用することで、**Workatoから SMTP を用いてメールを送信することが可能**となります。

# Python アクションの作成
### アクションの名前を設定

Pythonコネクターの Execute Code アクションを選択し、[Name] を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/595a53b5-f031-3f31-7a3b-91e80fd75828.png)


### アクションの入力項目を設定

メールの送信に必要な [Input fields] (入力項目)を追加します。
* SMTP Server (SMTPサーバーのアドレス)
* SMTP Port (SMTPサーバーのポート番号)
* SMTP User (SMTPサーバーの認証ユーザー)
* SMTP Password (SMTPサーバーの認証パスワード）
* To (送信先のメールアドレス)
* From (送信元のメールアドレス)
* Subject (メールのタイトル)
* Body (メールの本文)
* Attachment File Contents (添付ファイルのコンテンツ)
* Attachment File Name (添付ファイル名)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/d052b04d-e3dc-4575-10e5-d0c3fe55834b.png)

Box や オンプレミスなどから取得したファイルを、Attachment File Contents に指定することで、添付ファイルを渡すことも可能です。（画面の例は、Boxからダウンロードしたファイルを添付ファイルとして指定）

### Pythonコードを記述
入力項目を使って、メールを送るコードを記述します。

```python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders


def main(input):
    try:
        # SMTPサーバー設定
        smtp_server = input["smtp_server"]
        smtp_port = input["smtp_port"]
        smtp_user = input["smtp_user"]
        smtp_password = input["smtp_password"]

        # メール設定
        from_addr = input["from"]
        to_addr = input["to"]
        subject = input["subject"]
        body = input["body"]

        # メールメッセージの作成
        msg = MIMEMultipart()
        msg["From"] = from_addr
        msg["To"] = to_addr
        msg["Subject"] = subject

        # メール本文の追加
        msg.attach(MIMEText(body, "plain"))

        # 添付ファイルの追加
        if "attachment_file_contents" in input and "attachment_file_name" in input:
            attachment = MIMEBase("application", "octet-stream")
            attachment.set_payload(input["attachment_file_contents"])
            encoders.encode_base64(attachment)
            attachment.add_header(
                "Content-Disposition",
                "attachment",
                filename=input["attachment_file_name"],
            )
            msg.attach(attachment)

        # SMTPサーバーを通じてメール送信
        with smtplib.SMTP(smtp_server, smtp_port) as server:
            server.starttls()
            server.login(smtp_user, smtp_password)
            server.sendmail(from_addr, to_addr, msg.as_string())
            server.quit()

        print("メール送信完了")

    except Exception as e:
        # print(e)
        raise
```
上のコードでは、メールが正常に送信できた場合は、標準出力に「メール送信完了」と書き込んでいます。こうすることで、Workatoの Job の実行履歴上で、このステップが実行されたことを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/af7ce69f-62f8-ee38-ad50-8a4128861ffb.png)

また、上のコードでは例外が発生した場合、元の例外をそのまま上に投げることでアクションをエラー終了させています。この例外の内容は Jobの実行履歴から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/2f84b103-cd1d-77c8-c914-088d4d60d001.png)

もちろん、補足した例外を新しい Exception を作成して投げなおせば、任意のエラーメッセージを表示させることも可能です。

```python
        # （省略)...
        print("メール送信完了")

    except Exception as e:
        # print(e)
        raise Exception("メール送信に失敗しました", e)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/09952ce5-2565-7596-c531-145722733ddf.png)

# まとめ
まとめると、以下のようになります。

* SMTPでメールを送信する標準コネクタは提供されていない
* Pythonアクションを使うことで、SMTP でメールを送信可能


# おわりに
いかがでしょうか？ Pythonアクションを使用してデータ加工を行うユースケースは多いかと思いますが、SMTPサーバに接続するような通信処理も Pythonアクション内で行うことができます。このように、Pythonアクションを使うことで、「Workatoでできること」を広げることが可能です。


Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=c3790c6951668aa17420)へ是非ご相談ください。


# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=c3790c6951668aa17420)
* Workato 公式サイト
    * [Pythonコネクター](https://docs.workato.com/connectors/python.html)
* 本記事のサンプルレシピ
    * JPデータセンター利用者向け
        * [[Example] Send email via SMTP server with attachment file acquired from box](https://app.jp.workato.com/recipes/367538?st=5ae186ade3a339ff625662f8e7ada65216385d24176e8e4347d48f71b39f7dae)
    * USデータセンター利用者向け
        * [[Example] Send email via SMTP server with attachment file acquired from box](https://app.workato.com/recipes/45954153?st=44b75b2c42425c6652844c44cae8f50a1badfd94f7fcddb15754646ded20e9bf)