SES:在 lambda 函数内访问电子邮件正文

2024-04-15

我对 AWS 比较陌生,我正在尝试通过 Lambda 函数处理我的电子邮件。我在 node.js 中构建了这个:

'use strict';

exports.handler = (event, context, callback) => {

    var http = require('http');
    var data = JSON.stringify(event);

    var options = {
        host: 'my.host',
        port: '80',
        path: '/my/path',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Content-Length': data.length
        }
    };

    var req = http.request(options, function(res) {
        var msg = '';

        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            msg += chunk;
        });
        res.on('end', function() {
            console.log(JSON.parse(msg));
        });
    });

    req.write(data);
    req.end();
};

我已经对端点进行了测试,它工作得很好,问题是我现在才意识到消息正文从未发送过。如何访问消息正文以发送消息并由我的 api 处理?

如果您需要查看发送内容的样本,请告诉我。


因此,我所做的是将收到的电子邮件存储在 S3 存储桶中,而不是通知我的 api 新电子邮件已到达(发送文件名)。最后在我的 api 中从 S3 读取、解析、存储并从 S3 中删除。

SES rules: SES rules

Lambda通知函数:

请注意,第一个规则创建的 S3 文件的名称与消息 id 相同,因此'fileName': event.Records[0].ses.mail.messageId.

'use strict';

exports.handler = (event, context, callback) => {

    var http = require('http');
    var data = JSON.stringify({
        'fileName': event.Records[0].ses.mail.messageId,
    });

    var options = {
        host: 'my.host',
        port: '80',
        path: '/my/path',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'Content-Length': data.length
        }
    };

    var req = http.request(options, function(res) {
        var msg = '';

        res.setEncoding('utf8');
        res.on('data', function(chunk) {
            msg += chunk;
        });
        res.on('end', function() {
            console.log(JSON.parse(msg));
            context.succeed();
        });
    });

    req.write(data);
    req.end();
};

Api 函数(PHP - Laravel):

