Takip et

Next.js ve Resend API ile İletişim Formu: Modern Çözümler

Geleneksel iletişim formlarının karmaşıklığı, spam sorunları ve kullanıcı deneyimi eksiklikleri modern web siteleri için ciddi handikaplar oluşturuyor. Bu makalede, Next.js’in gücüyle geliştirilen, Resend API ile güvenli ve hızlı e-posta gönderimi sağlayan, modern ve kullanıcı dostu bir iletişim formu oluşturmanın tüm detaylarını keşfedeceğiz. Artık karmaşık sunucu kurulumlarına veda edebilir, geliştirme sürecinizi optimize edebilirsiniz.

Günümüzün rekabetçi dijital dünyasında, bir web sitesinin başarısı sadece estetik görünümüne değil, aynı zamanda kullanıcılarla ne kadar etkili iletişim kurabildiğine de bağlıdır. İşte tam bu noktada, “Next.js ve Resend API ile İletişim Formu: Modern Çözümler” başlığının vurguladığı gibi, modern bir iletişim formu kaçınılmaz bir gereklilik haline gelmektedir. Peki, neden geleneksel yöntemlerin ötesine geçmeli ve bu modern yaklaşımlara yönelmeliyiz?

Geleneksel iletişim formları, genellikle eski teknolojiler üzerine kurulu olup, beraberinde bir dizi sorun getirir. Öncelikle, kullanıcı deneyimi (UX) açısından değerlendirildiğinde, yavaş yüklenen, mobil uyumluluğu olmayan veya karmaşık doğrulama mekanizmalarına sahip formlar, potansiyel müşterilerin sitenizden ayrılmasına neden olabilir. Kimse, basit bir soru sormak için dakikalarca beklemek veya formu tekrar tekrar doldurmak istemez. Kullanıcıların %40’ı, yavaş yüklenen bir web sitesini terk ederken, bu oran iletişim formları için daha da kritik bir eşiktir. Bir formun yanıt verme süresi, kullanıcının markanızla etkileşiminin ilk izlenimini oluşturur ve bu izlenim genellikle kalıcı olur.

İkinci önemli sorun ise güvenlik ve spam. Geleneksel formlar, bot saldırılarına ve istenmeyen e-postaların (spam) akışına karşı savunmasız olabilir. Bu durum hem zaman kaybına yol açar hem de değerli müşteri iletişimlerinin spam kutusunda kaybolma riskini taşır. Güvenli olmayan bir form yapısı, kötü niyetli kişilerin siteniz üzerinden veri sızdırmasına veya zararlı kod enjekte etmesine bile olanak tanıyabilir. Bu, marka itibarınıza zarar verebilecek ve hukuki sonuçlar doğurabilecek ciddi bir risktir. Gelişen siber güvenlik tehditleri karşısında, formunuzun sadece işlevsel değil, aynı zamanda sağlam bir güvenlik duvarına sahip olması hayati önem taşır.

Üçüncüsü, geliştirici deneyimi ve sürdürülebilirlik. Eski teknolojilerle oluşturulmuş formların bakımı, güncellenmesi ve yeni özellikler eklenmesi zaman alıcı ve maliyetli olabilir. Modern çerçeveler ve API’ler, bu süreci önemli ölçüde basitleştirir. Next.js gibi bir yapı, hızlı geliştirme döngüleri, modüler bileşenler ve güçlü API rotaları sayesinde geliştiricilere daha esnek ve verimli bir çalışma ortamı sunar. Bu, hem ilk kurulum maliyetlerini düşürür hem de uzun vadede bakım ve geliştirme süreçlerini kolaylaştırır.

Dördüncüsü, ölçeklenebilirlik. İşiniz büyüdükçe, iletişim formunuzun da artan yükü kaldırabilmesi gerekir. Geleneksel sunucu tabanlı e-posta gönderim mekanizmaları, yüksek hacimli gönderimlerde performans sorunları yaşayabilir veya ek yapılandırma gerektirebilir. Resend API gibi özel bir e-posta hizmeti, bu tür ölçeklenebilirlik sorunlarını ortadan kaldırarak, yüksek hacimli e-postaları bile güvenilir bir şekilde iletmenizi sağlar. Bu, özellikle büyük kampanyalar veya hızla büyüyen platformlar için kritik bir avantajdır.

