5.3 KiB
5.3 KiB
Contact Form - Email Gönderimi (Celery)
Yapılan Değişiklikler
1. Contact Model Güncellemeleri
useralanı artıknull=True, blank=True(anonim kullanıcılar da form gönderebilir)ipalanı artıknull=True, blank=True(opsiyonel)on_delete=SET_NULLolarak değiştirildi
2. Yeni Dosyalar
- contact/tasks.py: Celery task ile email gönderimi
- core/celery.py: Celery yapılandırması
- core/init.py: Celery app otomatik yükleme
- test_contact_api.py: API test scripti
3. View Güncellemeleri (contact/views.py)
permission_classes = [AllowAny]- Herkes form gönderebilir- IP adresi otomatik olarak algılanır
- Kullanıcı giriş yapmışsa user kaydedilir, yoksa None
- Contact kaydedildikten sonra Celery task ile email gönderilir
4. Serializer Güncellemeleri
- Gereksiz alanlar kaldırıldı (ip, updated_at)
- Sadece gerekli alanlar kabul edilir
Kurulum ve Çalıştırma
1. Migration Uygula (TAMAMLANDI ✅)
python manage.py makemigrations contact
python manage.py migrate contact
2. Redis'in Çalıştığından Emin Olun
Celery için Redis broker gerekli. Settings'te tanımlı:
CELERY_BROKER_URL = redis://default:1923btO**@10.80.80.70:6379/5
3. MailPit'in Çalıştığından Emin Olun
Email testleri için MailPit kullanılıyor:
- SMTP: localhost:1025
- Web UI: http://localhost:8025
MailPit başlatma (Docker):
docker run -d -p 1025:1025 -p 8025:8025 --name mailpit axllent/mailpit
4. Celery Worker Başlat
Yeni bir terminal açın ve şu komutu çalıştırın:
cd /Users/beyhan/Desktop/Projeler/Python/atabackend
source venv/bin/activate
celery -A core worker --loglevel=info
5. Django Sunucusunu Başlat
Başka bir terminal açın:
cd /Users/beyhan/Desktop/Projeler/Python/atabackend
source venv/bin/activate
python manage.py runserver
6. Test Et
# Terminal'de test script'i çalıştır
python test_contact_api.py
# Veya cURL ile
curl -X POST http://127.0.0.1:8000/api/v1/contact/create/ \
-H "Content-Type: application/json" \
-d '{
"name": "Test Kullanıcı",
"email": "test@example.com",
"subject": "Test Konusu",
"message": "Bu bir test mesajıdır."
}'
7. Email Kontrolü
- MailPit web arayüzüne gidin: http://localhost:8025
- Gönderilen emaili göreceksiniz
API Endpoint
URL: POST /api/v1/contact/create/
Permission: AllowAny (Kimlik doğrulama gerekmez)
Request Body:
{
"name": "Adınız Soyadınız",
"email": "email@example.com",
"subject": "Konu",
"message": "Mesajınız"
}
Response (201 Created):
{
"id": 1,
"name": "Adınız Soyadınız",
"email": "email@example.com",
"subject": "Konu",
"message": "Mesajınız",
"created_at": "2026-01-15T10:30:00Z"
}
Celery Task İzleme
Task Logları
Celery worker terminalinde task durumunu görebilirsiniz:
[2026-01-15 10:30:00,123: INFO/MainProcess] Task contact.tasks.send_contact_email[...] received
[2026-01-15 10:30:00,456: INFO/ForkPoolWorker-1] Task contact.tasks.send_contact_email[...] succeeded
Django Admin'den İzleme
Celery Beat ve Results kurulu, admin panelden task sonuçlarını görebilirsiniz:
Email Şablonu
Gönderilen email formatı:
Konu: Yeni İletişim Mesajı: [KONU]
Yeni bir iletişim mesajı alındı!
Gönderen: [AD SOYAD]
Email: [EMAIL]
IP Adresi: [IP]
Konu: [KONU]
Mesaj:
[MESAJ İÇERİĞİ]
---
Bu mesaj otomatik olarak gönderilmiştir.
Production Ayarları
Production'da şunları yapın:
- Email Backend'i değiştir (settings.py):
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com' # veya kendi SMTP sunucunuz
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-email@gmail.com'
EMAIL_HOST_PASSWORD = 'your-app-password'
DEFAULT_FROM_EMAIL = 'noreply@denizogur.com.tr'
- Alıcı email adresini değiştir (contact/tasks.py):
recipient_list=['info@denizogur.com.tr'] # Production email
- Redis production URL'i kullan
- Celery worker'ı production'da service olarak çalıştır
Sorun Giderme
Email Gönderilmiyor
- Celery worker çalışıyor mu? → Terminal'i kontrol edin
- Redis bağlantısı var mı? →
CELERY_BROKER_URLkontrol edin - MailPit çalışıyor mu? → http://localhost:8025 kontrol edin
Task Çalışmıyor
# Celery task'ı manuel test et
python manage.py shell
>>> from contact.tasks import send_contact_email
>>> send_contact_email.delay('Test', 'test@test.com', 'Konu', 'Mesaj', '127.0.0.1')
Celery Worker Hatası
# Celery worker'ı yeniden başlat
# Worker terminalinde Ctrl+C
# Sonra tekrar başlat:
celery -A core worker --loglevel=info
İleride Eklenebilecek Özellikler
- Email Template (HTML): Rich HTML email şablonu
- Auto-reply: Kullanıcıya otomatik teşekkür emaili
- Rate Limiting: Spam koruması için rate limiting
- File Upload: Contact formuna dosya ekleme
- Admin Notifications: Yeni mesaj geldiğinde admin bildirim
- Email Queue Retry: Email başarısız olursa yeniden deneme
Referanslar
- Celery Docs: https://docs.celeryq.dev/
- Django Celery Results: https://django-celery-results.readthedocs.io/
- MailPit: https://github.com/axllent/mailpit