# Contact Form - Email Gönderimi (Celery) ## Yapılan Değişiklikler ### 1. Contact Model Güncellemeleri - `user` alanı artık `null=True, blank=True` (anonim kullanıcılar da form gönderebilir) - `ip` alanı artık `null=True, blank=True` (opsiyonel) - `on_delete=SET_NULL` olarak 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 ✅) ```bash 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): ```bash 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: ```bash 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: ```bash cd /Users/beyhan/Desktop/Projeler/Python/atabackend source venv/bin/activate python manage.py runserver ``` ### 6. Test Et ```bash # 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**: ```json { "name": "Adınız Soyadınız", "email": "email@example.com", "subject": "Konu", "message": "Mesajınız" } ``` **Response** (201 Created): ```json { "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: - http://127.0.0.1:8000/admin/django_celery_results/ ## 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: 1. **Email Backend'i değiştir** (settings.py): ```python 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' ``` 2. **Alıcı email adresini değiştir** (contact/tasks.py): ```python recipient_list=['info@denizogur.com.tr'] # Production email ``` 3. **Redis production URL'i kullan** 4. **Celery worker'ı production'da service olarak çalıştır** ## Sorun Giderme ### Email Gönderilmiyor 1. Celery worker çalışıyor mu? → Terminal'i kontrol edin 2. Redis bağlantısı var mı? → `CELERY_BROKER_URL` kontrol edin 3. MailPit çalışıyor mu? → http://localhost:8025 kontrol edin ### Task Çalışmıyor ```bash # 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ı ```bash # Celery worker'ı yeniden başlat # Worker terminalinde Ctrl+C # Sonra tekrar başlat: celery -A core worker --loglevel=info ``` ## İleride Eklenebilecek Özellikler 1. **Email Template (HTML)**: Rich HTML email şablonu 2. **Auto-reply**: Kullanıcıya otomatik teşekkür emaili 3. **Rate Limiting**: Spam koruması için rate limiting 4. **File Upload**: Contact formuna dosya ekleme 5. **Admin Notifications**: Yeni mesaj geldiğinde admin bildirim 6. **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