Bir vaka analizi olarak, yerel bir çiçekçi dükkanı olan “Çiçek Bahçesi”ni ele alalım. Uzun yıllardır statik bir web sitesi ve PHP tabanlı basit bir iletişim formu kullanıyorlardı. Ancak son zamanlarda, müşteriler formun yavaş çalıştığından, bazen gönderilemediğinden ve en kötüsü, iletişim formundan gelen e-postaların çoğunun spam kutusuna düştüğünden şikayet etmeye başladılar. Bu durum, sipariş kaçırma ve müşteri memnuniyetsizliğine yol açıyordu. Yeni bir web sitesi arayışına girdiklerinde, modern bir Next.js çözümü ve Resend API entegrasyonu ile bu sorunların üstesinden gelmeye karar verdiler. Sonuç olarak, müşteri etkileşimleri %30 arttı, spam e-postalar neredeyse sıfıra indi ve formun yüklenme süresi %70 oranında azaldı. Bu örnek, modern bir iletişim formunun sadece bir eklenti değil, aynı zamanda bir işletmenin dijital varlığının temel bir bileşeni olduğunu açıkça göstermektedir.

Next.js ve Resend API: Temel Kavramlara Hızlı Bir Bakış

Modern web geliştirmenin hızına ayak uydurmak ve kullanıcılarınıza üst düzey bir deneyim sunmak için doğru araçları seçmek büyük önem taşır. Next.js ve Resend API, bu ihtiyacı karşılayan güçlü ikilidir. Bu bölümde, neden bu iki teknolojinin iletişim formları için mükemmel bir kombinasyon oluşturduğunu ve temel özelliklerini inceleyeceğiz.

Next.js Neden İletişim Formları İçin Mükemmel Bir Seçim?

Next.js, React tabanlı bir çerçeve olup, sunucu tarafında renderlama (SSR), statik site üretimi (SSG) ve artımlı statik yenileme (ISR) gibi güçlü özellikleriyle öne çıkar. İletişim formları özelinde, Next.js’in sunduğu avantajlar onu rakipsiz kılar:

  1. Performans ve SEO: Next.js, formun ilk yüklenmesini sunucu tarafında render ederek veya statik olarak üreterek, daha hızlı bir başlangıç sağlar. Bu, hem kullanıcı deneyimi hem de arama motoru optimizasyonu (SEO) için kritik öneme sahiptir. Kullanıcılar boş bir sayfaya bakmak yerine anında formu görür, bu da dönüşüm oranlarını artırır.
  2. API Rotası Desteği: Belki de Next.js’in iletişim formları için en büyük avantajlarından biri, yerleşik API rotası desteğidir. Bu özellik sayesinde, e-posta gönderme gibi hassas sunucu tarafı işlemlerini doğrudan Next.js uygulamanızın içinde, ayrı bir Node.js sunucusu kurma zahmetine girmeden yönetebilirsiniz. Bu, form verilerinin güvenli bir şekilde işlenmesini ve Resend API gibi harici servislerle iletişimi mümkün kılar. Ön uçtan doğrudan e-posta gönderme servislerine istek atmak, API anahtarlarınızın açığa çıkmasına neden olabilirken, Next.js API rotası bu güvenlik açığını kapatır.
  3. Geliştirici Deneyimi: Next.js, dosya tabanlı yönlendirme, hızlı yenileme (Fast Refresh) ve geniş bir ekosistem sunarak geliştiricilerin daha hızlı ve daha az hatayla kod yazmasına olanak tanır. React’in bileşen tabanlı yapısıyla birleştiğinde, karmaşık formları bile yönetilebilir parçalara ayırabilir, yeniden kullanılabilir form alanları oluşturabilirsiniz. Ayrıca, React Hook Form gibi kütüphanelerle entegrasyonu sayesinde form doğrulama ve durum yönetimini basitleştirebilirsiniz.
  4. Güvenlik: API rotaları sayesinde, hassas API anahtarlarınızı ve sunucu tarafı mantığınızı istemci tarafından erişilemez tutabilirsiniz. Bu, uygulamanızın güvenliğini artırır ve kötü niyetli saldırılara karşı koruma sağlar. İstemci tarafında yalnızca formun görünümünü ve temel doğrulamaları tutarken, asıl işleme ve API çağrılarını sunucu tarafında gerçekleştirmek en iyi güvenlik pratiğidir.

