const AWS = require('aws-sdk'); const nodemailer = require('nodemailer'); const config = require('../config'); // Инициализация AWS SES let sesClient = null; let transporter = null; const initializeEmailService = () => { const emailProvider = process.env.EMAIL_PROVIDER || 'aws'; // aws, yandex, smtp if (emailProvider === 'aws' && config.email?.aws) { sesClient = new AWS.SES({ accessKeyId: config.email.aws.accessKeyId, secretAccessKey: config.email.aws.secretAccessKey, region: config.email.aws.region || 'us-east-1' }); } else if (emailProvider === 'yandex' || emailProvider === 'smtp') { const emailConfig = config.email?.[emailProvider] || config.email?.smtp || {}; transporter = nodemailer.createTransport({ host: emailConfig.host || process.env.SMTP_HOST, port: emailConfig.port || parseInt(process.env.SMTP_PORT || '587', 10), secure: emailConfig.secure === true || process.env.SMTP_SECURE === 'true', auth: { user: emailConfig.user || process.env.SMTP_USER, pass: emailConfig.password || process.env.SMTP_PASSWORD } }); } }; // Генерация HTML письма с кодом const generateVerificationEmail = (code) => { return `

Код подтверждения

Ваш код для регистрации в Nakama:

${code}

Код действителен в течение 15 минут.

`; }; const sendEmail = async (to, subject, html, text) => { try { const emailProvider = process.env.EMAIL_PROVIDER || 'aws'; const fromEmail = process.env.EMAIL_FROM || config.email?.from || 'noreply@nakama.guru'; if (emailProvider === 'aws' && sesClient) { // Отправка через AWS SES const params = { Source: fromEmail, Destination: { ToAddresses: [to] }, Message: { Subject: { Data: subject, Charset: 'UTF-8' }, Body: { Html: { Data: html, Charset: 'UTF-8' }, Text: { Data: text || html.replace(/<[^>]*>/g, ''), Charset: 'UTF-8' } } } }; const result = await sesClient.sendEmail(params).promise(); return { success: true, messageId: result.MessageId }; } else if (transporter) { // Отправка через SMTP (Yandex, Gmail и т.д.) const info = await transporter.sendMail({ from: fromEmail, to, subject, html, text: text || html.replace(/<[^>]*>/g, '') }); return { success: true, messageId: info.messageId }; } else { throw new Error('Email service not configured'); } } catch (error) { console.error('Ошибка отправки email:', error); throw error; } }; const sendVerificationCode = async (email, code) => { const subject = 'Код подтверждения регистрации - Nakama'; const html = generateVerificationEmail(code); const text = `Ваш код подтверждения: ${code}. Код действителен 15 минут.`; return await sendEmail(email, subject, html, text); }; // Генерация HTML письма с кодом для админа const generateAdminConfirmationEmail = (code, action, userInfo) => { const actionText = action === 'add' ? 'добавления админа' : 'удаления админа'; const userDetails = userInfo ? `

Пользователь: @${userInfo.username} (${userInfo.firstName})

${userInfo.adminNumber ? `

Номер админа: ${userInfo.adminNumber}

` : ''} ` : ''; return `

Подтверждение ${actionText}

${userDetails}

Код подтверждения:

${code}

Код действителен в течение 5 минут.

`; }; const sendAdminConfirmationCode = async (code, action, userInfo) => { const ownerEmail = config.ownerEmail || process.env.OWNER_EMAIL || 'aaem9848@gmail.com'; const actionText = action === 'add' ? 'добавления админа' : 'удаления админа'; const subject = `Код подтверждения ${actionText} - Nakama Moderation`; const html = generateAdminConfirmationEmail(code, action, userInfo); const text = `Код подтверждения ${actionText}: ${code}\n\nПользователь: @${userInfo?.username || 'не указан'}\nКод действителен 5 минут.`; return await sendEmail(ownerEmail, subject, html, text); }; // Инициализация при загрузке модуля initializeEmailService(); module.exports = { sendEmail, sendVerificationCode, sendAdminConfirmationCode, initializeEmailService };