LoginSignup
8
7

More than 5 years have passed since last update.

[AWS][SES] SES で S3 に受信したメールを Slack に通知

Last updated at Posted at 2016-10-26

SES では、メールを受信して S3 に保存しておくことができます。
ただ、S3に保存しておくだけだと、読むときにかったるいです。
S3 put event から Lambda をキックすると Slack に通知できたりして楽チンなので書いてみました。
(さらに SES 使って別のメールアドレスに飛ばしたりとかしても便利かもですね)

このスクリプトでは npm package asyncmailparser を使用してるので npm install async mailparser して node_mojules/ ごと zip に固めて送ってくださいね。

index.js
/*
Name: Email Forwarder
*/
exports.handler = function(event, context) {
    var slackConfig = {
        hostname:   "hooks.slack.com",
        path:       "/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX",
        channel:    "#channel",
        icon_emoji: ":ses:",
        color:      "good"
    };

    var aws = require('aws-sdk');
    var async = require('async');

    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;

    async.waterfall([
        function(nextProcess) {
            var s3 = new aws.S3({apiVersion: '2006-03-01'});
            s3.getObject({Bucket:bucket, Key:key}, nextProcess);
        },
        function(data, nextProcess) {
            var MailParser = require("mailparser").MailParser;
            var mailparser = new MailParser();

            // setup an event listener when the parsing finishes
            mailparser.on("end", function(result){
                console.log("Receive Mail: %j", result);
                nextProcess(null, result);
            });

            // send the email source to the parser
            mailparser.write(data.Body.toString());
            mailparser.end();
        },
        function(mail_object, nextProcess) {
            var https = require('https');
            var util = require('util');

            var options = {
                method:     'POST',
                hostname:   slackConfig.hostname,
                port:       443,
                path:       slackConfig.path
            };
            var postData = {
                "channel":      slackConfig.channel,
                "username":     mail_object.from[0].name + "(" + mail_object.from[0].address + ")",
                "text":         "Subject: " + mail_object.subject + "\n" +
                                "From: " + mail_object.from[0].name + "(" + mail_object.from[0].address + ")" + "\n" +
                                "To: " + mail_object.to[0].address,
                "icon_emoji":   slackConfig.icon_emoji
            };
            postData.attachments = [{
                "color":    slackConfig.color,
                "text":     mail_object.text
            }];

            var req = https.request(options, function(res) {
                nextProcess(null, res);
            });
            req.on('error', function(err) {
                console.log('problem with request: ' + err.message);
                nextProcess(err);
            });
            req.write(util.format("%j", postData));
            req.end();
        }],
        function(err, res) {
            if (err) {
                console.log('err: %j', err);
                context.fail(err);
            } else {
                console.log('result: %j', res);
                context.succeed('Success!');
            }
        }
    );
};
8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7