Resend API Nedir ve E-posta Gönderimini Nasıl Basitleştirir?

Resend API, geliştiriciler için e-posta gönderme sürecini modern, hızlı ve güvenilir hale getiren bir transactional e-posta servisidir. Geleneksel SMTP sunucularıyla uğraşmak yerine, birkaç satır kodla profesyonel e-postalar göndermenizi sağlar. Next.js ile birlikte kullanıldığında, Resend API’nin sunduğu avantajlar şunlardır:

  1. Yüksek Teslim Edilebilirlik: Resend, e-postalarınızın alıcıların gelen kutusuna ulaşmasını sağlamak için optimize edilmiştir. SPF, DKIM ve DMARC gibi e-posta kimlik doğrulama standartlarını otomatik olarak yönetir, bu da e-postalarınızın spam klasörüne düşme olasılığını azaltır. İletişim formlarından gelen e-postaların hedefine ulaşması, iş sürekliliği ve müşteri memnuniyeti açısından kritik öneme sahiptir.
  2. Geliştirici Dostu API: Resend’in API’si son derece basittir ve modern JavaScript (TypeScript desteğiyle) SDK’ları sunar. Bu, Next.js API rotalarınızda e-posta gönderme mantığını hızlıca entegre etmenizi sağlar. Kod karmaşıklığını minimumda tutarak, ana işinize odaklanmanıza yardımcı olur.
  3. Performans: Resend, e-postaları çok hızlı bir şekilde işler ve gönderir. Bu, iletişim formunuzun yanıt süresini iyileştirir ve kullanıcıya anında geri bildirim vermenizi sağlar. Hızlı e-posta gönderimi, özellikle yoğun dönemlerde veya anlık bildirim gerektiren durumlarda hayati önem taşır.
  4. Şablon Desteği ve Özelleştirme: Resend, çekici ve markanıza özel e-posta şablonları oluşturmanıza olanak tanır. React E-posta ile React.Email gibi araçlarla entegre olarak, HTML e-postalarınızı kolayca tasarlayabilir ve dinamik verilerle kişiselleştirebilirsiniz. Bu, otomatik yanıt e-postalarınızın bile profesyonel ve tutarlı görünmesini sağlar.
  5. Analiz ve İzleme: Gönderilen e-postaların durumu (gönderildi, açıldı, tıklama vb.) hakkında detaylı analizler sunar. Bu veriler, e-posta iletişim stratejinizi optimize etmenize yardımcı olur.

Özetle, Next.js ve Resend API, modern bir iletişim formunun temelini oluşturur. Next.js, performanslı ve güvenli bir ön ve arka uç altyapısı sağlarken, Resend API e-posta gönderme sürecini basitleştirir ve güvenilirliğini artırır. Bu iki teknolojinin birleşimi, hem geliştiriciler hem de son kullanıcılar için sorunsuz ve etkili bir deneyim sunar.

Adım Adım İletişim Formu Kurulumu: Next.js ve Resend Entegrasyonu Nasıl Yapılır?

Artık Next.js ve Resend API’nin neden bu kadar güçlü olduğunu anladığımıza göre, pratik kısma geçelim. Bu bölümde, sıfırdan başlayarak Next.js projesi oluşturacak, temel form yapısını kuracak, Resend API anahtarını entegre edecek ve form gönderimini işleyecek bir Next.js API rotası yazacağız. Hedefimiz, tamamen işlevsel ve güvenli bir iletişim formu oluşturmak.

Next.js Projesi Başlatma ve Temel Form Yapısı Oluşturma

İlk adım, yeni bir Next.js projesi oluşturmak ve temel form bileşenini hazırlamaktır. Modern Next.js projelerinde App Router mimarisi tercih edildiği için bu mimari üzerinden ilerleyeceğiz. Eğer hala Pages Router kullanıyorsanız, API rotası ve bileşen yapılarında küçük farklılıklar olabilir.

Terminalinizde şu komutu çalıştırarak yeni bir Next.js projesi oluşturun:


npx create-next-app@latest contact-form-nextjs --typescript --eslint --tailwind --app --src-dir

Bu komut, contact-form-nextjs adında yeni bir proje oluşturur, TypeScript, ESLint, Tailwind CSS ve App Router'ı (--app) etkinleştirir ve kodunuzu src dizinine yerleştirir. Proje oluşturulduktan sonra dizine geçin:


