Customers Mail Cloudで送信するコマンドcmc.shで添付ファイルに対応しました

Customers Mail CloudではSMTPを使ったメール送信のほか、Web APIを使ったメール送信が可能です。これまでNode.js、Ruby、Pythonなど各種言語で実装したライブラリを紹介してきましたが、今回はちょっと変わったところでシェルスクリプトを使ってみました。以前はテキストメールのみでしたが、今回添付ファイルにも対応しました。

CLIからメール送信できるので、とても簡単です。ぜひお試し下さい。

コマンドについて

まずコマンドのヘルプを紹介します。オプションが多いので注意してください。

$ ./cmc.sh --help
Usage: cmc.sh [OPTIONS]
  This script is sending email from shell script by Customers Mail Cloud.

Options:
  -h, --help
      --version
  -c, --contract trial | standard | subdmain
  -u, --api-user API_USER
  -k, --api-key API_KEY
  -e, --email to@example.com
  -n, --name EMAIL_NAME
  -f, --from from@example.com
  -s, --subject EMAIL_SUBJECT
  -t, --text File path
  -F, --file File path
  -fn, --from-name EMAIL_FROM_NAME

なお、実行の際にはPythonが必要になります。

利用例

利用時は、ほぼすべてのオプションを指定します。 -t はメール本文で、これはテキストファイルを指定します。-Fで添付ファイルを指定できますが、これは複数ファイルを指定できます。

./cmc.sh -u API_USER \
         -k API_KEY \
         -c standard \
         -e test@smtps.jp \
         -n テスト太郎 \
         -f info@smtps.jp \
         -fn 管理者 \
         -s テストメールです \
         -t body.txt
         -F image1.png \
         -F image2.png

送信できていると、メールIDが返ってきます。

{"id":"\u003C6808a670-fa4b-11ea-bae3-9ca3ba311822@mta03.sandbox.smtps.jp\u003E"}

スクリプトについて

スクリプト全体はコマンドラインでCustomers Mail Cloudからメール送信を行うシェルスクリプトにて公開しています。ここでは抜粋して紹介します。

まずコマンドのヘルプとバージョン表示用の関数です。

#!/bin/bash

PROGNAME=$(basename $0)
VERSION='2.0'

usage() {
    echo "Usage: $PROGNAME [OPTIONS]"
    echo "  This script is sending email from shell script by Customers Mail Cloud."
    # : 省略
    exit 1
}

escape () {
    printf '%s' "$1" | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))'
}

次にコマンドラインオプションを解析します。

for OPT in "$@"
do
    case $OPT in
        -c | --contract)
            if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
                echo "$PROGNAME: option requires an argument -- $1" 1>&2
                exit 1
            fi
            CONTRACT=$2
            shift 2
            ;;
        # : 省略
    esac
done

さらに必須チェックをします。

if [ "$FROM_NAME" = '' ]; then
    FROM_NAME="\"\""
fi
# : 省略
if [ "$API_KEY" = '' ]; then
    echo "$PROGNAME: API Key is required. Using --api-key or -k YOUR_KEY." 1>&2
    exit 1
fi

Web APIのエンドポイントは契約によって異なりますので、それを指定します。

if [ "$CONTRACT" = 'trial' ]; then
    URL='https://sandbox.smtps.jp/api/v2/emails/send.json'
elif [ "$CONTRACT" = 'standard' ]; then
    URL='https://te.smtps.jp/api/v2/emails/send.json'
else
    URL="https://$CONTRACT.smtps.jp/api/v2/emails/send.json"
fi

添付ファイルの場合は multipart/form-data になり、JSONは利用しません。そこで次のようにcurlコマンドを組み立てます。まず添付ファイル用のコマンドラインオプションを作ります。

# 添付ファイル用のコマンド引数を作成
ARG = ""
i=1
for e in ${FILES[@]}; do
    echo "attachment$i = ${e}"
    ARG="$ARG -F attachment$i=@$e"
    let i++
done

最後はcurlコマンドでメッセージを送信します。

curl -X POST \
    -F "api_user=$API_USER" \
    -F "api_key=$API_KEY" \
    -F "to={"name": "$NAME","address": "$EMAIL"}" \
    -F "from={"name": "$FROM_NAME","address":"$FROM"}" \
    -F "attachments=${#FILES[@]}" \
    -F "subject=$SUBJECT" \
    --form-string "text=$(<$TEXT)" \
    $ARG \
    $URL

メールが届けば完成です。

まとめ

cmc.shはプログラミング知識がなくとも、簡単なシェルスクリプトの実行だけでメール送信ができます。例えばメールアドレスのリストがあれば、cmc.shを呼び出すコマンドを作るだけでメール送信ができます。改造して環境変数を使うようにすれば、呼び出し時の簡略化もできるでしょう。

シェルスクリプトは手軽に使えますので、様々な利用が可能です。ぜひ試してみてください。

クラウドからのメール送信を簡単に。確実に。| Customers Mail Cloud