AWS LambdaとS3を使ってCustomers Mail Cloudで添付ファイル付きメールを送信する

最新のCustomers Mail Cloud用Pythonライブラリが添付ファイルに対応しましたので、それを使ってAmazon S3上のファイルを使ってLambdaでメール送信を行ってみます。

利用するライブラリについて

利用するライブラリとしては、AWSを使うのに必要なboto3とCustomersMailCloudになります。

import boto3
from CustomersMailCloud.Client import CustomersMailCloud

これらのライブラリはローカルにてpipを使ってインストールします。次のような形です。

pip install boto3 -t .

boto3のサイズが大きく(依存ライブラリも多く)、インストールした後はZipアップロードするとインライン編集はできなくなりました。

スクリプトについて

ではLambdaで呼び出されるスクリプトの実装です。 lambda_handler 関数の中に実装していきます。

# この中に実装します
def lambda_handler(event, context):

まずboto3を初期化します。

s3client = boto3.client('s3', 
  region_name='ap-northeast-1'
)
s3_resource = boto3.resource('s3')

次に送信対象にするファイルについてです。AWS Lambdaでは /tmp/ 以下に書き込みができますので、そこにS3からファイルをダウンロードします。

backet_name = 'smtps'
file_name = 'file.png'
file_path = f'path/to/{file_name}'
save_file = f'/tmp/{file_name}'
s3_resource.Bucket(backet_name).download_file(file_path, save_file)

後はCustomers Mail Cloudライブラリを使って送信情報を設定していきます。addFileメソッドで添付ファイルを指定します。ファイルのパスは /tmp/ 内のファイルのパスになります。

client = CustomersMailCloud(os.environ['API_USER'], os.environ['API_KEY'])
client.trial()
client.addTo(event['to']['name'], event['to']['address'])
client.setFrom(os.environ['FROM_NAME'], os.environ['FROM_ADDRESS'])
client.subject = os.environ['SUBJECT']
client.addFile(save_file)
client.text = event['body']

後は送信を行うだけです。

try:
  res = client.send()
  return {
      'statusCode': 200,
      'body': json.dumps(res)
  }
except Exception as e:
  return {
      'statusCode': 403,
      'body': json.dumps(e)
  }

これで添付ファイル付きのメールが送信できます。

f:id:moongift:20200725163954p:plain
添付ファイル付きメール

まとめ

AWS Lambdaでも/tmp/ 以下に書き込みはできますので、S3にアップロードされたタイミングで処理を実行してメール送信したり、定期実行でログをファイルしたりできます。なお、デフォルトの3秒だと実行時間が不足することがありますので注意してください。筆者の環境ではマックス10秒として実行しました。