Files
balikci/backend/src/services/mail.service.js

97 lines
2.5 KiB
JavaScript
Raw Normal View History

const nodemailer = require('nodemailer');
const handlebars = require('handlebars');
const logger = require('../config/logger');
const { Settings } = require('../models');
class MailService {
constructor() {
this.transporter = null;
}
async initializeTransporter() {
try {
// Get Gmail settings from database
const gmailUser = await Settings.findOne({ where: { key: 'gmail_user' } });
const gmailPassword = await Settings.findOne({ where: { key: 'gmail_password' } });
const gmailFromName = await Settings.findOne({ where: { key: 'gmail_from_name' } });
// Fallback to env variables
const user = gmailUser?.value || process.env.GMAIL_USER;
const pass = gmailPassword?.value || process.env.GMAIL_APP_PASSWORD;
const fromName = gmailFromName?.value || process.env.GMAIL_FROM_NAME || 'Güvenlik Ekibi';
if (!user || !pass) {
throw new Error('Gmail credentials not configured');
}
this.transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user,
pass,
},
});
this.fromAddress = `"${fromName}" <${user}>`;
// Verify transporter
await this.transporter.verify();
logger.info('Mail service initialized successfully');
return true;
} catch (error) {
logger.error('Failed to initialize mail service:', error);
throw error;
}
}
async sendMail(to, subject, htmlBody) {
try {
if (!this.transporter) {
await this.initializeTransporter();
}
const mailOptions = {
from: this.fromAddress,
to,
subject,
html: htmlBody,
};
const info = await this.transporter.sendMail(mailOptions);
logger.info(`Mail sent to ${to}: ${info.messageId}`);
return {
success: true,
messageId: info.messageId,
};
} catch (error) {
logger.error(`Failed to send mail to ${to}:`, error);
throw error;
}
}
renderTemplate(templateHtml, data) {
try {
const template = handlebars.compile(templateHtml);
return template(data);
} catch (error) {
logger.error('Failed to render template:', error);
throw error;
}
}
async testConnection() {
try {
await this.initializeTransporter();
return { success: true, message: 'Gmail connection successful' };
} catch (error) {
return { success: false, error: error.message };
}
}
}
module.exports = new MailService();