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

1. بررسی اجمالی
این مستندات به تشریح راه اندازی و اجرای یک سرویس ایمیل با استفاده از AWS Lambda، SQS (سرویس صف ساده)، و Node.js با چارچوب بدون سرور. اهرم های خدمات Nodemailer برای تحویل ایمیل، اطمینان از مقیاس پذیری، کارایی و انعطاف پذیری پیکربندی.
🛠️ اجزای کلیدی
- AWS Lambda: پیام های ایمیل را به صورت ناهمزمان پردازش می کند.
- AWS SQS: پیام های ایمیل را برای پردازش لامبدا در صف قرار می دهد.
- Nodemailer: تحویل ایمیل از طریق SMTP را انجام می دهد.
- چارچوب بدون سرور: مدیریت زیرساخت به عنوان کد (IaC).
- Node.js و TypeScript: زمان اجرای Backend با ایمنی نوع.
🔄 گردش کار
- پیام ها به صف SQS.
- AWS Lambda باعث ایجاد پیام های جدید می شود.
- طرح پیام با استفاده از اعتبارسنجی می شود جوی.
- ایمیل ها از طریق ارسال می شوند Nodemailer.
- گزارش های موفقیت و شکست با استفاده از 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. استقرار
- نصب وابستگی ها:
npm install
- استقرار در AWS:
npx serverless deploy --stage dev
- بررسی سیاههها:
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 دنبال کنید!