やりたいこと(part1と同様)
下記工程を人の手でやっていたところを自動化したいそう。
なんとなくAWSだけで構築できそうなので考えてみた
- SESでSCVファイルが添付されたメールを受信する
- 受信したメールをS3に格納
- S3格納をトリガーにLambda発火
- LambdaでCSVファイルの加工を行う。(記入ミスがある場合SESを使用して返信)
- 加工したCSVファイルをS3に格納
- 時間発火(EventBridge+Lambda)でCSVファイルをserverに送信(FTPかな?)
って感じです。
とりあえずやってみよう。笑笑
受信したメールから添付ファイルを取得する
ここの部分ですね。
SESでメールを受信すると、メール本文とか添付ファイルとかが1つのファイルとしてS3に保存されるので、添付ファイルのみを抜き取る必要がありますね。
Lambda関数の作成
S3に保存されているデータから、添付ファイルのみを抜きだします。
学生のころはCとかJava人間だったんですけど、社会人になってPythonの便利さを知り快感を得た人間なので。
今回は(これからもずっと)Pythonで開発していきます。笑笑
「Lambda」→「関数」→「関数の作成」でLambdaを作成します。
関数名:いい感じの名前
ランタイム:Python 3.9
です。
以下コードです。
part1で作成したS3に"file/"プレフィックスを追加して、そこに添付ファイルのみを保存します。
import boto3
import base64
import email
import urllib.parse
import json
from logging import getLogger, INFO
logger = getLogger(__name__)
logger.setLevel(INFO)
s3 = boto3.resource('s3')
def lambda_handler(event, context):
print("--------- logger.info の出力 ---------")
logger.info(json.dumps(event))
# S3のデータ取得
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
messageid = key.split("/")[1]
try:
response = s3.meta.client.get_object(Bucket=bucket, Key=key)
email_body = response['Body'].read().decode('utf-8')
email_object = email.message_from_string(email_body)
#メールから添付ファイルを抜き出す
for part in email_object.walk():
print("maintype : " + part.get_content_maintype())
if part.get_content_maintype() == 'multipart':
continue
# ファイル名の取得
attach_fname = part.get_filename()
print(attach_fname)
# ファイルの場合
if attach_fname:
# fileに添付ファイルを保存する
attach_data = part.get_payload(decode=True)
bucket_source = s3.Bucket(bucket)
bucket_source.put_object(ACL='private', Body=attach_data,
Key='file' + "/" + attach_fname, ContentType='text/plain')
return 'end'
except Exception as e:
print(e)
print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
raise e
Lambdaの発火条件を設定します。
「トリガーを追加」から、S3にメールが保存されたらLambdaが発火するように設定します。
・バケット:part1で作成したS3
・イベントタイプ:PUT
・プレフィックス:メールを保存しているプレフィックス
メールを送信してみる
part1と同様にCSVファイルを添付してメールを送信してみます。
part2終わり!
受信したメールから添付ファイルを抜き出すことができました。
次はこれを返信する方法ですね〇
今回作成したコードはGithubで公開しているので自由にどうぞ笑笑
次↓
メールに添付されたCSVファイルの取り込み→加工→転送をAWSのサーバレスで構築する方法の考察 part3 添付ファイル送信編