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