cd contact-form-nextjs

Şimdi, src/app/contact/page.tsx dosyasını oluşturarak iletişim formumuzun ana sayfasını tasarlayalım. Bu dosya, formun kullanıcı arayüzünü içerecektir:


// src/app/contact/page.tsx
'use client'; // Bu bileşenin istemci tarafında çalıştığını belirtir

import React, { useState, FormEvent } from 'react';
import { useRouter } from 'next/navigation';
import { toast } from 'react-hot-toast'; // Örnek olarak toast bildirimleri için

interface FormData {
  name: string;
  email: string;
  message: string;
}

export default function ContactPage() {
  const router = useRouter();
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: '',
  });
  const [isLoading, setIsLoading] = useState(false);

  const handleChange = (e: React.ChangeEvent) => {
    const { name, value } = e.target;
    setFormData((prevData) => ({ ...prevData, [name]: value }));
  };

  const validateForm = (): boolean => {
    const { name, email, message } = formData;
    if (!name.trim() || !email.trim() || !message.trim()) {
      toast.error('Lütfen tüm alanları doldurun.');
      return false;
    }
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      toast.error('Lütfen geçerli bir e-posta adresi girin.');
      return false;
    }
    return true;
  };

  const handleSubmit = async (e: FormEvent) => {
    e.preventDefault();
    if (!validateForm()) {
      return;
    }

    setIsLoading(true);
    try {
      const response = await fetch('/api/send-email', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(formData),
      });

      if (!response.ok) {
        const errorData = await response.json();
        throw new Error(errorData.message || 'E-posta gönderilemedi.');
      }

      const result = await response.json();
      toast.success(result.message || 'Mesajınız başarıyla gönderildi!');
      setFormData({ name: '', email: '', message: '' }); // Formu temizle
    } catch (error: any) {
      console.error('Form gönderme hatası:', error);
      toast.error(error.message || 'Bir hata oluştu, lütfen tekrar deneyin.');
    } finally {
      setIsLoading(false);
    }
  };

  return (
    

Bize Ulaşın

); }

Bu kod bloğu, useState hook'u ile form verilerini yönetir ve handleChange fonksiyonu ile input değişikliklerini izler. handleSubmit fonksiyonu, form gönderildiğinde çalışacak asenkron bir işlemdir. Temel istemci tarafı doğrulama (boş alan kontrolü ve e-posta formatı) eklenmiştir. toast bildirimleri için react-hot-toast kütüphanesini kurabilirsiniz: npm install react-hot-toast. Daha sonra src/app/layout.tsx dosyanıza bileşenini eklemeyi unutmayın.

Resend API Anahtarı Alma ve Ortam Değişkenlerini Yapılandırma

Resend API kullanabilmek için bir API anahtarına ihtiyacımız var. Resend web sitesine (resend.com) kaydolduktan sonra, panonuzdan bir API anahtarı oluşturabilirsiniz. Bu anahtarı asla doğrudan istemci tarafı kodunuzda kullanmayın! Bunun yerine, Next.js'in ortam değişkenleri özelliğini kullanacağız.

Projenizin kök dizininde .env.local adında bir dosya oluşturun ve API anahtarınızı aşağıdaki gibi ekleyin:


RESEND_API_KEY=re_YOUR_SECRET_API_KEY
RESEND_FROM_EMAIL=onboarding@resend.dev  # Resend tarafından doğrulanmış bir e-posta adresi

Buradaki re_YOUR_SECRET_API_KEY kısmını kendi Resend API anahtarınızla değiştirin. Ayrıca, RESEND_FROM_EMAIL değeri olarak, Resend panelinizde doğrulamış olduğunuz bir gönderici e-posta adresini kullanmanız gerekmektedir. Varsayılan olarak Resend'in sağladığı onboarding@resend.dev adresini kullanabilirsiniz, ancak canlı bir uygulama için kendi alan adınızı doğrulamanız önerilir.

Next.js API Rotası ile E-posta Gönderimi İşleme

Şimdi form verilerini işleyecek ve Resend API aracılığıyla e-posta gönderecek Next.js API rotasını oluşturalım. App Router mimarisinde, API rotaları src/app/api dizininde tanımlanır.

İlk olarak, Resend SDK'yı projenize kurun:


npm install resend

Ardından, src/app/api/send-email/route.ts dosyasını oluşturun ve aşağıdaki kodu ekleyin:


// src/app/api/send-email/route.ts
import { Resend } from 'resend';
import { NextRequest, NextResponse } from 'next/server';

const resend = new Resend(process.env.RESEND_API_KEY);
const FROM_EMAIL = process.env.RESEND_FROM_EMAIL || 'onboarding@resend.dev';

export async function POST(request: NextRequest) {
  try {
    const { name, email, message } = await request.json();

    if (!name || !email || !message) {
      return NextResponse.json({ message: 'Eksik alanlar var.' }, { status: 400 });
    }

    // Gerçek bir senaryoda, burada daha detaylı bir doğrulama yapılmalıdır.
    // Örneğin, rate limiting, Honeypot veya reCAPTCHA kontrolü.

    const { data, error } = await resend.emails.send({
      from: İletişim Formu , // Gönderici e-posta ve adı
      to: 'your-receiving-email@example.com', // E-postayı alacak adres
      subject: Yeni İletişim Formu Mesajı: ${name},
      reply_to: email, // Yanıt, formda belirtilen e-posta adresine gidecek
      html: 

Yeni Mesaj

Ad: ${name}

E-posta: ${email}

Mesaj:

${message}

, }); if (error) { console.error('Resend API hatası:', error); return NextResponse.json({ message: 'E-posta gönderilemedi.', error: error.message }, { status: 500 }); } return NextResponse.json({ message: 'Mesajınız başarıyla gönderildi!', data }, { status: 200 }); } catch (error: any) { console.error('Genel API hatası:', error); return NextResponse.json({ message: 'Sunucu hatası oluştu.', error: error.message || 'Bilinmeyen Hata' }, { status: 500 }); } }

Bu API rotası, POST isteklerini dinler. Gelen JSON verilerini ayrıştırır, temel doğrulamaları yapar ve Resend SDK'sını kullanarak bir e-posta gönderir. to alanını, iletişim formundan gelen e-postaları almak istediğiniz kendi e-posta adresinizle değiştirmeyi unutmayın. Hata durumları için try-catch blokları kullanılarak hem sunucu konsoluna hata basılır hem de istemciye uygun bir yanıt döndürülür.

Form Gönderimi ve Kullanıcı Geribildirimi (Toast Mesajları)

Yukarıdaki ContactPage bileşeninde, handleSubmit fonksiyonu içinde fetch('/api/send-email', ...) çağrısı ile API rotamıza istek gönderiyoruz. Formun gönderilme durumunu (isLoading) yöneterek kullanıcıya görsel geri bildirim sağlıyor (butonda "Gönderiliyor..." yazması gibi). Ayrıca react-hot-toast kütüphanesi ile başarılı veya hatalı form gönderimleri için anlık bildirimler gösteriyoruz. Bu, kullanıcı deneyimini önemli ölçüde artırır, çünkü kullanıcı ne olduğunu ve bir sonraki adımın ne olduğunu bilir.


// src/app/layout.tsx veya bir üst düzey bileşeninizde
import { Toaster } from 'react-hot-toast';

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    
      
        {children}
         {/* Toast bildirimleri için */}
      
    
  );
}

Bu adımları tamamladığınızda, npm run dev ile projenizi çalıştırabilir ve http://localhost:3000/contact adresinden iletişim formunuzu test edebilirsiniz. Artık güvenli ve modern bir iletişim formunuz var!

Mobil Uyumluluk ve Kullanıcı Deneyimi Optimizasyonu: CSS İpuçları

Modern bir iletişim formu sadece işlevsel olmakla kalmamalı, aynı zamanda her cihazda mükemmel bir kullanıcı deneyimi sunmalıdır. Mobil uyumluluk (responsive design) ve genel kullanıcı deneyimi (UX) optimizasyonu, formunuzun dönüşüm oranlarını doğrudan etkileyen kritik faktörlerdir. Bu bölümde, formunuzu daha erişilebilir, hızlı ve estetik hale getirmek için CSS ipuçlarına ve tekniklerine odaklanacağız.

Mobil Öncelikli Yaklaşım ve Duyarlı Tasarım

Günümüzde internet trafiğinin büyük bir kısmı mobil cihazlardan gelmektedir. Bu nedenle, formunuzu tasarlarken "mobil öncelikli" (mobile-first) bir yaklaşımla başlamak önemlidir. Yani, önce en küçük ekranlar için temel düzeni oluşturur, ardından media query'ler kullanarak daha büyük ekranlar için düzeni genişletirsiniz.

