برنامه نویسی

سرویس ایمیل بدون سرور با AWS Lambda، Node.js و SQS 📧

توضیحات تصویر

1. بررسی اجمالی

این مستندات به تشریح راه اندازی و اجرای یک سرویس ایمیل با استفاده از AWS Lambda، SQS (سرویس صف ساده)، و Node.js با چارچوب بدون سرور. اهرم های خدمات Nodemailer برای تحویل ایمیل، اطمینان از مقیاس پذیری، کارایی و انعطاف پذیری پیکربندی.

🛠️ اجزای کلیدی

  • AWS Lambda: پیام های ایمیل را به صورت ناهمزمان پردازش می کند.
  • AWS SQS: پیام های ایمیل را برای پردازش لامبدا در صف قرار می دهد.
  • Nodemailer: تحویل ایمیل از طریق SMTP را انجام می دهد.
  • چارچوب بدون سرور: مدیریت زیرساخت به عنوان کد (IaC).
  • Node.js و TypeScript: زمان اجرای Backend با ایمنی نوع.

🔄 گردش کار

  1. پیام ها به صف SQS.
  2. AWS Lambda باعث ایجاد پیام های جدید می شود.
  3. طرح پیام با استفاده از اعتبارسنجی می شود جوی.
  4. ایمیل ها از طریق ارسال می شوند Nodemailer.
  5. گزارش های موفقیت و شکست با استفاده از a ثبت می شوند چوبگیر.

2. ساختار پروژه

├── src
│   ├── services
│   │   ├── EmailService.ts   # Core email service using Nodemailer
│   ├── controllers
│   │   ├── emailController.ts   # Controls email operations
│   ├── handlers
│   │   ├── sendEmailHandler.ts   # Lambda handler for processing SQS
│   ├── utils
│   │   ├── logger.ts   # Logger for structured logging
│   │   ├── validate.ts # Environment validation helper
├── sls
│   ├── custom.yml    # Custom configuration
│   ├── functions.yml # Lambda function definitions
│   ├── resources.yml # AWS resource definitions
├── serverless.yml   # Main Serverless Framework configuration
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


3. متغیرهای محیطی

این متغیرها را در sls/custom.yml بر اساس مرحله استقرار شما:

استفاده کنید getEnvVariable کمک کننده برای اعتبار سنجی


4. پیاده سازی سرویس ایمیل

📝 src/services/EmailService.ts

import nodemailer from 'nodemailer';
import logger from '../utils/logger';
import { getEnvVariable } from '../utils/validate';

class EmailService {
  private transporter: nodemailer.Transporter;
  private smtpHost: string;
  private smtpPort: number;
  private smtpUser: string;
  private smtpPass: string;
  private smtpFrom: string;

  constructor() {
    this.smtpHost = getEnvVariable('SMTP_HOST');
    this.smtpPort = parseInt(getEnvVariable('SMTP_PORT', '587'));
    this.smtpUser = getEnvVariable('SMTP_USER');
    this.smtpPass = getEnvVariable('SMTP_PASS');
    this.smtpFrom = process.env['EMAIL_FROM'] || this.smtpUser;

    this.transporter = nodemailer.createTransport({
      host: this.smtpHost,
      port: this.smtpPort,
      secure: this.smtpPort === 465,
      auth: {
        user: this.smtpUser,
        pass: this.smtpPass,
      },
    });

    this.verifyConnection();
  }

  private async verifyConnection() {
    try {
      await this.transporter.verify();
      logger.info('SMTP server is ready to send emails');
    } catch (error) {
      logger.error('Failed to verify SMTP connection:', error);
      throw new Error('Unable to connect to SMTP server');
    }
  }

  async sendEmail(to: string, subject: string, htmlContent: string): Promise<void> {
    const mailOptions = {
      from: this.smtpFrom,
      to,
      subject,
      html: htmlContent,
    };

    try {
      const info = await this.transporter.sendMail(mailOptions);
      logger.info('Email sent successfully:', { messageId: info.messageId, to });
    } catch (error: any) {
      logger.error(`Error sending email: ${error.message}`, error);
      throw new Error('Email sending failed');
    }
  }
}

export default new EmailService();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


5. کنترل کننده ایمیل

📝 src/controllers/emailController.ts

import logger from '../utils/logger';
import EmailService from '../services/EmailService';

class EmailController {
  async sendCustomEmail(to: string, subject: string, templateContent: string) {
    try {
      logger.info(`Sending email to ${to} with subject "${subject}"`);
      await EmailService.sendEmail(to, subject, templateContent);
      logger.info(`Email sent successfully to ${to}`);
      return { success: true, message: 'Email sent successfully' };
    } catch (error: any) {
      logger.error(`Failed to send email to ${to} - ${error.message}`);
      throw new Error(`Failed to send custom email - ${error.message}`);
    }
  }
}

export default new EmailController();
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


6. لامبدا هندلر

📝 src/handlers/sendEmailHandler.ts

import Joi from 'joi';
import EmailController from '../controllers/emailController';
import logger from '../utils/logger';
import { Handler } from 'aws-lambda';

const emailSchema = Joi.object({
  to: Joi.string().email().required(),
  subject: Joi.string().required(),
  templateContent: Joi.string().required(),
});

export const handler: Handler = async (event) => {
  for (const record of event.Records) {
    try {
      const message = JSON.parse(record.body);
      const { error, value } = emailSchema.validate(message);

      if (error) {
        logger.warn('Validation failed', {
          recordId: record.messageId,
          errors: error.details.map(e => e.message),
        });
        continue;
      }

      const { to, subject, templateContent } = value;
      await EmailController.sendCustomEmail(to, subject, templateContent);
      logger.info('Email sent successfully', { recordId: record.messageId, to });
    } catch (error: any) {
      logger.error('Failed to process SQS message', {
        recordId: record.messageId,
        error: error.message,
      });
    }
  }
};
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


7. استقرار

  1. نصب وابستگی ها:
npm install
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. استقرار در AWS:
npx serverless deploy --stage dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

  1. بررسی سیاههها:
npx serverless logs -f sendEmail -s dev
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


8. تست کردن

نمونه پیام SQS Payload

{
  "to": "recipient@example.com",
  "subject": "Welcome to Our Platform",
  "templateContent": ""
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این بار را به صف SQS خود اضافه کنید.


9. نتیجه گیری

شما سرویس ایمیل بدون سرور اکنون آماده است! 🚀 ایمیل ها را به طور موثر مدیریت و نظارت کنید AWS Lambda، SQS، و Nodemailer.


نویسنده: محین شیخ

برای اطلاعات بیشتر، من را در GitHub دنبال کنید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا