src/Controller/ContactController.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Main\Contact;
  4. use ContainerC2aw7aC\getMessenger_Transport_AsyncService;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use Symfony\Contracts\Translation\TranslatorInterface;
  11. use Symfony\Component\Mailer\MailerInterface;
  12. use Symfony\Component\Mime\Email;
  13. class ContactController extends AbstractController
  14. {
  15.     /**
  16.      * @Route({
  17.      *     "en": "/contact-us",
  18.      *     "tr": "/iletisim"
  19.      * }, name="contact", methods={"GET","POST"})
  20.      */
  21.   
  22.     public function index(Request $requestTranslatorInterface $translatorEntityManagerInterface $manager, \Swift_Mailer $mailer): Response
  23.     {
  24.         $errorMessage null;
  25.         $successMessage null;
  26.         $fullName null;
  27.         $email null;
  28.         $subject null;
  29.         $message null;
  30.         $recaptchaError null;
  31.         $content null;
  32.         if ($request->getMethod() == 'POST') {
  33.             parse_str($request->getContent(), $content);
  34.             // reCAPTCHA doğrulaması
  35.             $recaptchaError $this->validateRecaptcha($request$content$translator);
  36.             
  37.             if (!isset($content['full_name']) || !$content['full_name']) {
  38.                 $fullName $translator->trans('THIS_VALUE_NOT_BE_BLANK');
  39.             }
  40.             if (!isset($content['email']) || !$content['email']) {
  41.                 $email $translator->trans('THIS_VALUE_NOT_BE_BLANK');
  42.             } else if (!is_numeric(strpos($content['email'], '@'))) {
  43.                 $email $translator->trans('THIS_VALUE_IS_NOT_CORRECT_EMAIL_ADDRESS');
  44.             }
  45.             if (!isset($content['subject']) || !$content['subject']) {
  46.                 $subject $translator->trans('THIS_VALUE_NOT_BE_BLANK');
  47.             }
  48.             if (!isset($content['message']) || !$content['message']) {
  49.                 $message $translator->trans('THIS_VALUE_NOT_BE_BLANK');
  50.             }
  51.             if (!$fullName && !$email && !$subject && !$message && !$recaptchaError) {
  52.                 try {
  53.                     // SwiftMailer ile mesaj oluşturma
  54.                     $emailMessage = (new \Swift_Message('Komili İletişim Formu: ' $content['subject']))
  55.                         ->setFrom(['eitrwcp@evyap.com' => 'Komili'])
  56.                         ->setTo('eitr@evyap.com')
  57.                         ->setBody("
  58.                             <h2>İletişim Formu</h2>
  59.                             <p><strong>İsim:</strong> {$content['full_name']}</p>
  60.                             <p><strong>Email:</strong> {$content['email']}</p>
  61.                             <p><strong>Konu:</strong> {$content['subject']}</p>
  62.                             <p><strong>Mesaj:</strong></p>
  63.                             <p>{$content['message']}</p>
  64.                         "'text/html');
  65.                     
  66.                     // Email'i gönder
  67.                     $result $mailer->send($emailMessage);
  68.                     
  69.                     // Email başarıyla gönderildiyse veritabanına kaydet
  70.                     if ($result) {
  71.                         $contact = new Contact();
  72.                         $contact->setMessage($content['message'])
  73.                             ->setEmail($content['email'])
  74.                             ->setFullName($content['full_name'])
  75.                             ->setSubject($content['subject']);
  76.                         $manager->persist($contact);
  77.                         $manager->flush();
  78.                         
  79.                         // Başarılı mesajı
  80.                         $successMessage $translator->trans('YOUR_REQUEST_HAS_BEEN_SUCCESSFULLY_SUBMITTED');
  81.                         $content null;
  82.                     } else {
  83.                         $errorMessage $translator->trans('MESSAGE_COULD_NOT_BE_SENT');
  84.                     }
  85.                 } catch (\Exception $e) {
  86.                     // Hata mesajı
  87.                     $errorMessage $translator->trans('MESSAGE_COULD_NOT_BE_SENT');
  88.                     // Hata logla
  89.                     error_log('Mail gönderim hatası: ' $e->getMessage());
  90.                 }
  91.             } else {
  92.                 $errorMessage $translator->trans('CHECK_INFORMATION_AND_TRY_AGAIN');
  93.             }
  94.         }
  95.         return $this->render('contact/index.html.twig', [
  96.             'fullName' => $fullName,
  97.             'email' => $email,
  98.             'subject' => $subject,
  99.             'message' => $message,
  100.             'errorMessage' => $errorMessage,
  101.             'successMessage' => $successMessage,
  102.             'values' => $content,
  103.             'recaptchaError' => $recaptchaError ?? null,
  104.         ]);
  105.     }
  106.     /**
  107.      * reCAPTCHA v3 doğrulaması yapar
  108.      */
  109.     private function validateRecaptcha(Request $request, array $contentTranslatorInterface $translator): ?string
  110.     {
  111.         // reCAPTCHA response'ı kontrol et
  112.         if (!isset($content['g-recaptcha-response']) || empty($content['g-recaptcha-response'])) {
  113.             return $translator->trans('RECAPTCHA_REQUIRED');
  114.         }
  115.         $recaptchaResponse $content['g-recaptcha-response'];
  116.         $secretKey $_ENV['GOOGLE_RECAPTCHA_SECRET_KEY'] ?? '6LcmpY4rAAAAAD-HIDPv9v7ehCUrRMAtOcJfSEhO';
  117.         
  118.         // Google'a doğrulama isteği gönder
  119.         $verifyURL 'https://www.google.com/recaptcha/api/siteverify';
  120.         $postData = [
  121.             'secret' => $secretKey,
  122.             'response' => $recaptchaResponse,
  123.             'remoteip' => $request->getClientIp()
  124.         ];
  125.         $ch curl_init();
  126.         curl_setopt($chCURLOPT_URL$verifyURL);
  127.         curl_setopt($chCURLOPT_POSTtrue);
  128.         curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($postData));
  129.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  130.         curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  131.         
  132.         $response curl_exec($ch);
  133.         curl_close($ch);
  134.         
  135.         $responseData json_decode($responsetrue);
  136.         
  137.         // v3 için success ve score kontrolü
  138.         if (!$responseData['success']) {
  139.             return $translator->trans('RECAPTCHA_FAILED');
  140.         }
  141.         
  142.         // reCAPTCHA v3 score kontrolü (0.0-1.0, yüksek = insan, düşük = bot)
  143.         $score $responseData['score'] ?? 0;
  144.         $threshold 0.5// Eşik değeri, ayarlanabilir
  145.         
  146.         if ($score $threshold) {
  147.             error_log("reCAPTCHA v3 Score düşük: $score (eşik: $threshold)");
  148.             return $translator->trans('RECAPTCHA_FAILED');
  149.         }
  150.         
  151.         // Action kontrolü (opsiyonel)
  152.         $action $responseData['action'] ?? '';
  153.         if ($action !== 'contact_form') {
  154.             error_log("reCAPTCHA v3 Action uyumsuzluğu: $action");
  155.             return $translator->trans('RECAPTCHA_FAILED');
  156.         }
  157.         
  158.         return null// Doğrulama başarılı
  159.     }
  160. }