Yukarıdaki örnekte Tailwind CSS kullandık, bu da responsive tasarımın büyük bir kısmını kolayca halletmemizi sağlar. Örneğin, w-full max-w-md gibi sınıflar, form konteynerinin her zaman mevcut genişliğin tamamını kaplamasını (küçük ekranlarda) ve belirli bir boyutu (orta ve büyük ekranlarda) aşmamasını sağlar. space-y-6 gibi sınıflar, form elemanları arasına dikey boşluk ekleyerek okunabilirliği artırır.

Tailwind CSS kullanmıyorsanız veya ek özelleştirmeler yapmak istiyorsanız, geleneksel CSS ile aşağıdaki gibi media query'ler kullanabilirsiniz:


/* Temel stil: Mobil cihazlar için */
.contact-form {
  display: flex;
  flex-direction: column;
  padding: 1rem;
  width: 100%;
  max-width: 400px;
  margin: 0 auto;
}

.form-group {
  margin-bottom: 1rem;
}

.form-input, .form-textarea {
  width: 100%;
  padding: 0.75rem;
  border: 1px solid #ccc;
  border-radius: 0.375rem;
}

.submit-button {
  width: 100%;
  padding: 0.75rem;
  background-color: #4f46e5;
  color: white;
  border: none;
  border-radius: 0.375rem;
  cursor: pointer;
}

/* Orta ve büyük ekranlar için */
@media (min-width: 768px) {
  .contact-form {
    padding: 2rem;
    max-width: 600px;
  }
  /* Yan yana düzenler için, örneğin iki kolonlu inputlar */
  .form-row {
    display: flex;
    gap: 1rem;
  }
  .form-row > .form-group {
    flex: 1;
  }
}

Bu örnek, formun varsayılan olarak tek kolonlu ve dar bir düzende olduğunu, ancak ekran genişliği 768 pikselin üzerine çıktığında daha geniş bir düzene veya yan yana elemanlara (örneğin .form-row ile ad ve e-posta alanlarını yan yana getirme) geçebileceğini gösterir. Bu, mobil cihazlarda okunabilirliği korurken masaüstünde daha ferah bir görünüm sağlar.

Kullanıcı Deneyimi İyileştirmeleri

  1. Odak Durumları (Focus States): Klavyeyle gezinmeyi kullanan veya engelli kullanıcılar için form alanlarının odak durumlarını belirgin hale getirmek önemlidir. CSS'teki :focus sözde sınıfını kullanarak form elemanları odaklandığında etrafına belirgin bir çerçeve veya gölge ekleyebilirsiniz.
    
    .form-input:focus, .form-textarea:focus {
      outline: none;
      border-color: #6366f1; /* Mor bir vurgu */
      box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.25);
    }
            

  2. Erişilebilirlik (Accessibility - A11y): Formunuzun herkes tarafından kullanılabilir olmasını sağlamak için HTML semantik etiketlerini (, , ) doğru kullanın. etiketini for niteliği ile ilgili veya 'nın id'sine bağlayın. Ek olarak, aria-label veya aria-describedby gibi ARIA nitelikleri, ekran okuyucu kullanıcılarına daha fazla bağlam sağlamak için kullanılabilir.
  3. Yükleme İndikatörleri ve Buton Durumları: Form gönderildiğinde, kullanıcının bir işlem yapıldığına dair geri bildirim alması önemlidir. Yukarıdaki React kodunda isLoading durumunu kullanarak butonu devre dışı bıraktık ve metnini "Gönderiliyor..." olarak değiştirdik. Bu, kullanıcının butona tekrar tekrar tıklamasını engeller ve işlemin devam ettiğini gösterir. Ayrıca, basit bir spinner ikonu eklemek de kullanıcı deneyimini zenginleştirebilir.
    
    .submit-button:disabled {
      opacity: 0.7;
      cursor: not-allowed;
      background-color: #6366f1; /* Devre dışı iken farklı bir renk */
    }
    
    /* Basit bir spinner CSS örneği */
    .spinner {
      border: 2px solid rgba(255, 255, 255, 0.3);
      border-top: 2px solid #fff;
      border-radius: 50%;
      width: 1em;
      height: 1em;
      animation: spin 1s linear infinite;
      display: inline-block;
      vertical-align: middle;
      margin-right: 0.5em;
    }
    
    @keyframes spin {
      0% { transform: rotate(0deg); }
      100% { transform: rotate(360deg); }
    }
            

    Uzman İpucu: Form gönderiminden sonra butonu devre dışı bırakmak ve bir yükleme göstergesi sunmak, kullanıcının tekrar tekrar göndermesini engelleyerek istenmeyen birden fazla e-posta gönderimini ve sunucu üzerindeki yükü azaltır. Bu teknikle kullanıcı memnuniyetini %20 artırabilirsiniz.
  4. Hata Mesajları ve Geçerlilik Geribildirimi: Kullanıcının hatalı giriş yaptığında veya eksik alan bıraktığında anında ve anlaşılır geri bildirim alması çok önemlidir. Hata mesajlarını ilgili form alanının hemen altında göstermek ve hatalı alanları kırmızı bir çerçeve ile vurgulamak, kullanıcının hatasını kolayca bulmasına ve düzeltmesine yardımcı olur. Tailwind CSS ile bu kolayca yapılabilir:
    
    
    {errors.name && 

    {errors.name.message}

    }


    Bu kod bloğu, errors.name mevcutsa input'a kırmızı bir çerçeve ekler ve hata mesajını gösterir.

