{"id":43271,"date":"2026-07-12T09:08:22","date_gmt":"2026-07-12T06:08:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/"},"modified":"2026-07-12T09:08:22","modified_gmt":"2026-07-12T06:08:22","slug":"fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/","title":{"rendered":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?"},"content":{"rendered":"<h2>FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k ve \u00fcretim) aras\u0131nda tutarl\u0131 ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi hayati \u00f6neme sahiptir. \u00d6zellikle e-posta g\u00f6nderimi gibi kritik fonksiyonlarda, yanl\u0131\u015fl\u0131kla \u00fcretimdeki kullan\u0131c\u0131lara test e-postalar\u0131 g\u00f6ndermek ciddi sorunlara yol a\u00e7abilir. Bu makale, FastAPI (h\u0131zl\u0131 ve modern bir Python web framework&#8217;\u00fc) kullanarak, Git branch&#8217;lerine (dallar\u0131na) \u00f6zel e-posta izolasyonunu nas\u0131l sa\u011flayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r. B\u00f6ylece, geli\u015ftirme s\u00fcre\u00e7lerinizde tam kontrol sa\u011flayacak ve beklenmedik durumlar\u0131n \u00f6n\u00fcne ge\u00e7eceksiniz.<\/p>\n<h3>Giri\u015f: Geli\u015ftirme Ortamlar\u0131ndan Yanl\u0131\u015fl\u0131kla G\u00f6nderilen E-postalar Kabusunuz Mu?<\/h3>\n<p>Bir web uygulamas\u0131 geli\u015ftirirken, s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan ve geli\u015ftiricilerin uykular\u0131n\u0131 ka\u00e7\u0131rabilen senaryolardan biri, test veya geli\u015ftirme ortam\u0131ndan yanl\u0131\u015fl\u0131kla ger\u00e7ek kullan\u0131c\u0131lara e-posta g\u00f6nderilmesidir. \u00d6rne\u011fin, yeni bir \u00f6zellik \u00fczerinde \u00e7al\u0131\u015f\u0131rken veya bir hata d\u00fczeltmesi yaparken, uygulaman\u0131z\u0131n e-posta g\u00f6nderme fonksiyonunu test etmeniz gerekebilir. Bu testler s\u0131ras\u0131nda, kullan\u0131c\u0131lara &#8220;Hesab\u0131n\u0131z ba\u015far\u0131yla olu\u015fturuldu&#8221; veya &#8220;\u015eifreniz s\u0131f\u0131rland\u0131&#8221; gibi otomatik e-postalar\u0131n gitmesi, hem kullan\u0131c\u0131 deneyimini olumsuz etkiler hem de \u015firketinizin itibar\u0131n\u0131 zedeler. Bu t\u00fcr durumlar, \u00f6zellikle b\u00fcy\u00fck ekiplerde ve karma\u015f\u0131k CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) s\u00fcre\u00e7lerinde daha da riskli hale gelir.<\/p>\n<p>Peki, bu kabusu nas\u0131l \u00f6nleyebiliriz? \u00c7\u00f6z\u00fcm, farkl\u0131 geli\u015ftirme dallar\u0131na (Git branch&#8217;lerine) \u00f6zel e-posta yap\u0131land\u0131rmalar\u0131 olu\u015fturmak ve bu yap\u0131land\u0131rmalar\u0131 ortam de\u011fi\u015fkenleri (environment variables) arac\u0131l\u0131\u011f\u0131yla y\u00f6netmektir. Bu yakla\u015f\u0131m, uygulaman\u0131z\u0131n hangi ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 alg\u0131lamas\u0131na ve e-postalar\u0131 buna g\u00f6re y\u00f6nlendirmesine olanak tan\u0131r. \u00d6rne\u011fin, <code>main<\/code> (ana) branch&#8217;inden yap\u0131lan da\u011f\u0131t\u0131mlarda e-postalar ger\u00e7ek kullan\u0131c\u0131lara giderken, <code>develop<\/code> (geli\u015ftirme) veya bir \u00f6zellik branch&#8217;inden yap\u0131lan da\u011f\u0131t\u0131mlarda e-postalar belirli bir test e-posta adresine veya bir e-posta yakalama servisine (\u00f6rne\u011fin Mailtrap veya MailHog) y\u00f6nlendirilebilir. Bu sayede, geli\u015ftiriciler ve test uzmanlar\u0131, \u00fcretim ortam\u0131n\u0131 riske atmadan e-posta fonksiyonlar\u0131n\u0131 g\u00fcvenle test edebilirler.<\/p>\n<p>FastAPI, modern Python geli\u015ftirmenin sundu\u011fu h\u0131z ve verimlilikle bu t\u00fcr bir ortam izolasyonunu kolayca uygulaman\u0131za olanak tan\u0131r. Pydantic tabanl\u0131 ayar y\u00f6netimi ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (dependency injection) gibi \u00f6zellikler sayesinde, uygulaman\u0131z\u0131n yap\u0131land\u0131rmas\u0131n\u0131 esnek bir \u015fekilde y\u00f6netebilir ve e-posta g\u00f6nderim mant\u0131\u011f\u0131n\u0131 ortam\u0131n\u0131za g\u00f6re dinamik olarak de\u011fi\u015ftirebilirsiniz. Bu makalede, bu izolasyonu sa\u011flamak i\u00e7in gerekli ad\u0131mlar\u0131, kod \u00f6rnekleriyle birlikte detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Amac\u0131m\u0131z, geli\u015ftirme s\u00fcre\u00e7lerinizi daha g\u00fcvenli, daha \u00f6ng\u00f6r\u00fclebilir ve daha verimli hale getirmektir. Unutmay\u0131n, iyi yap\u0131land\u0131r\u0131lm\u0131\u015f bir uygulama, sadece h\u0131zl\u0131 \u00e7al\u0131\u015fmakla kalmaz, ayn\u0131 zamanda beklenmedik hatalara kar\u015f\u0131 da diren\u00e7li olur.<\/p>\n<h3>Temel Kavramlar: FastAPI, Git Branch&#8217;leri ve Ortam De\u011fi\u015fkenleri Neden \u00d6nemli?<\/h3>\n<p>Konumuza dalmadan \u00f6nce, e-posta izolasyonu stratejimizin temelini olu\u015fturan birka\u00e7 \u00f6nemli kavram\u0131 k\u0131saca g\u00f6zden ge\u00e7irelim. Bu kavramlar, \u00f6zellikle konuya yeni ba\u015flayanlar i\u00e7in yol g\u00f6sterici olacakt\u0131r.<\/p>\n<ul>\n<li>\n        <strong>FastAPI:<\/strong> Modern ve y\u00fcksek performansl\u0131 bir web framework&#8217;\u00fc (yaz\u0131l\u0131m \u00e7at\u0131s\u0131) olan FastAPI, Python&#8217;\u0131n tip ipu\u00e7lar\u0131n\u0131 (type hints) kullanarak API&#8217;ler olu\u015fturmay\u0131 son derece h\u0131zl\u0131 ve kolay hale getirir. Pydantic ile veri do\u011frulama (data validation) ve serile\u015ftirme (serialization) yeteneklerini birle\u015ftirmesi, geli\u015ftiricilere sa\u011flam ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirme imkan\u0131 sunar. Ayr\u0131ca, otomatik etkile\u015fimli API belgeleri (Swagger UI ve ReDoc) sayesinde geli\u015ftirme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.\n    <\/li>\n<li>\n        <strong>Git Branch&#8217;leri (Dallar\u0131):<\/strong> Git, da\u011f\u0131t\u0131k bir versiyon kontrol sistemidir. Branch&#8217;ler ise, bir projenin ana kod taban\u0131ndan (genellikle <code>main<\/code> veya <code>master<\/code> branch&#8217;i) ayr\u0131lan ba\u011f\u0131ms\u0131z geli\u015ftirme hatlar\u0131d\u0131r. Bu sayede, farkl\u0131 \u00f6zellikler veya hata d\u00fczeltmeleri paralel olarak geli\u015ftirilebilir ve ana kod taban\u0131n\u0131 etkilemeden test edilebilir. Geli\u015ftirme tamamland\u0131\u011f\u0131nda, branch&#8217;ler ana branch&#8217;e geri birle\u015ftirilir (merge edilir). Bu yap\u0131, farkl\u0131 ortamlar i\u00e7in farkl\u0131 e-posta yap\u0131land\u0131rmalar\u0131 belirlememizin temelini olu\u015fturur. \u00d6rne\u011fin, <code>develop<\/code> branch&#8217;i geli\u015ftirme ortam\u0131na, <code>main<\/code> branch&#8217;i ise \u00fcretim ortam\u0131na kar\u015f\u0131l\u0131k gelebilir.\n    <\/li>\n<li>\n        <strong>Ortam De\u011fi\u015fkenleri (Environment Variables):<\/strong> Uygulama yap\u0131land\u0131rmalar\u0131n\u0131 (veritaban\u0131 ba\u011flant\u0131 bilgileri, API anahtarlar\u0131, e-posta sunucu bilgileri vb.) koddan ayr\u0131 tutman\u0131n standart ve g\u00fcvenli bir yoludur. Ortam de\u011fi\u015fkenleri, uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u015fletim sistemi veya konteyner seviyesinde tan\u0131mlan\u0131r. Bu sayede, ayn\u0131 kod taban\u0131 farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) farkl\u0131 yap\u0131land\u0131rmalarla \u00e7al\u0131\u015fabilir. Bizim senaryomuzda, bu de\u011fi\u015fkenler arac\u0131l\u0131\u011f\u0131yla uygulaman\u0131n hangi ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 belirleyecek ve e-posta g\u00f6nderimini buna g\u00f6re y\u00f6netece\u011fiz. \u00d6rne\u011fin, bir <code>ENVIRONMENT<\/code> de\u011fi\u015fkeni <code>development<\/code>, <code>staging<\/code> veya <code>production<\/code> gibi de\u011ferler alabilir. Bu, e-posta izolasyonunu sa\u011flamak i\u00e7in kritik bir ad\u0131md\u0131r.\n    <\/li>\n<\/ul>\n<p>Bu temel kavramlar\u0131 anlamak, FastAPI uygulaman\u0131zda branch bazl\u0131 e-posta izolasyonunu ba\u015far\u0131l\u0131 bir \u015fekilde uygulaman\u0131z i\u00e7in sa\u011flam bir zemin olu\u015fturacakt\u0131r. \u015eimdi, bu kavramlar\u0131 pratik bir \u015fekilde nas\u0131l bir araya getirece\u011fimize ge\u00e7ebiliriz.<\/p>\n<h3>Yap\u0131land\u0131rma Y\u00f6netimi: Pydantic Settings ile Esnek Ortam Ayarlar\u0131<\/h3>\n<p>Uygulamam\u0131z\u0131n farkl\u0131 ortamlarda (development, staging, production) farkl\u0131 davran\u0131\u015flar sergilemesini sa\u011flaman\u0131n ilk ad\u0131m\u0131, esnek ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi sistemine sahip olmakt\u0131r. FastAPI, Pydantic&#8217;in <code>BaseSettings<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak bu ihtiyac\u0131 m\u00fckemmel bir \u015fekilde kar\u015f\u0131lar. <code>BaseSettings<\/code>, ortam de\u011fi\u015fkenlerinden veya <code>.env<\/code> dosyalar\u0131ndan ayarlar\u0131 otomatik olarak y\u00fckleyebilir, bu da yap\u0131land\u0131rma y\u00f6netimini olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>\u00d6ncelikle, projemizin k\u00f6k dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015ftural\u0131m. Bu dosya, yerel geli\u015ftirme ortam\u0131m\u0131z i\u00e7in varsay\u0131lan ayarlar\u0131 i\u00e7erecektir. Daha sonra, bu ayarlar\u0131 FastAPI uygulamam\u0131zda kullanmak \u00fczere bir <code>config.py<\/code> mod\u00fcl\u00fc tan\u0131mlayaca\u011f\u0131z.<\/p>\n<p><code>.env<\/code> dosyan\u0131z a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnebilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nENVIRONMENT=\"development\"\nSMTP_SERVER=\"smtp.mailtrap.io\"\nSMTP_PORT=2525\nSMTP_USERNAME=\"your_mailtrap_username\"\nSMTP_PASSWORD=\"your_mailtrap_password\"\nEMAIL_SENDER=\"no-reply@mydevapp.com\"\nEMAIL_OVERRIDE_RECIPIENT=\"dev-inbox@example.com\"\n<\/code><\/pre>\n<\/div>\n<p>Burada <code>ENVIRONMENT<\/code> de\u011fi\u015fkeni, uygulaman\u0131n hangi ortamda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 belirtir. <code>EMAIL_OVERRIDE_RECIPIENT<\/code> ise, geli\u015ftirme veya test ortamlar\u0131nda e-postalar\u0131n g\u00f6nderilece\u011fi \u00f6zel adresi tan\u0131mlar. \u00dcretim ortam\u0131nda bu de\u011fi\u015fkeni bo\u015f b\u0131rakabilir veya farkl\u0131 bir de\u011fer atayabiliriz.<\/p>\n<p>\u015eimdi <code>config.py<\/code> dosyam\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom pydantic import BaseSettings, Field\nfrom enum import Enum\n\nclass Environment(str, Enum):\n    DEVELOPMENT = \"development\"\n    STAGING = \"staging\"\n    PRODUCTION = \"production\"\n\nclass Settings(BaseSettings):\n    ENVIRONMENT: Environment = Field(..., env=\"ENVIRONMENT\")\n    SMTP_SERVER: str = Field(..., env=\"SMTP_SERVER\")\n    SMTP_PORT: int = Field(..., env=\"SMTP_PORT\")\n    SMTP_USERNAME: str = Field(..., env=\"SMTP_USERNAME\")\n    SMTP_PASSWORD: str = Field(..., env=\"SMTP_PASSWORD\")\n    EMAIL_SENDER: str = Field(..., env=\"EMAIL_SENDER\")\n    EMAIL_OVERRIDE_RECIPIENT: str | None = Field(None, env=\"EMAIL_OVERRIDE_RECIPIENT\")\n\n    class Config:\n        env_file = \".env\"\n        env_file_encoding = \"utf-8\"\n\n# Ayarlar\u0131 y\u00fckle\nsettings = Settings()\n<\/code><\/pre>\n<\/div>\n<p>Bu kodda:<\/p>\n<ul>\n<li><code>Environment<\/code> ad\u0131nda bir <code>Enum<\/code> (numaraland\u0131rma) s\u0131n\u0131f\u0131 tan\u0131mlad\u0131k. Bu, ortam t\u00fcrlerini daha okunakl\u0131 ve hata olas\u0131l\u0131\u011f\u0131 d\u00fc\u015f\u00fck bir \u015fekilde y\u00f6netmemizi sa\u011flar.<\/li>\n<li><code>Settings<\/code> s\u0131n\u0131f\u0131, <code>BaseSettings<\/code>&#8216;ten t\u00fcretilmi\u015ftir. Her bir ayar i\u00e7in Pydantic alanlar\u0131 (<code>Field<\/code>) tan\u0131mlad\u0131k. <code>Field<\/code> fonksiyonu, ortam de\u011fi\u015fkeni ad\u0131n\u0131 (<code>env<\/code> parametresi) belirtmemize olanak tan\u0131r.<\/li>\n<li><code>EMAIL_OVERRIDE_RECIPIENT<\/code> alan\u0131 <code>str | None<\/code> (iste\u011fe ba\u011fl\u0131 string) olarak tan\u0131mlanm\u0131\u015ft\u0131r, \u00e7\u00fcnk\u00fc \u00fcretim ortam\u0131nda bu de\u011ferin olmamas\u0131 veya kullan\u0131lmamas\u0131 beklenebilir.<\/li>\n<li><code>Config<\/code> s\u0131n\u0131f\u0131 i\u00e7inde <code>env_file=\".env\"<\/code> ayar\u0131, Pydantic&#8217;in <code>.env<\/code> dosyas\u0131ndan ayarlar\u0131 otomatik olarak y\u00fcklemesini sa\u011flar.<\/li>\n<\/ul>\n<p>Bu yap\u0131land\u0131rma sayesinde, uygulaman\u0131z ba\u015flad\u0131\u011f\u0131nda <code>settings<\/code> nesnesi, ortam de\u011fi\u015fkenlerinden veya <code>.env<\/code> dosyas\u0131ndan y\u00fcklenen g\u00fcncel de\u011ferlerle doldurulacakt\u0131r. Bu, farkl\u0131 branch&#8217;ler veya da\u011f\u0131t\u0131m ortamlar\u0131 i\u00e7in kolayca farkl\u0131 ayarlar kullanabilece\u011fimiz anlam\u0131na gelir. \u00d6rne\u011fin, \u00fcretim ortam\u0131nda <code>ENVIRONMENT=\"production\"<\/code> ve <code>EMAIL_OVERRIDE_RECIPIENT<\/code> bo\u015f olacak \u015fekilde ortam de\u011fi\u015fkenleri ayarlanabilirken, geli\u015ftirme ortam\u0131nda <code>ENVIRONMENT=\"development\"<\/code> ve belirli bir test e-posta adresi kullan\u0131labilir.<\/p>\n<h3>E-posta Servisi Entegrasyonu: FastAPI&#8217;da Ko\u015fullu E-posta G\u00f6nderimi<\/h3>\n<p>Yap\u0131land\u0131rma ayarlar\u0131m\u0131z\u0131 tan\u0131mlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi FastAPI uygulamam\u0131zda e-posta g\u00f6nderme i\u015flevselli\u011fini nas\u0131l entegre edece\u011fimizi ve bu i\u015flevselli\u011fi ortam de\u011fi\u015fkenlerimize g\u00f6re nas\u0131l ko\u015fulland\u0131raca\u011f\u0131m\u0131z\u0131 inceleyelim. Bu b\u00f6l\u00fcmde, Python&#8217;da e-posta g\u00f6nderimi i\u00e7in pop\u00fcler bir k\u00fct\u00fcphane olan <code>fastapi-mail<\/code>&#8216;i kullanaca\u011f\u0131z. Bu k\u00fct\u00fcphane, FastAPI ile entegrasyonu kolayla\u015ft\u0131r\u0131r ve asenkron e-posta g\u00f6nderimini destekler.<\/p>\n<p>\u00d6ncelikle, <code>fastapi-mail<\/code> k\u00fct\u00fcphanesini projenize eklemeniz gerekir:<\/p>\n<div class=\"code-container\">\n<pre><code>\npip install fastapi-mail\n<\/code><\/pre>\n<\/div>\n<p>\u015eimdi <code>email_service.py<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve e-posta g\u00f6nderme mant\u0131\u011f\u0131n\u0131 buraya yerle\u015ftirelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom fastapi_mail import FastMail, MessageSchema, ConnectionConfig\nfrom fastapi import BackgroundTasks\nfrom pydantic import EmailStr\nfrom config import settings, Environment\n\nclass EmailService:\n    def __init__(self):\n        self.conf = ConnectionConfig(\n            MAIL_USERNAME=settings.SMTP_USERNAME,\n            MAIL_PASSWORD=settings.SMTP_PASSWORD,\n            MAIL_FROM=settings.EMAIL_SENDER,\n            MAIL_PORT=settings.SMTP_PORT,\n            MAIL_SERVER=settings.SMTP_SERVER,\n            MAIL_TLS=True,\n            MAIL_SSL=False,\n            USE_CREDENTIALS=True,\n            VALIDATE_CERTS=True\n        )\n        self.fm = FastMail(self.conf)\n\n    async def send_email(self, recipient: EmailStr, subject: str, body: str, background_tasks: BackgroundTasks):\n        actual_recipient = recipient\n        if settings.ENVIRONMENT != Environment.PRODUCTION and settings.EMAIL_OVERRIDE_RECIPIENT:\n            # Geli\u015ftirme veya haz\u0131rl\u0131k ortam\u0131ndaysak ve bir override adresi tan\u0131ml\u0131ysa\n            # e-postay\u0131 o adrese y\u00f6nlendir.\n            actual_recipient = EmailStr(settings.EMAIL_OVERRIDE_RECIPIENT)\n            print(f\"[{settings.ENVIRONMENT.value.upper()} ENV] E-posta '{recipient}' yerine '{actual_recipient}' adresine y\u00f6nlendirildi.\")\n        elif settings.ENVIRONMENT == Environment.PRODUCTION:\n            print(f\"[PRODUCTION ENV] E-posta '{recipient}' adresine g\u00f6nderiliyor.\")\n        else:\n            # Di\u011fer durumlar (\u00f6rn. EMAIL_OVERRIDE_RECIPIENT tan\u0131ml\u0131 de\u011filse)\n            print(f\"[{settings.ENVIRONMENT.value.upper()} ENV] E-posta '{recipient}' adresine g\u00f6nderiliyor (override yok).\")\n\n\n        message = MessageSchema(\n            subject=subject,\n            recipients=[actual_recipient],\n            body=body,\n            subtype=\"html\"\n        )\n        \n        # E-postay\u0131 arka planda g\u00f6nder\n        background_tasks.add_task(self.fm.send_message, message)\n        return {\"message\": \"Email sent in the background\"}\n\n# E-posta servisi \u00f6rne\u011fini olu\u015ftur\nemail_service = EmailService()\n<\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011funda:<\/p>\n<ul>\n<li><code>EmailService<\/code> s\u0131n\u0131f\u0131, <code>fastapi-mail<\/code> i\u00e7in ba\u011flant\u0131 yap\u0131land\u0131rmas\u0131n\u0131 (<code>ConnectionConfig<\/code>) i\u00e7erir. Ayarlar\u0131 do\u011frudan <code>config.py<\/code> dosyam\u0131zdan al\u0131r.<\/li>\n<li><code>send_email<\/code> metodu, as\u0131l e-posta g\u00f6nderme mant\u0131\u011f\u0131n\u0131 bar\u0131nd\u0131r\u0131r. Burada kritik nokta, <code>settings.ENVIRONMENT<\/code> ve <code>settings.EMAIL_OVERRIDE_RECIPIENT<\/code> de\u011fi\u015fkenlerini kontrol etmemizdir.<\/li>\n<li>E\u011fer ortam \u00fcretim de\u011filse (<code>PRODUCTION<\/code>) ve <code>EMAIL_OVERRIDE_RECIPIENT<\/code> tan\u0131mlanm\u0131\u015fsa, e-posta as\u0131l al\u0131c\u0131 yerine bu override adresine g\u00f6nderilir. Bu, geli\u015ftirme ve test s\u00fcre\u00e7lerinde yanl\u0131\u015fl\u0131kla ger\u00e7ek kullan\u0131c\u0131lara e-posta g\u00f6nderilmesini engeller.<\/li>\n<li><code>background_tasks.add_task<\/code> kullanarak e-postay\u0131 arka planda g\u00f6nderiyoruz. Bu, API \u00e7a\u011fr\u0131s\u0131n\u0131n e-posta g\u00f6nderme i\u015fleminin bitmesini beklemeden h\u0131zl\u0131ca yan\u0131t vermesini sa\u011flar, kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/li>\n<\/ul>\n<p>\u015eimdi bu e-posta servisini FastAPI uygulamam\u0131zda nas\u0131l kullanaca\u011f\u0131m\u0131za bakal\u0131m. <code>main.py<\/code> dosyan\u0131z a\u015fa\u011f\u0131daki gibi olabilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom fastapi import FastAPI, BackgroundTasks, HTTPException\nfrom pydantic import EmailStr\nfrom email_service import email_service\nfrom config import settings\n\napp = FastAPI()\n\n@app.get(\"\/\")\nasync def root():\n    return {\"message\": f\"Welcome to FastAPI Email Service - Environment: {settings.ENVIRONMENT.value}\"}\n\n@app.post(\"\/send-test-email\/\")\nasync def send_test_email(\n    recipient: EmailStr,\n    subject: str,\n    body: str,\n    background_tasks: BackgroundTasks\n):\n    try:\n        await email_service.send_email(recipient, subject, body, background_tasks)\n        return {\"status\": \"success\", \"message\": \"Email scheduled for sending.\"}\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=f\"Email sending failed: {str(e)}\")\n\n<\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>\/send-test-email\/<\/code> endpoint&#8217;i, e-posta g\u00f6ndermek i\u00e7in <code>EmailService<\/code>&#8216;i kullan\u0131r. <code>recipient<\/code> parametresi ile belirtilen al\u0131c\u0131ya, ortam ayarlar\u0131m\u0131za g\u00f6re ya do\u011frudan ya da <code>EMAIL_OVERRIDE_RECIPIENT<\/code> adresine y\u00f6nlendirilerek e-posta g\u00f6nderilir. Bu sayede, farkl\u0131 Git branch&#8217;leri \u00fczerinde \u00e7al\u0131\u015f\u0131rken, her branch&#8217;in kendi ortam de\u011fi\u015fkenleri ile tetikleyece\u011fi e-posta davran\u0131\u015f\u0131n\u0131 kolayca izole etmi\u015f oluyoruz.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryosu: CI\/CD ile Branch Bazl\u0131 E-posta \u0130zolasyonunu Otomatikle\u015ftirmek<\/h3>\n<p>E-posta izolasyonunu manuel olarak y\u00f6netmek, k\u00fc\u00e7\u00fck projeler i\u00e7in yeterli olabilir ancak b\u00fcy\u00fck ekiplerde ve karma\u015f\u0131k geli\u015ftirme s\u00fcre\u00e7lerinde s\u00fcrd\u00fcr\u00fclebilir de\u011fildir. \u0130\u015fte bu noktada CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatlar\u0131 devreye girer. CI\/CD, yaz\u0131l\u0131m teslimat\u0131n\u0131 otomatikle\u015ftiren bir dizi uygulamad\u0131r ve ortam de\u011fi\u015fkenlerini dinamik olarak ayarlamak i\u00e7in m\u00fckemmel bir platform sunar.<\/p>\n<p>Bir CI\/CD boru hatt\u0131, bir Git branch&#8217;ine yap\u0131lan her push veya merge i\u015flemi sonras\u0131nda otomatik olarak tetiklenebilir. \u00d6rne\u011fin, GitHub Actions, GitLab CI\/CD, Jenkins veya Azure DevOps gibi ara\u00e7lar, da\u011f\u0131t\u0131m s\u0131ras\u0131nda ortam de\u011fi\u015fkenlerini (<code>ENVIRONMENT<\/code>, <code>EMAIL_OVERRIDE_RECIPIENT<\/code> vb.) ayarlaman\u0131za olanak tan\u0131r. Bu sayede, her branch&#8217;in kendi amac\u0131na uygun e-posta davran\u0131\u015f\u0131n\u0131 otomatik olarak sa\u011flam\u0131\u015f oluruz.<\/p>\n<p><strong>Vaka Analizi: E-ticaret Uygulamas\u0131 Geli\u015ftirme S\u00fcreci<\/strong><\/p>\n<p>Hayali bir e-ticaret \u015firketinin FastAPI tabanl\u0131 bir sipari\u015f y\u00f6netim sistemi geli\u015ftirdi\u011fini varsayal\u0131m. Bu sistem, kullan\u0131c\u0131lara sipari\u015f onaylar\u0131, kargo g\u00fcncellemeleri ve \u015fifre s\u0131f\u0131rlama gibi \u00e7e\u015fitli e-postalar g\u00f6nderiyor. \u015eirketin \u00fc\u00e7 ana Git branch&#8217;i ve bunlara kar\u015f\u0131l\u0131k gelen da\u011f\u0131t\u0131m ortamlar\u0131 var:<\/p>\n<ol>\n<li>\n        <strong><code>main<\/code> Branch (\u00dcretim Ortam\u0131):<\/strong> Bu branch&#8217;ten yap\u0131lan da\u011f\u0131t\u0131mlar, ger\u00e7ek kullan\u0131c\u0131lara e-posta g\u00f6nderir. Ortam de\u011fi\u015fkenleri: <code>ENVIRONMENT=production<\/code>, <code>EMAIL_OVERRIDE_RECIPIENT<\/code> bo\u015f.\n    <\/li>\n<li>\n        <strong><code>develop<\/code> Branch (Haz\u0131rl\u0131k\/Staging Ortam\u0131):<\/strong> Yeni \u00f6zelliklerin ve hata d\u00fczeltmelerinin bir araya getirildi\u011fi ve son testlerin yap\u0131ld\u0131\u011f\u0131 ortamd\u0131r. Bu branch&#8217;ten g\u00f6nderilen e-postalar\u0131n, ger\u00e7ek kullan\u0131c\u0131lara gitmemesi gerekir. Bunun yerine, \u015firket i\u00e7i test ekibinin kulland\u0131\u011f\u0131 bir Mailtrap veya MailHog test gelen kutusuna y\u00f6nlendirilmelidir. Ortam de\u011fi\u015fkenleri: <code>ENVIRONMENT=staging<\/code>, <code>EMAIL_OVERRIDE_RECIPIENT=staging-inbox@example.com<\/code>.\n    <\/li>\n<li>\n        <strong><code>feature\/X<\/code> Branch&#8217;leri (Geli\u015ftirme Ortam\u0131):<\/strong> Geli\u015ftiricilerin yeni \u00f6zellikler \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 bireysel branch&#8217;lerdir. Bu branch&#8217;lerden yap\u0131lan da\u011f\u0131t\u0131mlar genellikle yerel geli\u015ftirme ortamlar\u0131nda veya ki\u015fisel test sunucular\u0131nda ger\u00e7ekle\u015fir. E-postalar\u0131n geli\u015ftiricinin kendi test gelen kutusuna veya bir Mailtrap sanal sunucusuna gitmesi istenir. Ortam de\u011fi\u015fkenleri: <code>ENVIRONMENT=development<\/code>, <code>EMAIL_OVERRIDE_RECIPIENT=dev-user-x@example.com<\/code> (veya genel bir test adresi).\n    <\/li>\n<\/ol>\n<p>Bu senaryoda, CI\/CD boru hatt\u0131 her branch i\u00e7in farkl\u0131 ortam de\u011fi\u015fkenleri setini uygulayacakt\u0131r. \u00d6rne\u011fin, GitHub Actions&#8217;ta, bir i\u015f ak\u0131\u015f\u0131 (workflow) dosyas\u0131 (<code>.github\/workflows\/deploy.yml<\/code>) a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131r\u0131labilir:<\/p>\n<div class=\"code-container\">\n<pre><code>\n# \u00d6rnek GitHub Actions yap\u0131land\u0131rmas\u0131 (pseudo kod)\nname: Deploy FastAPI App\n\non:\n  push:\n    branches:\n      - main\n      - develop\n      - feature\/*\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v2\n    - name: Set up Python\n      uses: actions\/setup-python@v2\n      with:\n        python-version: '3.9'\n    - name: Install dependencies\n      run: pip install -r requirements.txt\n\n    - name: Determine Environment and Email Override\n      id: set_env_vars\n      run: |\n        if [[ \"${{ github.ref }}\" == \"refs\/heads\/main\" ]]; then\n          echo \"ENVIRONMENT=production\" >> $GITHUB_ENV\n          echo \"EMAIL_OVERRIDE_RECIPIENT=\" >> $GITHUB_ENV # \u00dcretimde override yok\n        elif [[ \"${{ github.ref }}\" == \"refs\/heads\/develop\" ]]; then\n          echo \"ENVIRONMENT=staging\" >> $GITHUB_ENV\n          echo \"EMAIL_OVERRIDE_RECIPIENT=staging-inbox@example.com\" >> $GITHUB_ENV\n        elif [[ \"${{ github.ref }}\" == refs\/heads\/feature\/* ]]; then\n          echo \"ENVIRONMENT=development\" >> $GITHUB_ENV\n          echo \"EMAIL_OVERRIDE_RECIPIENT=feature-test-inbox@example.com\" >> $GITHUB_ENV\n        fi\n    \n    - name: Deploy to Server\n      run: |\n        # Ortam de\u011fi\u015fkenleri ayarland\u0131, \u015fimdi uygulama da\u011f\u0131t\u0131labilir\n        # \u00d6rne\u011fin, Docker imaj\u0131 olu\u015fturup sunucuya g\u00f6nderme\n        echo \"Deploying ${{ env.ENVIRONMENT }} environment...\"\n        # Your deployment commands here\n<\/code><\/pre>\n<\/div>\n<p>Bu basit \u00f6rnek, CI\/CD&#8217;nin Git branch&#8217;ine g\u00f6re ortam de\u011fi\u015fkenlerini nas\u0131l dinamik olarak ayarlayabilece\u011fini g\u00f6stermektedir. Bu sayede, uygulaman\u0131n e-posta g\u00f6nderme mant\u0131\u011f\u0131, hangi branch&#8217;ten da\u011f\u0131t\u0131m yap\u0131ld\u0131\u011f\u0131na ba\u011fl\u0131 olarak otomatikman do\u011fru al\u0131c\u0131ya y\u00f6nlendirilir. B\u00f6ylece, geli\u015ftiriciler g\u00fcvenle test yapabilir, y\u00f6neticiler ise yanl\u0131\u015f e-posta g\u00f6nderimi riskini minimize etmi\u015f olurlar.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve En \u0130yi Pratikler: G\u00fcvenlik ve Test Edilebilirlik<\/h3>\n<p>FastAPI uygulaman\u0131zda branch bazl\u0131 e-posta izolasyonunu uygularken, daha sa\u011flam, g\u00fcvenli ve bak\u0131m\u0131 kolay bir sistem i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi pratikleri g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. Bu yakla\u015f\u0131mlar, sadece mevcut sorunlar\u0131 \u00e7\u00f6zmekle kalmay\u0131p, gelecekteki geli\u015ftirmeler i\u00e7in de g\u00fc\u00e7l\u00fc bir temel olu\u015fturacakt\u0131r.<\/p>\n<p><strong>1. Hassas Bilgilerin G\u00fcvenli\u011fi (Secrets Management):<\/strong><\/p>\n<p>E-posta sunucusu kullan\u0131c\u0131 ad\u0131 ve \u015fifresi gibi bilgiler hassas verilerdir. Bu bilgileri do\u011frudan <code>.env<\/code> dosyalar\u0131nda tutmak, \u00f6zellikle \u00fcretim ortam\u0131nda, g\u00fcvenlik riski ta\u015f\u0131yabilir. Bunun yerine, \u015fu y\u00f6ntemleri kullanmak daha g\u00fcvenlidir:<\/p>\n<ul>\n<li>\n        <strong>Ortam De\u011fi\u015fkenleri:<\/strong> \u00dcretim ortam\u0131nda, bu bilgileri do\u011frudan sunucu seviyesinde ortam de\u011fi\u015fkenleri olarak tan\u0131mlay\u0131n. CI\/CD ara\u00e7lar\u0131 (GitHub Actions Secrets, GitLab CI\/CD Variables) veya bulut sa\u011flay\u0131c\u0131lar\u0131n (AWS Secrets Manager, Azure Key Vault, Google Secret Manager) sundu\u011fu gizli anahtar y\u00f6netim servislerini kullan\u0131n. Bu sayede hassas veriler kod taban\u0131ndan tamamen ayr\u0131l\u0131r ve daha g\u00fcvenli bir \u015fekilde saklan\u0131r.\n    <\/li>\n<li>\n        <strong>Docker Secrets:<\/strong> Uygulaman\u0131z\u0131 Docker konteynerlerinde \u00e7al\u0131\u015ft\u0131r\u0131yorsan\u0131z, Docker Secrets kullanarak hassas bilgileri g\u00fcvenli bir \u015fekilde y\u00f6netebilirsiniz.\n    <\/li>\n<\/ul>\n<p><strong>2. E-posta \u015eablonlar\u0131 ve Dinamik \u0130\u00e7erik:<\/strong><\/p>\n<p>E-postalar\u0131n i\u00e7eri\u011fini do\u011frudan kod i\u00e7inde tutmak yerine, Jinja2 gibi \u015fablon motorlar\u0131 kullanarak e-posta \u015fablonlar\u0131 olu\u015fturmak daha esnektir. Bu \u015fablonlar, farkl\u0131 dilleri veya dinamik verileri (kullan\u0131c\u0131 ad\u0131, sipari\u015f bilgileri vb.) kolayca destekleyebilir. <code>fastapi-mail<\/code> k\u00fct\u00fcphanesi, Jinja2 \u015fablonlar\u0131n\u0131 destekler, bu da e-posta i\u00e7eri\u011fini daha d\u00fczenli ve y\u00f6netilebilir hale getirir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# email_service.py i\u00e7inde:\nfrom fastapi_mail import MessageSchema, FastMail, ConnectionConfig\nfrom jinja2 import Environment, FileSystemLoader\n\n# Jinja2 ortam\u0131n\u0131 yap\u0131land\u0131rma\ntemplates = Environment(loader=FileSystemLoader(\"templates\"))\n\nasync def send_templated_email(self, recipient: EmailStr, subject: str, template_name: str, context: dict, background_tasks: BackgroundTasks):\n    template = templates.get_template(template_name)\n    body = template.render(context)\n    \n    # ... mevcut ko\u015fullu g\u00f6nderim mant\u0131\u011f\u0131 ...\n    \n    message = MessageSchema(\n        subject=subject,\n        recipients=[actual_recipient],\n        body=body,\n        subtype=\"html\"\n    )\n    background_tasks.add_task(self.fm.send_message, message)\n<\/code><\/pre>\n<\/div>\n<p>Bu yakla\u015f\u0131m, e-posta i\u00e7eri\u011finin koddan ayr\u0131lmas\u0131n\u0131 ve daha kolay g\u00fcncellenmesini sa\u011flar.<\/p>\n<p><strong>3. E-posta Test Ara\u00e7lar\u0131:<\/strong><\/p>\n<p>Geli\u015ftirme ve test ortamlar\u0131nda e-postalar\u0131n ger\u00e7ekten g\u00f6nderilip g\u00f6nderilmedi\u011fini, i\u00e7eriklerinin do\u011fru olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in \u00f6zel ara\u00e7lar kullanmak \u00e7ok faydal\u0131d\u0131r:<\/p>\n<ul>\n<li>\n        <strong>Mailtrap\/MailHog:<\/strong> Bu ara\u00e7lar, SMTP sunucusu gibi davran\u0131r ancak e-postalar\u0131 ger\u00e7ek al\u0131c\u0131lara g\u00f6ndermek yerine bir web aray\u00fcz\u00fcnde yakalar ve g\u00f6sterir. Bu sayede, uygulaman\u0131z\u0131n g\u00f6nderdi\u011fi t\u00fcm e-postalar\u0131 kolayca inceleyebilir ve test edebilirsiniz. \u00d6zellikle <code>EMAIL_OVERRIDE_RECIPIENT<\/code> olarak bu ara\u00e7lar\u0131n sa\u011flad\u0131\u011f\u0131 adresleri kullanmak, e-posta izolasyonunu daha g\u00f6r\u00fcn\u00fcr ve y\u00f6netilebilir k\u0131lar.\n    <\/li>\n<li>\n        <strong>Mocking (Taklit Etme):<\/strong> Birim ve entegrasyon testlerinde, ger\u00e7ek e-posta servisine ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 ortadan kald\u0131rmak i\u00e7in e-posta g\u00f6nderme fonksiyonunu taklit edebilirsiniz. Python&#8217;\u0131n <code>unittest.mock<\/code> mod\u00fcl\u00fc veya Pytest&#8217;in <code>monkeypatch<\/code> \u00f6zelli\u011fi bu konuda \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr. Bu, testlerin daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klara ihtiya\u00e7 duymaz.\n    <\/li>\n<\/ul>\n<p><strong>4. Hata Y\u00f6netimi ve Loglama:<\/strong><\/p>\n<p>E-posta g\u00f6nderimi s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 (SMTP ba\u011flant\u0131 sorunlar\u0131, al\u0131c\u0131 adresi ge\u00e7ersizli\u011fi vb.) uygun \u015fekilde ele almak \u00f6nemlidir. Hata durumlar\u0131nda kullan\u0131c\u0131ya bilgi vermek ve hatay\u0131 loglamak (kaydetmek), sorun giderme s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r. Ayr\u0131ca, hangi ortamda hangi e-postan\u0131n kime g\u00f6nderildi\u011fi veya neden g\u00f6nderilemedi\u011fi gibi bilgileri loglamak, denetlenebilirlik a\u00e7\u0131s\u0131ndan de\u011ferlidir.<\/p>\n<p><strong>5. Asenkron E-posta G\u00f6nderimi:<\/strong><\/p>\n<p>E-posta g\u00f6nderme i\u015flemi genellikle a\u011f gecikmeleri i\u00e7erdi\u011finden, bu i\u015flemi asenkron olarak veya arka plan g\u00f6revleri (background tasks) ile yapmak, API yan\u0131t s\u00fcrelerini d\u00fc\u015f\u00fcr\u00fcr ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir. FastAPI&#8217;\u0131n <code>BackgroundTasks<\/code> \u00f6zelli\u011fi bu konuda \u00e7ok kullan\u0131\u015fl\u0131d\u0131r, yukar\u0131daki \u00f6rnekte de bu y\u00f6ntemi kulland\u0131k.<\/p>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve pratikler, FastAPI uygulaman\u0131zdaki e-posta izolasyonunu daha da g\u00fc\u00e7lendirerek, hem geli\u015ftirme verimlili\u011fini art\u0131racak hem de \u00fcretim ortam\u0131ndaki riskleri minimize edecektir.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>Bu makalede, FastAPI uygulamalar\u0131nda Git branch&#8217;lerine \u00f6zel e-posta izolasyonunun neden \u00f6nemli oldu\u011funu, bu izolasyonu Pydantic tabanl\u0131 yap\u0131land\u0131rma y\u00f6netimi ve ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla nas\u0131l sa\u011flayabilece\u011fimizi detayl\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, <code>fastapi-mail<\/code> k\u00fct\u00fcphanesi ile ko\u015fullu e-posta g\u00f6nderimini nas\u0131l entegre edece\u011fimizi ve CI\/CD boru hatlar\u0131 ile bu s\u00fcreci nas\u0131l otomatikle\u015ftirebilece\u011fimizi g\u00f6sterdik. Hassas bilgilerin g\u00fcvenli\u011fi, e-posta \u015fablonlar\u0131, test ara\u00e7lar\u0131 ve hata y\u00f6netimi gibi ileri d\u00fczey pratiklere de de\u011finerek, daha sa\u011flam ve g\u00fcvenilir bir e-posta altyap\u0131s\u0131 kurman\u0131n yollar\u0131n\u0131 payla\u015ft\u0131k.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki, modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde farkl\u0131 ortamlar aras\u0131nda tutarl\u0131 ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi, ba\u015far\u0131l\u0131 bir projenin temel ta\u015flar\u0131ndan biridir. E-posta gibi kritik ileti\u015fim kanallar\u0131nda izolasyon sa\u011flamak, hem geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131racak hem de potansiyel m\u00fc\u015fteri memnuniyetsizli\u011fi veya itibar kayb\u0131 gibi risklerin \u00f6n\u00fcne ge\u00e7ecektir. FastAPI&#8217;\u0131n sundu\u011fu esneklik ve Python&#8217;\u0131n g\u00fc\u00e7l\u00fc ekosistemi sayesinde, bu t\u00fcr karma\u015f\u0131k gereksinimleri bile \u015f\u0131k ve verimli bir \u015fekilde \u00e7\u00f6zebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>S: Neden farkl\u0131 branch&#8217;ler i\u00e7in e-posta izolasyonuna ihtiyac\u0131m var?<\/strong><br \/>\n        <strong>C:<\/strong> Geli\u015ftirme veya test ortamlar\u0131ndan yanl\u0131\u015fl\u0131kla ger\u00e7ek kullan\u0131c\u0131lara e-posta g\u00f6nderilmesini \u00f6nlemek i\u00e7in. Bu, kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir ve \u015firketinizin itibar\u0131n\u0131 zedeler. Her branch&#8217;in kendi ortam\u0131na uygun e-posta yap\u0131land\u0131rmas\u0131 olmal\u0131d\u0131r.\n    <\/li>\n<li>\n        <strong>S: Ortam de\u011fi\u015fkenleri yerine <code>if\/else<\/code> bloklar\u0131yla do\u011frudan kod i\u00e7inde ortam kontrol\u00fc yapsam ne olur?<\/strong><br \/>\n        <strong>C:<\/strong> Bu yakla\u015f\u0131m &#8220;kod-koku\u015fmas\u0131&#8221;na (code smell) yol a\u00e7ar ve uygulaman\u0131n yap\u0131land\u0131rmas\u0131n\u0131 de\u011fi\u015ftirmek i\u00e7in kodu yeniden derlemeniz\/da\u011f\u0131tman\u0131z gerekir. Ortam de\u011fi\u015fkenleri, ayn\u0131 kod taban\u0131n\u0131n farkl\u0131 yap\u0131land\u0131rmalarla \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayarak daha esnek ve bak\u0131m\u0131 kolay bir \u00e7\u00f6z\u00fcm sunar.\n    <\/li>\n<li>\n        <strong>S: <code>EMAIL_OVERRIDE_RECIPIENT<\/code> de\u011fi\u015fkenini \u00fcretim ortam\u0131nda da kullanmal\u0131 m\u0131y\u0131m?<\/strong><br \/>\n        <strong>C:<\/strong> Hay\u0131r, genellikle \u00fcretim ortam\u0131nda bu de\u011fi\u015fken bo\u015f b\u0131rak\u0131l\u0131r veya hi\u00e7 tan\u0131mlanmaz. Amac\u0131, geli\u015ftirme\/test ortamlar\u0131nda e-postalar\u0131 belirli bir test adresine y\u00f6nlendirmektir. \u00dcretimde e-postalar\u0131n as\u0131l al\u0131c\u0131lara gitmesi beklenir.\n    <\/li>\n<li>\n        <strong>S: E-posta g\u00f6nderme testi i\u00e7in hangi ara\u00e7lar\u0131 \u00f6nerirsiniz?<\/strong><br \/>\n        <strong>C:<\/strong> Geli\u015ftirme ve test ortamlar\u0131nda Mailtrap veya MailHog gibi e-posta yakalama servislerini kullanman\u0131z\u0131 \u015fiddetle tavsiye ederiz. Bu ara\u00e7lar, e-postalar\u0131 ger\u00e7ek al\u0131c\u0131lara g\u00f6ndermeden bir web aray\u00fcz\u00fcnde g\u00f6r\u00fcnt\u00fclemenizi sa\u011flar, b\u00f6ylece test s\u00fcre\u00e7leriniz \u00e7ok daha g\u00fcvenli ve pratik hale gelir.\n    <\/li>\n<li>\n        <strong>S: FastAPI&#8217;da e-posta g\u00f6nderme i\u015flemini asenkron yapmak neden \u00f6nemli?<\/strong><br \/>\n        <strong>C:<\/strong> E-posta g\u00f6nderme i\u015flemi, a\u011f gecikmeleri nedeniyle zaman al\u0131c\u0131 olabilir. Bu i\u015flemi asenkron olarak (FastAPI&#8217;da <code>BackgroundTasks<\/code> ile) yapmak, API endpoint&#8217;inizin kullan\u0131c\u0131n\u0131n e-postan\u0131n g\u00f6nderilmesini beklemeden h\u0131zl\u0131ca yan\u0131t vermesini sa\u011flar. Bu, kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131r\u0131r.\n    <\/li>\n<\/ol>\n<p>#FastAPI #Python #WebGeli\u015ftirme #Eposta\u0130zolasyonu #CI\/CD<\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131 geli\u015ftirirken, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k ve \u00fcretim) aras\u0131nda tutarl\u0131 ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi hayati \u00f6neme sahiptir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-43271","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k ve \u00fcretim) aras\u0131nda tutarl\u0131 ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi hayati \u00f6neme sahiptir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-12T06:08:22+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?\",\"datePublished\":\"2026-07-12T06:08:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\"},\"wordCount\":3252,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\",\"name\":\"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-12T06:08:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/","og_locale":"tr_TR","og_type":"article","og_title":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken, farkl\u0131 ortamlar (geli\u015ftirme, test, haz\u0131rl\u0131k ve \u00fcretim) aras\u0131nda tutarl\u0131 ve g\u00fcvenli bir yap\u0131land\u0131rma y\u00f6netimi hayati \u00f6neme sahiptir.","og_url":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-12T06:08:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?","datePublished":"2026-07-12T06:08:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/"},"wordCount":3252,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/","url":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/","name":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-12T06:08:22+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-uygulamalarinda-branch-bazli-e-posta-izolasyonu-nasil-saglanir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FastAPI Uygulamalar\u0131nda Branch Bazl\u0131 E-posta \u0130zolasyonu Nas\u0131l Sa\u011flan\u0131r?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43271"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43271\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}