<?php
namespace App\Controller;
use App\Entity\Main\Contact;
use ContainerC2aw7aC\getMessenger_Transport_AsyncService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
class ContactController extends AbstractController
{
/**
* @Route({
* "en": "/contact-us",
* "tr": "/iletisim"
* }, name="contact", methods={"GET","POST"})
*/
public function index(Request $request, TranslatorInterface $translator, EntityManagerInterface $manager, \Swift_Mailer $mailer): Response
{
$errorMessage = null;
$successMessage = null;
$fullName = null;
$email = null;
$subject = null;
$message = null;
$recaptchaError = null;
$content = null;
if ($request->getMethod() == 'POST') {
parse_str($request->getContent(), $content);
// reCAPTCHA doğrulaması
$recaptchaError = $this->validateRecaptcha($request, $content, $translator);
if (!isset($content['full_name']) || !$content['full_name']) {
$fullName = $translator->trans('THIS_VALUE_NOT_BE_BLANK');
}
if (!isset($content['email']) || !$content['email']) {
$email = $translator->trans('THIS_VALUE_NOT_BE_BLANK');
} else if (!is_numeric(strpos($content['email'], '@'))) {
$email = $translator->trans('THIS_VALUE_IS_NOT_CORRECT_EMAIL_ADDRESS');
}
if (!isset($content['subject']) || !$content['subject']) {
$subject = $translator->trans('THIS_VALUE_NOT_BE_BLANK');
}
if (!isset($content['message']) || !$content['message']) {
$message = $translator->trans('THIS_VALUE_NOT_BE_BLANK');
}
if (!$fullName && !$email && !$subject && !$message && !$recaptchaError) {
try {
// SwiftMailer ile mesaj oluşturma
$emailMessage = (new \Swift_Message('Komili İletişim Formu: ' . $content['subject']))
->setFrom(['eitrwcp@evyap.com' => 'Komili'])
->setTo('eitr@evyap.com')
->setBody("
<h2>İletişim Formu</h2>
<p><strong>İsim:</strong> {$content['full_name']}</p>
<p><strong>Email:</strong> {$content['email']}</p>
<p><strong>Konu:</strong> {$content['subject']}</p>
<p><strong>Mesaj:</strong></p>
<p>{$content['message']}</p>
", 'text/html');
// Email'i gönder
$result = $mailer->send($emailMessage);
// Email başarıyla gönderildiyse veritabanına kaydet
if ($result) {
$contact = new Contact();
$contact->setMessage($content['message'])
->setEmail($content['email'])
->setFullName($content['full_name'])
->setSubject($content['subject']);
$manager->persist($contact);
$manager->flush();
// Başarılı mesajı
$successMessage = $translator->trans('YOUR_REQUEST_HAS_BEEN_SUCCESSFULLY_SUBMITTED');
$content = null;
} else {
$errorMessage = $translator->trans('MESSAGE_COULD_NOT_BE_SENT');
}
} catch (\Exception $e) {
// Hata mesajı
$errorMessage = $translator->trans('MESSAGE_COULD_NOT_BE_SENT');
// Hata logla
error_log('Mail gönderim hatası: ' . $e->getMessage());
}
} else {
$errorMessage = $translator->trans('CHECK_INFORMATION_AND_TRY_AGAIN');
}
}
return $this->render('contact/index.html.twig', [
'fullName' => $fullName,
'email' => $email,
'subject' => $subject,
'message' => $message,
'errorMessage' => $errorMessage,
'successMessage' => $successMessage,
'values' => $content,
'recaptchaError' => $recaptchaError ?? null,
]);
}
/**
* reCAPTCHA v3 doğrulaması yapar
*/
private function validateRecaptcha(Request $request, array $content, TranslatorInterface $translator): ?string
{
// reCAPTCHA response'ı kontrol et
if (!isset($content['g-recaptcha-response']) || empty($content['g-recaptcha-response'])) {
return $translator->trans('RECAPTCHA_REQUIRED');
}
$recaptchaResponse = $content['g-recaptcha-response'];
$secretKey = $_ENV['GOOGLE_RECAPTCHA_SECRET_KEY'] ?? '6LcmpY4rAAAAAD-HIDPv9v7ehCUrRMAtOcJfSEhO';
// Google'a doğrulama isteği gönder
$verifyURL = 'https://www.google.com/recaptcha/api/siteverify';
$postData = [
'secret' => $secretKey,
'response' => $recaptchaResponse,
'remoteip' => $request->getClientIp()
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $verifyURL);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
$responseData = json_decode($response, true);
// v3 için success ve score kontrolü
if (!$responseData['success']) {
return $translator->trans('RECAPTCHA_FAILED');
}
// reCAPTCHA v3 score kontrolü (0.0-1.0, yüksek = insan, düşük = bot)
$score = $responseData['score'] ?? 0;
$threshold = 0.5; // Eşik değeri, ayarlanabilir
if ($score < $threshold) {
error_log("reCAPTCHA v3 Score düşük: $score (eşik: $threshold)");
return $translator->trans('RECAPTCHA_FAILED');
}
// Action kontrolü (opsiyonel)
$action = $responseData['action'] ?? '';
if ($action !== 'contact_form') {
error_log("reCAPTCHA v3 Action uyumsuzluğu: $action");
return $translator->trans('RECAPTCHA_FAILED');
}
return null; // Doğrulama başarılı
}
}