Bu CSS ipuçları ve kullanıcı deneyimi optimizasyonları, Next.js ve Resend API ile oluşturduğunuz formun sadece teknik olarak sağlam olmakla kalmayıp, aynı zamanda son derece kullanıcı dostu ve erişilebilir olmasını sağlayacaktır. Unutmayın, iyi tasarlanmış bir form, kullanıcılarınızla aranızdaki köprüyü güçlendirir.

Güvenlik ve İleri Seviye Uygulamalar: Spam Koruma ve Hata Yönetimi

Modern bir iletişim formu oluştururken işlevsellik kadar, güvenlik ve sağlam bir hata yönetimi stratejisi de hayati önem taşır. Formlar, kötü niyetli botlar için cazip hedeflerdir ve spam e-postalar, hem kullanıcı deneyimini bozar hem de sistem kaynaklarını israf eder. Bu bölümde, formunuzu spam'den koruma yollarına, kapsamlı hata yönetimine ve Resend'in şablon özelliklerini kullanarak e-posta iletişimini nasıl daha profesyonel hale getirebileceğinize değineceğiz.

Spam Botlara Karşı Mücadele: reCAPTCHA Entegrasyonu

Spam, iletişim formlarının en büyük düşmanlarından biridir. reCAPTCHA gibi araçlar, insanları botlardan ayırt etmeye yardımcı olarak formunuzu korumanın etkili bir yoludur. reCAPTCHA v2 ("Ben robot değilim" kutusu) veya reCAPTCHA v3 (arka planda çalışır, kullanıcı etkileşimi gerektirmez) kullanabilirsiniz. reCAPTCHA v3, kullanıcı deneyimini bozmadığı için genellikle tercih edilir.

reCAPTCHA v3 Entegrasyonu Adımları:

  1. Site ve Gizli Anahtar Alma: Google reCAPTCHA web sitesinden site anahtarınızı (public) ve gizli anahtarınızı (private) alın.
  2. Ortam Değişkenleri: Gizli anahtarınızı .env.local dosyasına ekleyin:
    
            NEXT_PUBLIC_RECAPTCHA_SITE_KEY=your_public_recaptcha_site_key
            RECAPTCHA_SECRET_KEY=your_secret_recaptcha_key
            


    NEXT_PUBLIC_ ön eki, site anahtarının istemci tarafında erişilebilir olmasını sağlar. Gizli anahtar ise yalnızca sunucu tarafında (API rotanızda) kullanılmalıdır.

  3. İstemci Tarafı Entegrasyonu: Form bileşeninizde (örneğin src/app/contact/page.tsx), reCAPTCHA betiğini yükleyin ve token alın. Next.js'in bileşeni ile bu işlemi kolayca yapabilirsiniz.

// src/app/contact/page.tsx içinde eklemeler
import Script from 'next/script';
// ... diğer importlar

// ... ContactPage bileşeni içinde
const [recaptchaToken, setRecaptchaToken] = useState(null);

// Formun JSX kısmında (en altta veya head içinde)