2016-11-10 16 views
5

मैं एडब्ल्यूएस के लिए अपेक्षाकृत नया हूं और मैं लैम्ब्डा फ़ंक्शंस के माध्यम से अपने ईमेल को संसाधित करने की कोशिश कर रहा हूं। मैं 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(); 
}; 

मैं अंत बिंदु के साथ परीक्षण किया है और यह पूरी तरह से काम करता है, समस्या मैं अभी महसूस किया कि कि संदेश के मुख्य भाग कभी नहीं भेजा जाता है। मैं इसे भेजने के लिए संदेश के शरीर तक कैसे पहुंच सकता हूं और मेरे एपीआई द्वारा संसाधित किया जा सकता हूं?

यदि आपको भेजे गए संकेतों का नमूना देखने की आवश्यकता है तो मुझे बताएं।

उत्तर

4

तो मैंने जो किया वह एक एस 3 बाल्टी में प्राप्त ईमेल को संग्रहीत कर रहा था, मेरे एपीआई को सूचित करते हुए कि एक नया ईमेल आ गया है (फ़ाइल नाम भेज रहा है)। अंततः एस 3 से पढ़ा, मेरे एपीआई के अंदर, एस 3 से पार्स, संग्रहीत और हटा दिया गया।

एसईएस नियम: SES rules

लैम्ब्डा सूचित समारोह:

ध्यान दें कि पहला नियम के द्वारा बनाई गई S3 फ़ाइल का नाम, '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(); 
}; 

एपीआई समारोह (पीएचपी - Laravel):

ध्यान दें कि मैं एक ईमेल पार्सर कि Plancake ईमेल पार्सर पर आधारित है उपयोग कर रहा हूँ (लिंक here) मेरे अपने में से कुछ परिवर्तन के साथ और यदि आवश्यक हो तो मैं स्रोत दिखाने के लिए संपादित करूंगा।

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]); 
} 
+1

निम्नलिखित के लिए धन्यवाद। एक ही मुद्दे में भागो। थोड़ा मूर्खतापूर्ण लगता है (अक्षम नहीं है) कि हमें संदेश निकाय के लिए इतने सारे लूपों से कूदना है। क्या यह अभी भी वही समाधान है जिसका आप आज उपयोग कर रहे हैं? – DaveJ

+1

@DaveJ दुर्भाग्यवश हां:/ –

+1

@ मैथियस सिमॉन - मैं अपने आप को लार्वेल 5.4 के साथ चलने के लिए बहुत कुछ प्राप्त करने की कोशिश कर रहा हूं, मैं सभी आने वाले ईमेल स्वीकार करने के लिए एसईएस का उपयोग कर रहा हूं और वर्तमान में उन्हें एस 3 में संग्रहीत किया जा रहा है, मेरा मूल विचार उन्हें पार्स करना था लैम्ब्डा पर एक जावास्क्रिप्ट फ़ंक्शन के साथ और फिर उन्हें डीबी में स्टोर करने के लिए लार्वेल पर भेज दें और एप्लिकेशन में प्रदर्शित करें, क्या मैं एसईएस स्टोर्स को एस 3 ऑब्जेक्ट लाने के द्वारा उपयोग किए गए ईमेल पार्सर के साथ लैम्ब्डा से पूरी तरह से बच सकता हूं? किसी भी मदद की सराहना करते हैं, धन्यवाद। – Birdy

1

मैं एक दूसरे को काफ़ी मिलती-जुलती समाधान है, लेकिन एक कम कदम के साथ। लैम्ब्डा ट्रिगर्स सेट करना संभव है। इसलिए, मैंने एक बाल्टी myemailbucket बनाया, और उस बाल्टी को एसईएस से मेल भेजा। तब मैंने अपने लैम्ब्डा फ़ंक्शन के लिए ट्रिगर को बाल्टी myemailbucket में एस 3 में किसी भी निर्माण ईवेंट में बदल दिया।

संबंधित मुद्दे