メール振り分け処理作った

· ☕ 2

メールサーバーを自作しています。

今は↓のように、全メールをただただ受信して、転送していたのですが、いらないメールは転送せず、スラックに流したり、dynamoに格納したりできるように拡張しようと思います。

before

afterイメージはこんな感じ

after

beforeの詳細はこちらの記事を参照ください。

振り分けlambda

ここ

振り分けlambda

処理概要

  • SESからのメッセージからキック。

  • メールの内容を抽出

  • dynamoから振り分け設定を取ってきて、その通りの処理へ流す

メールの内容を抽出

ここで解説しています。

振り分け

ここの部分を新しく作ります。

メールの転送

メールの転送=SNSへのメッセージ送信はこんな感じでやってました。

# SNS転送
client = boto3.client('sns')
response = client.publish(
    TopicArn = f"{os.environ['TOPIC_ARN']}{define['topicName']}",
    Message = mess,
    Subject = f'メール受信:{email_header["Subject"]}'
)

slackへの転送,dynamo登録

slackへの転送=SQSへのメッセージ送信はこんな感じ

dynamoへの登録もSQSメッセージの送信になるから同じ。

# SQS送信
sqs = boto3.resource('sqs')
queue = sqs.get_queue_by_name(QueueName=define["queueName"])

value = define
value["message"] = mess
response = queue.send_message(MessageBody='SlackMessage', MessageAttributes={
    'Message': {
        'StringValue': json.dumps(define),
        'DataType': 'String'
    },
})

dynamoからデータ取得

dynamoからデータ取得

# dynamo取得
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table("mailTransfer")
item = table.get_item(Key={"receiveMail":email_header["To"]})
if "Item" in item:
    defines = item["Item"]["data"]
else:
    defines = []

くっつける

# dynamo取得
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table("mailTransfer")
item = table.get_item(Key={"receiveMail":email_header["To"]})
if "Item" in item:
    defines = item["Item"]["data"]
else:
    defines = []

print(f"defines:{defines}")

mess = f'To:{email_header["To"]}\nFrom:{email_header["From"]}\nDate:{email_header["Date"]}\n{body}'

# SNS転送
for define in defines:
    if "topicName" in define:
        client = boto3.client('sns')
        response = client.publish(
            TopicArn = f"{os.environ['TOPIC_ARN']}{define['topicName']}",
            Message = mess,
            Subject = f'メール受信:{email_header["Subject"]}'
        )
    
    # SQS送信
    if "queueName" in define:

        sqs = boto3.resource('sqs')
        queue = sqs.get_queue_by_name(QueueName=define["queueName"])
    
        value = define
        value["message"] = mess
        response = queue.send_message(MessageBody='SlackMessage', MessageAttributes={
            'Message': {
                'StringValue': json.dumps(define),
                'DataType': 'String'
            },
        })

独り言

完成!


るな
るな
エンジニア