0円メールサーバー。メールアドレス数無限ww

· ☕ 2
🏷️
  • #Python
  • #aws
  • このブログもだけど、ロリポップみたいなレンタルサーバーを借りてないので、メールサーバーも使えないのです。

    なので、メールもawsで受信してます。

    お値段なんと0円ww

    で、htmlメールが綺麗に受信できないので、対策しようかなと思っているところです。

    今日は、まずその前に、今の現状をまとめておこうと思います!

    構成

    こんな感じ?

    SESシステム構成図

    route53で独自ドメインを設定して、SESで受信して、SNSのtopicに内容投げて、SQSがサブスクリプションして、lambdaに投げて、lambdaでメールの内容読み取って、SNSに送って、サブスクリプションで別のメールに転送してます。

    長い…ww

    あと、一応、SESから一応s3にバックアップ保存してます。

    SESって実は東京リージョンになくって…。

    で、lambdaって同一リージョンからじゃないと叩けなくて…。

    なので、SESとSNSまではオレゴン。その先は東京という不思議なつくりになっていますww

    なんで全部オレゴンで完結してはいけないのかというと、受信したメールを東京リージョンの別のlambdaやdynamoに連携したいって言う、次の目標があるからww

    メール読み取りlambda

    ソースはこんな感じ

    で、これだとhtmlメールが綺麗に受信できないのと、タイトルと宛先と受信元と…とかの情報が取れないのが今の課題…。

    今度この辺をなんとかする!

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
    import json
    import email
    import boto3
    
    def lambda_handler(event, context):
        print(json.dumps(event))
        message = json.loads(event["Records"][0]["body"])
        print(message)
    
        email_body = message["content"]
        email_object = email.message_from_string(email_body)
             
        body = ""
        for part in email_object.walk():
            # ContentTypeがmultipartの場合は実際のコンテンツはさらに
            # 中のpartにあるので読み飛ばす
            if part.get_content_maintype() == 'multipart':
                continue
            # ファイル名の取得
            attach_fname = part.get_filename()
            # ファイル名がない場合は本文のはず
            if not attach_fname:
                charset = str(part.get_content_charset())
                if charset:
                    body += part.get_payload(decode=True).decode(charset, errors="replace")
                else:
                    body += part.get_payload(decode=True)
            else:
                # ファイル名があるならそれは添付ファイル
                pass
        print(body)
        
        TOPIC_ARN = os.environ['TOPIC_ARN']
     
        client = boto3.client('sns')
         
        response = client.publish(
            TopicArn = TOPIC_ARN,
            Message = body,
            Subject = "メール受信"
        )
    
        return {
            'statusCode': 200
        }
    
    

    こんな感じのメールが来ます。

    タイトル
    本文

    色々と改善頑張る回はこちら


    るな
    るな
    エンジニア