请注意,我使用的是基于 Plancake 电子邮件解析器的电子邮件解析器(链接here https://github.com/daniele-occhipinti/php-email-parser)我自己进行了一些更改,如果需要,我将进行编辑以显示源代码。

public function process_incoming_email(Request $request)
{
    $current_time = Carbon::now()->setTimezone('Brazil/East'); // ALL TIMEZONES: http://us.php.net/manual/en/timezones.others.php

    try
    {
        if ($request->has('fileName')
        {
            $file_name = $request->input('fileName');

            // GET CREDENTIALS AND AUTHENTICATE
            $credentials = CredentialProvider::env();
            $s3 = new S3Client([
                'version' => 'latest',
                'region'  => 'my-region',
                'credentials' => $credentials
            ]);

            // FECTH S3 OBJECT
            $object = $s3->GetObject(['Bucket' => 'my-bucket', 'Key' => $file_name]);
            $body = $object['Body']->getContents();

            // PARSE S3 OBJECT
            $parser = new EmailParser($body);
            $receivers = ['to' => $parser->getTo(), 'cc' => $parser->getCc()];
            $from = $parser->getFrom();
            $body_plain = $parser->getPlainBody();
            $body_html = $parser->getHTMLBody();
            $subject = $parser->getSubject();

            $error_message;

            // PROCESS EACH RECEIVER
            foreach ($receivers as $type => $type_receivers)
            {
                foreach ($type_receivers as $receiver)
                {
                    // PROCESS DOMAIN-MATCHING RECEIVERS
                    if(preg_match("/@(.*)/", $receiver['email'], $matches) && $matches[1] == self::HOST)
                    {
                        // INSERT NEW EMAIL
                        $inserted = DB::table('my-emails')->insert([
                            // ...
                        ]);
                    }
                }
            }

            // ADD ERROR LOG IF PARSER COULD NOT FIND EMAILS
            if($email_count == 0)
            {
                DB::table('my-logs')->insert(
                    ['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Could not parse received email or find a suitable user receiving email.') . ' File: ' . $file_name]
                );
            }
            // DELETE OBJECT FROM S3 IF INSERTED
            else if(count($emails) == $email_count)
            {
                $s3->deleteObject(['Bucket' => 'my-bucket', 'Key' => $file_name]);

                // RETURN SUCCESSFUL JSON RESPONSE
                return Response::json(['success' => true, 'receivedAt' => $current_time, 'message' => 'Email successfully received and processed.']);
            }
            // ADD ERROR LOG IF NOT INSERTED
            else
            {
                DB::table('my-logs')->insert(
                    ['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Inserted ' . count($emails) . ' out of ' . $email_count . ' parsed records.') . ' File: ' . $file_name]
                );
            }
        }
        else
        {
            // ERROR: NO fileName FIELD IN RESPONSE
            DB::table('my-logs')->insert(
                ['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'Incorrect request input format.') . ' Input: ' . json_encode($request->all())]
            );
        }
    }
    // ERROR TREATMENT
    catch(Exception $ex)
    {
        DB::table('my-logs')->insert(
            ['sender' => $request->ip(), 'type' => 'error', 'content' => ($error_message = 'An exception occurred while processing an incoming email.') . ' Details: ' . $ex->getMessage()]
        );
    }

    // RETURN FAILURE JSON RESPONSE
    return Response::json(['success' => false, 'receivedAt' => $current_time, 'message' => $error_message]);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SES:在 lambda 函数内访问电子邮件正文 的相关文章

随机推荐

  • 是否可以防止 getServerSideProps 在初始加载后导致整个页面重新加载?

    我有一个服务器渲染的 next js 应用程序 它是一个 3 页的结账流程 在第一页上 我正在获取各种设置数据 例如标签翻译和里面的购物篮商品getServerSideProps 如下 用户详细信息 js import React from
  • 将函数应用于数组的简单方法

    我知道array walk and array map 但是 当像这样使用前者时 在旧项目上 它失败了 array walk POST mysql real escape string 警告 mysql real escape string
  • Laravel Eloquent 按最新记录分组

    我正在尝试获取表上单个客户的最新记录 例子 ID Customer City Amount 1 Cust001 City1 2 2 Cust001 City2 3 3 Cust001 City1 1 4 Cust001 City2 1 5
  • 关于 Java 中文件加密性能的建议

    我正在做一些文件加密相关的工作 我能够加密 解密文件 但面临主要的性能问题 当我简单地读取 写入 700 MB 大小的视频文件时 我的代码的执行速度约为 27 28 MB s 但是当我执行加密时 我目前正在使用 PBEWithMD5AndD
  • 如果我的地图需要小而不是快,我应该使用 Map 的哪种实现?

    我习惯使用HashMap在我的程序中 因为我知道它通常是最有效的 如果使用得当 并且可以轻松处理大型地图 我知道关于EnumMap这对于枚举键非常有用 但我经常生成一个小地图 它永远不会变得很大 很可能很快就会被丢弃 并且没有并发问题 Is
  • 如何动态添加表格行,包括具有不同 ID 的文本框和选择框

    我开发了一个表 它具有在按下按钮时动态生成表格行的功能 但在添加新行时我无法添加选择框 我怎样才能做到这一点 下面列出了 HTML 和 JS 代码 function addRow tableID var table document get
  • 如何在发布之前将取消令牌插入 ReactiveX 流(IObservable)?

    如何将取消令牌插入现有的IObservable调用前的管道Publish在其上 即 在它成为IConnectableObservable 在订阅它之前 这必须是冷可观察管道的一部分 否则 我可以传递一个CancellationToken令牌
  • JAXB Java 7 与 Java 8 的差异

    我发现在 Java 7 上处理 Jaxb 与在 Java 8 上处理 Jaxb 之间存在另一个区别 我已将问题简化为一个简化的示例 并且代码应作为单个类运行 更改了类别 因此它与工作无关等 当 Unmarshaller 调用列表的 sett
  • IntelliJ读取远程服务器日志文件

    您知道如何设置远程配置以在服务器而不是本地计算机上显示日志文件吗 在编辑配置屏幕 日志 选项卡 上 我可以选择显示日志文件 但仅记录来自我的计算机的日志 而不是来自远程服务器的日志 我不介意是否必须为其安装任何插件 但到目前为止我找不到任何
  • 将非 unicode、非英语内容转换为 unicode

    我有一个 xyz 语言的文本内容 p style font family xyz eWvS kmwkMns kq t mWmb KmeIvkn kocokns aq mw Xn v p It will not display correct
  • Rails 3.1应用程序部署教程

    我正在寻找一个关于服务器上 Rails 3 1 1 应用程序的良好部署教程 我所说的 好 实际上是指 完整 我发布这个问题的原因是 尽管网络上有大量教程 谷歌 博客 书籍 其他 stackoverflow 问题等 但它们似乎都集中在部署过程
  • 有没有办法在php代码中注意到E_NOTICE?

    我有一个 PHP 脚本 需要执行几个小时 有时由于某些原因 例如 执行需要连接到互联网的脚本时出现网络问题等 执行过程会停止一段时间 然后做了错误的事情 当进程走向错误时它总是会导致 E NOTICE 我的问题是 有 任何 方法可以注意到脚
  • 如何将元素翻译为里程表

    我有代码 div class wrap2 span 0 span span 1 span CSS wrap2 data num 0 transfom translate 0 0 wrap2 data num 1 transform tran
  • PHP 应用程序 URL 路由

    因此 我正在编写一个框架 我想在该框架上构建一些我正在开发的应用程序 该框架在那里 所以我有一个可以使用的环境 以及一个可以让我使用单个应用程序的系统 登录 我想制作这个框架 它的应用程序使用面向资源的架构 现在 我想创建一个可由 APP
  • VBscript 使用输出参数从 MySQL 调用存储过程[重复]

    这个问题在这里已经有答案了 编辑20220219 使用下面的 VBSCRIPT 代码解决 SQL CALL NewCheckData pOld cn execute SQL SQL SELECT pOld Set RS cn execute
  • 如何使用 ForwardRefRenderFunction 导出forwardRef

    我有一个属于 UI 库的组件 我们将其称为输入组件 当使用这个库调用Input时 我可以调用的类型有很多 例如
  • 默认的 msbuild 平台是什么

    如果没有指定 msbuild如何选择平台 在我看来 对于某些解决方案 它为其他 x86 选择 混合平台 我打开日志记录的诊断级别 我唯一能看到的是开头的 初始属性 包含例如 平台 混合平台 没有任何解释 为了抢占一些答案 我知道我可以手动覆
  • Spring Boot中使用PostgreSQL驱动创建数据源时出现异常

    我正在尝试使用 Spring Boot 创建一个非 Web 应用程序MKyong 的例子 https www mkyong com spring boot spring boot non web application example 但我
  • Gulp、Reactify 和 Babelify 不能一起转换

    这是我的 gulpfile 代码 gulp task react function browserify app src main jsx transform reactify transform babelify bundle pipe
  • SES:在 lambda 函数内访问电子邮件正文

    我对 AWS 比较陌生 我正在尝试通过 Lambda 函数处理我的电子邮件 我在 node js 中构建了这个 use strict exports handler event context callback gt var http re