first commit: Complete phishing test management panel with Node.js backend and React frontend
This commit is contained in:
96
backend/src/services/mail.service.js
Normal file
96
backend/src/services/mail.service.js
Normal file
@@ -0,0 +1,96 @@
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user