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
  -fn, --from-name EMAIL_FROM_NAME

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

利用例

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

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

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

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

スクリプトについて

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

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

#!/bin/bash

PROGNAME=$(basename $0)
VERSION='1.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()))'
}

さらにメール本文(改行あり)のドキュメントをJSONに変換する関数です。

file_to_jsonparam (){
  IFS=$'\n'
  OUTPUT="/tmp/file_to_jsonparam"
  echo "" > ${OUTPUT}
  cat $1 | while read LINE
  do
    ESCAPED_LINE=`echo $LINE | sed -e "s/\([\&\:\"\<\>\{\}\/]\)/__ESCAPE__\1/g" | sed -e "s/__ESCAPE__/\\\\\/g"`
    echo -n "${ESCAPED_LINE}\\r\\n" >> ${OUTPUT}
  done
  RESULT=`cat ${OUTPUT}`
  rm -f ${OUTPUT}
  echo ${RESULT}
}

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

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

Web API用のJSONを生成します。パラメータはあらかじめエスケープ処理しているので、変数を単純に適用するだけでできあがります。

# Make JSON
json=$(cat << EOS
{
  "api_user" : $API_USER,
  "api_key" : $API_KEY,
  "to" : [
    {
      "name" : $NAME,
      "address" : $EMAIL
    }
  ],
  "from" : {
    "name" : $FROM_NAME,
    "address" : $FROM
  },
  "subject" : $SUBJECT,
  "text" : "$TEXT"
}
EOS
)

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

curl -X POST -H "Content-Type: application/json" \
    -d "$json" $URL

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

まとめ

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

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