Mail scheme updated v2

This commit is contained in:
salvacybersec
2025-11-11 04:09:45 +03:00
parent 06136294da
commit fa6259e0bd
3 changed files with 89 additions and 51 deletions

View File

@@ -65,13 +65,14 @@ exports.getTokenById = async (req, res, next) => {
// Create token (without sending mail) // Create token (without sending mail)
exports.createToken = async (req, res, next) => { exports.createToken = async (req, res, next) => {
try { try {
const { company_id, target_email, employee_name, template_type } = req.body; const { company_id, target_email, employee_name, template_type, from_name } = req.body;
const token = await tokenService.createToken({ const token = await tokenService.createToken({
company_id, company_id,
target_email, target_email,
employee_name, employee_name,
template_type, template_type,
from_name,
}); });
const trackingUrl = `${process.env.BASE_URL}/t/${token.token}`; const trackingUrl = `${process.env.BASE_URL}/t/${token.token}`;
@@ -92,7 +93,7 @@ exports.createToken = async (req, res, next) => {
// Create token and send mail // Create token and send mail
exports.createAndSendToken = async (req, res, next) => { exports.createAndSendToken = async (req, res, next) => {
try { try {
const { company_id, target_email, employee_name, template_type } = req.body; const { company_id, target_email, employee_name, template_type, from_name } = req.body;
// Create token // Create token
const token = await tokenService.createToken({ const token = await tokenService.createToken({
@@ -100,6 +101,7 @@ exports.createAndSendToken = async (req, res, next) => {
target_email, target_email,
employee_name, employee_name,
template_type, template_type,
from_name,
}); });
// Send mail // Send mail

View File

@@ -87,84 +87,116 @@ class OllamaService {
if (generate_html) { if (generate_html) {
// Full HTML generation mode // Full HTML generation mode
systemPrompt = `Sen profesyonel bir siber güvenlik uzmanısın ve şirketler için phishing farkındalık testi mail şablonları oluşturuyorsun. systemPrompt = `Sen profesyonel bir siber güvenlik uzmanısın ve phishing farkındalık test mail şablonları oluşturuyorsun.
GÖREV: Gerçekçi, ikna edici ve profesyonel phishing test mailleri oluştur. GÖREV: Gerçekçi, ikna edici ve SADECE TÜRKÇE HTML phishing test mailleri oluştur.
KURALLAR: KRİTİK KURALLAR:
1. Mail şablonları modern HTML/CSS ile tasarlanmalı 1. ✅ SADECE TÜRKÇE kullan - İngilizce kelime YASAK!
2. Gerçek şirket maillerine benzer görünmeli 2. ✅ Modern HTML5 + inline CSS
3. İkna edici ve inandırıcı olmalı 3. ✅ Gerçek kurumsal maillere benzer tasarım
4. Türkçe dil bilgisi ve imla kurallarına uygun olmalı 4. ✅ Gramer ve imla hatası OLMAYACAK
5. Kullanıcıyı aciliyet hissi ile harekete geçirmeli 5. ✅ Mantıklı ve tutarlı senaryo
6. ✅ Responsive tasarım (max-width: 600px)
7. ✅ Aciliyet vurgusu
ZORUNLU PLACEHOLDER'LAR: ZORUNLU PLACEHOLDER'LAR:
- {{company_name}} - Şirket adı - {{company_name}} - Şirket adı
- {{employee_name}} - Çalışan adı - {{employee_name}} - Çalışan adı
- {{tracking_url}} - Tıklama linki - {{tracking_url}} - Link href'inde
KONU BAŞLIĞI:
- Max 60 karakter
- Net, çekici, TÜRKÇE
- Senaryoya tam uygun
YANIT FORMATI: Sadece JSON!`; YANIT FORMATI: Sadece JSON!`;
userPrompt = `Aşağıdaki bilgilere göre profesyonel bir phishing test mail şablonu oluştur: userPrompt = `SENARYO DETAYLARI:
📌 HEDEF ŞİRKET: ${company_name} 🏢 Hedef Şirket/Kurum: ${company_name}
📌 SENARYO: ${scenario}`; 📋 Senaryo: ${scenario}`;
if (employee_info) userPrompt += `\n📌 HEDEF KİTLE: ${employee_info}`; if (employee_info) userPrompt += `\n👤 Hedef Kitle: ${employee_info}`;
if (custom_prompt) userPrompt += `\n📌 ÖZEL TALİMATLAR: ${custom_prompt}`; if (custom_prompt) userPrompt += `\n📌 Ek Talimatlar: ${custom_prompt}`;
userPrompt += ` userPrompt += `
JSON YANIT FORMATI: BEKLENEN JSON ÇIKTISI:
{ {
"subject": "İkna edici mail konusu (max 70 karakter)", "subject": "Net, çekici konu başlığı (max 60 karakter, SADECE TÜRKÇE)",
"body": "<!DOCTYPE html><html><head><meta charset='UTF-8'><style>body{font-family:Arial,sans-serif;line-height:1.6;color:#333;max-width:600px;margin:0 auto;padding:20px;}h2{color:#d32f2f;}.button{display:inline-block;padding:12px 30px;background:#d32f2f;color:white;text-decoration:none;border-radius:5px;margin:20px 0;}</style></head><body><h2>Başlık</h2><p>Sayın {{employee_name}},</p><p>İçerik</p><a href='{{tracking_url}}' class='button'>Tıklayın</a></body></html>" "body": "<!DOCTYPE html><html><head><meta charset='UTF-8'><style>body{font-family:Arial,sans-serif;line-height:1.6;color:#333;max-width:600px;margin:0 auto;padding:20px;}h2{color:#d32f2f;}.button{display:inline-block;padding:12px 30px;background:#d32f2f;color:white;text-decoration:none;border-radius:5px;margin:20px 0;}</style></head><body><h2>Başlık</h2><p>Sayın {{employee_name}},</p><p>İçerik paragrafı...</p><a href='{{tracking_url}}' class='button'>Tıklayın</a><p style='font-size:12px;color:#666;'>Saygılarımızla,<br>{{company_name}}</p></body></html>"
} }
⚠️ SADECE JSON DÖNDÜR!`; ⚠️ KRİTİK UYARILAR:
1. SADECE TÜRKÇE - tek kelime bile İngilizce kullanma!
2. HTML geçerli ve düzgün olmalı
3. Inline CSS kullan
4. {{tracking_url}} href içinde kullan
5. Mantıklı senaryo - çelişki yok
6. Konu başlığı senaryoya uygun
7. SADECE JSON döndür!`;
} else { } else {
// Text-only generation mode (RECOMMENDED) // Text-only generation mode (RECOMMENDED)
systemPrompt = `Sen profesyonel bir siber güvenlik uzmanısın ve phishing test mail içerikleri yazıyorsun. systemPrompt = `Sen Türk bir siber güvenlik uzmanısın. Anadilín Türkçe. SADECE TÜRKÇE yaz.
GÖREV: İkna edici, gerçekçi ve profesyonel mail içerikleri yaz. ⛔ YASAKLAR - ASLA KULLANMA:
- İngilizce kelime (the, and, or, please, click, link, button, security, etc.)
- İspanyolca kelime (estamos, por favor, etc.)
- Diğer diller
- Yabancı kelime ekler (-tion, -ing, etc.)
- Yarım Türkçe kelimeler (expectationsı, donecektir, etc.)
KURALLAR: ✅ ZORUNLULAR:
1. Gerçek şirket maillerine benzer dil ve ton kullan - Sade, anlaşılır Türkçe
2. İkna edici ve inandırıcı ol - Kurumsal mail dili (resmi ama sıcak)
3. Türkçe dil bilgisi ve imla kurallarına uygun yaz - Doğru gramer (olmayacak, gerekmektedir, rica ederiz)
4. Kullanıcıyı aciliyet hissi ile harekete geçir - Kısa, net cümleler
5. SADECE METİN İÇERİĞİ yaz, HTML TAG'LERİ KULLANMA! - Mantıklı akış
ZORUNLU PLACEHOLDER'LAR: PLACEHOLDER'LAR:
- {{company_name}} - Şirket adı - {{company_name}} Şirket adı
- {{employee_name}} - Çalışan adı - {{employee_name}} Çalışan adı
- {{tracking_url}} - Link metni (örn: "buraya tıklayın", "hesabınızı doğrulayın") - {{tracking_url}} → AYRI SATIRDA, paragraf altında, link/buton olarak kullan
YANIT FORMATI: Sadece JSON!`; KONU:
- Max 50 karakter
- Türkçe, net, acil
- Örnek: "Hesap Doğrulama Gerekli"
userPrompt = `Aşağıdaki bilgilere göre profesyonel bir phishing test mail içeriği yaz: JSON YANIT: Başka hiçbir şey yazma!`;
📌 HEDEF ŞİRKET: ${company_name} userPrompt = `Şirket: ${company_name}
📌 SENARYO: ${scenario}`; Senaryo: ${scenario}`;
if (employee_info) userPrompt += `\n📌 HEDEF KİTLE: ${employee_info}`; if (employee_info) userPrompt += `\nHedef: ${employee_info}`;
if (custom_prompt) userPrompt += `\n📌 ÖZEL TALİMATLAR: ${custom_prompt}`; if (custom_prompt) userPrompt += `\nEk: ${custom_prompt}`;
userPrompt += ` userPrompt += `
JSON YANIT FORMATI: BEKLENEN JSON:
{ {
"subject": "İkna edici mail konusu (max 70 karakter)", "subject": "Net konu (max 50 karakter)",
"body": "Mail içeriği buraya. Sayın {{employee_name}}, [mesajın içeriği]. Link metni için {{tracking_url}} placeholder'ını kullan. İmza kısmı." "body": "Sayın {{employee_name}},\\n\\nDurum açıklaması.\\n\\nNe yapmalı ve neden önemli.\\n\\nLütfen aşağıdaki bağlantıyı kullanarak işleminizi tamamlayın:\\n{{tracking_url}}\\n\\nSon bilgi veya uyarı.\\n\\nSaygılarımızla,\\n{{company_name}}"
} }
⚠️ ÖNEMLİ: ⛔ YASAKLAR:
- Body içinde HTML TAG kullanma (<p>, <div> gibi)! - İngilizce/İspanyolca kelime YOK
- Sadece düz metin yaz! - HTML tag YOK
- Satır atlamak için sadece yeni satır kullan! - Karışık dil YOK
- {{tracking_url}} placeholder'ını link metni içinde kullan (örn: "{{tracking_url}} buraya tıklayın") - Yanlış gramer YOK
- SADECE JSON DÖNDÜR!`; - {{tracking_url}} cümle içinde kullanma!
✅ İYİ ÖRNEK:
{
"subject": "Hesap Doğrulama Gerekli",
"body": "Sayın {{employee_name}},\\n\\nHesabınızda şüpheli giriş denemesi tespit edildi. Güvenliğiniz için hesabınızı doğrulamanız gerekmektedir.\\n\\nLütfen aşağıdaki bağlantıyı kullanarak 24 saat içinde doğrulama yapın:\\n{{tracking_url}}\\n\\nDoğrulama yapılmadığı takdirde hesabınız geçici olarak askıya alınacaktır.\\n\\nSaygılarımızla,\\n{{company_name}} Güvenlik Ekibi"
}
⚠️ ÖNEMLİ: {{tracking_url}} AYRI SATIRDA OLMALI!
⚠️ SADECE JSON - başka bir şey yazma!`;
} }
try { try {
@@ -303,9 +335,13 @@ JSON YANIT FORMATI:
.split('\n\n') .split('\n\n')
.filter(p => p.trim()) .filter(p => p.trim())
.map(p => { .map(p => {
// Replace {{tracking_url}} placeholder with styled link // If paragraph is ONLY {{tracking_url}}, make it a centered button
if (p.trim() === '{{tracking_url}}') {
return `<div style="text-align: center; margin: 30px 0;"><a href="{{tracking_url}}" class="button">Buraya Tıklayın</a></div>`;
}
// If paragraph contains {{tracking_url}} within text, replace inline
if (p.includes('{{tracking_url}}')) { if (p.includes('{{tracking_url}}')) {
return `<p>${p.replace(/\{\{tracking_url\}\}/g, '<a href="{{tracking_url}}" class="button">Buraya Tıklayın</a>')}</p>`; return `<p>${p.replace(/\{\{tracking_url\}\}/g, '<a href="{{tracking_url}}" style="color: ' + style.button + '; font-weight: bold; text-decoration: underline;">buraya tıklayın</a>')}</p>`;
} }
return `<p>${p}</p>`; return `<p>${p}</p>`;
}) })

View File

@@ -515,7 +515,7 @@ function Templates() {
<Button <Button
variant="outlined" variant="outlined"
startIcon={<Preview />} startIcon={<Preview />}
onClick={handlePreview} onClick={() => handlePreview()}
disabled={previewLoading || !form.body_html} disabled={previewLoading || !form.body_html}
> >
{previewLoading ? 'Önizleme Oluşturuluyor...' : 'Önizleme Oluştur'} {previewLoading ? 'Önizleme Oluşturuluyor...' : 'Önizleme Oluştur'}