{"id":43027,"date":"2026-07-03T09:01:44","date_gmt":"2026-07-03T06:01:44","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/"},"modified":"2026-07-03T09:02:09","modified_gmt":"2026-07-03T06:02:09","slug":"js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/","title":{"rendered":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi"},"content":{"rendered":"<h2>JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi<\/h2>\n<p>\u015eifresiz giri\u015f e-postalar\u0131n\u0131 test ederken gelen kutunuzun dolup ta\u015fmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? JavaScript ile kaos ya\u015famadan test yapman\u0131n yollar\u0131n\u0131 ke\u015ffedin.<\/p>\n<p>Modern web uygulamalar\u0131nda kullan\u0131c\u0131 deneyimini (user experience) art\u0131rmak amac\u0131yla \u015fifresiz giri\u015f (passwordless login) y\u00f6ntemleri giderek daha pop\u00fcler hale geliyor. Kullan\u0131c\u0131lar art\u0131k karma\u015f\u0131k \u015fifreleri hat\u0131rlamak zorunda kalm\u0131yor. Bunun yerine, e-posta adreslerine g\u00f6nderilen tek kullan\u0131ml\u0131k bir sihirli ba\u011flant\u0131ya (magic link) veya do\u011frulama koduna t\u0131klayarak sisteme g\u00fcvenli bir \u015fekilde giri\u015f yapabiliyorlar. Ancak, bu harika kullan\u0131c\u0131 deneyimi geli\u015ftiriciler i\u00e7in ciddi bir test zorlu\u011fu yarat\u0131r. \u00c7\u00fcnk\u00fc her test \u00e7al\u0131\u015ft\u0131rmas\u0131nda ger\u00e7ek bir e-posta g\u00f6ndermek, hem gelen kutunuzu kaosa s\u00fcr\u00fckler hem de test s\u00fcre\u00e7lerinizi yava\u015flat\u0131r.<\/p>\n<p>Bu makalede, JavaScript ve Node.js ekosisteminde \u015fifresiz giri\u015f e-postalar\u0131n\u0131 test etmenin en temiz ve etkili yollar\u0131n\u0131 ele alaca\u011f\u0131z. Ger\u00e7ek bir gelen kutusunu kirletmeden, testlerinizi nas\u0131l otomatikle\u015ftirebilece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz. Ayr\u0131ca, ger\u00e7ek d\u00fcnya senaryolar\u0131 ve kod \u00f6rnekleriyle konuyu derinlemesine inceleyece\u011fiz.<\/p>\n<h2>\u015eifresiz Giri\u015f (Passwordless Login) Nedir ve Neden Pop\u00fcler?<\/h2>\n<p>\u015eifresiz giri\u015f, geleneksel kullan\u0131c\u0131 ad\u0131 ve \u015fifre ikilisini ortadan kald\u0131ran modern bir kimlik do\u011frulama (authentication) y\u00f6ntemidir. Bu sistemde kullan\u0131c\u0131, sisteme giri\u015f yapmak istedi\u011finde sadece e-posta adresini girer. Sistem, bu e-posta adresine benzersiz ve s\u00fcreli bir ba\u011flant\u0131 (magic link) veya tek kullan\u0131ml\u0131k \u015fifre (OTP &#8211; One Time Password) g\u00f6nderir. Kullan\u0131c\u0131 bu ba\u011flant\u0131ya t\u0131klad\u0131\u011f\u0131nda veya kodu girdi\u011finde sisteme giri\u015f yapm\u0131\u015f olur.<\/p>\n<p>Bu y\u00f6ntemin pop\u00fcler olmas\u0131n\u0131n arkas\u0131nda \u00e7ok ge\u00e7erli sebepler vard\u0131r. \u0130lk olarak, kullan\u0131c\u0131lar\u0131n \u015fifre unutma derdini ortadan kald\u0131r\u0131r ve b\u00f6ylece m\u00fc\u015fteri kayb\u0131n\u0131 (churn rate) azalt\u0131r. \u0130kinci olarak, zay\u0131f \u015fifre kullan\u0131m\u0131ndan kaynaklanan g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 do\u011frudan engeller. \u00d6zellikle Slack, Medium ve Notion gibi dev platformlar\u0131n bu y\u00f6ntemi benimsemesi, \u015fifresiz giri\u015fin standart bir pratik haline gelmesini sa\u011flad\u0131.<\/p>\n<p>Ancak, bu ak\u0131\u015f\u0131n test edilmesi geli\u015ftiriciler i\u00e7in her zaman kolay olmaz. \u00c7\u00fcnk\u00fc geleneksel bir test senaryosunda veri taban\u0131ndaki \u015fifreyi kontrol etmek yeterliyken, burada i\u015fin i\u00e7ine harici bir e-posta sunucusu ve teslimat s\u00fcreci girer. Dolay\u0131s\u0131yla, testlerin kararl\u0131 (stable) ve h\u0131zl\u0131 \u00e7al\u0131\u015fabilmesi i\u00e7in \u00f6zel stratejiler uygulamak gerekir.<\/p>\n<h2>E-posta Testlerinde &#8220;Gelen Kutusu Kaosu&#8221; Nedir?<\/h2>\n<p>Yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinde, \u015fifresiz giri\u015f ak\u0131\u015f\u0131n\u0131 test etmek i\u00e7in genellikle ger\u00e7ek e-posta adresleri kullan\u0131l\u0131r. \u00d6rne\u011fin, ki\u015fisel veya \u015firket e-postan\u0131z\u0131 test kullan\u0131c\u0131s\u0131 olarak kaydedersiniz. Her kod de\u011fi\u015fikli\u011finde veya otomatik test \u00e7al\u0131\u015ft\u0131\u011f\u0131nda gelen kutunuza onlarca &#8220;Giri\u015f Yap&#8221; e-postas\u0131 d\u00fc\u015fer. \u0130\u015fte biz bu duruma &#8220;gelen kutusu kaosu&#8221; (inbox chaos) ad\u0131n\u0131 veriyoruz.<\/p>\n<p>Bu yakla\u015f\u0131m sadece can s\u0131k\u0131c\u0131 olmakla kalmaz, ayn\u0131 zamanda \u015fu teknik sorunlara da yol a\u00e7ar:<\/p>\n<ul>\n<li><strong>Spam Filtreleri:<\/strong> Test s\u0131ras\u0131nda \u00e7ok k\u0131sa s\u00fcrede \u00e7ok say\u0131da e-posta g\u00f6nderdi\u011finiz i\u00e7in e-posta servis sa\u011flay\u0131c\u0131n\u0131z (Gmail, Outlook vb.) alan ad\u0131n\u0131z\u0131 (domain) kara listeye alabilir.<\/li>\n<li><strong>H\u0131z S\u0131n\u0131rlar\u0131 (Rate Limiting):<\/strong> Ger\u00e7ek e-posta g\u00f6nderim servisleri (SendGrid, Mailgun vb.) belirli bir s\u00fcrede g\u00f6nderebilece\u011finiz e-posta say\u0131s\u0131n\u0131 s\u0131n\u0131rlar. Testleriniz bu s\u0131n\u0131rlara tak\u0131larak ba\u015far\u0131s\u0131z olabilir.<\/li>\n<li><strong>Yava\u015f Test S\u00fcre\u00e7leri:<\/strong> Ger\u00e7ek bir e-postan\u0131n g\u00f6nderilmesi ve gelen kutusuna ula\u015fmas\u0131 birka\u00e7 saniye, hatta bazen dakikalar alabilir. Bu durum, s\u00fcrekli entegrasyon (Continuous Integration &#8211; CI) s\u00fcre\u00e7lerinizi ciddi \u015fekilde yava\u015flat\u0131r.<\/li>\n<li><strong>Otomasyon Zorlu\u011fu:<\/strong> Otomatik test ara\u00e7lar\u0131n\u0131n (Playwright, Cypress, Selenium) ger\u00e7ek bir Gmail aray\u00fcz\u00fcne girip e-postay\u0131 bulmas\u0131 ve ba\u011flant\u0131ya t\u0131klamas\u0131 son derece karma\u015f\u0131k ve k\u0131r\u0131lgand\u0131r.<\/li>\n<\/ul>\n<p>Bu nedenlerden dolay\u0131, test ortamlar\u0131nda ger\u00e7ek e-posta kutular\u0131n\u0131 kullanmaktan tamamen ka\u00e7\u0131nmal\u0131y\u0131z. Bunun yerine, e-postalar\u0131 yakalayan ve analiz etmemizi sa\u011flayan sanal \u00e7\u00f6z\u00fcmlere y\u00f6nelmeliyiz.<\/p>\n<h2>JavaScript Ekosisteminde E-posta Test Stratejileri Nelerdir?<\/h2>\n<p>JavaScript ile e-posta g\u00f6nderim s\u00fcre\u00e7lerini test etmek i\u00e7in temelde \u00fc\u00e7 farkl\u0131 strateji uygulayabiliriz. Her stratejinin kendine g\u00f6re avantajlar\u0131 ve kullan\u0131m senaryolar\u0131 mevcuttur.<\/p>\n<table>\n<thead>\n<tr>\n<th>Strateji<\/th>\n<th>Avantajlar\u0131<\/th>\n<th>Dezavantajlar\u0131<\/th>\n<th>En Uygun Kullan\u0131m Alan\u0131<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Mocking (Taklit Etme)<\/td>\n<td>\u00c7ok h\u0131zl\u0131d\u0131r, harici ba\u011f\u0131ml\u0131l\u0131k gerektirmez.<\/td>\n<td>Ger\u00e7ek e-posta i\u00e7eri\u011fini ve \u015fablonunu test etmez.<\/td>\n<td>Birim testleri (Unit tests)<\/td>\n<\/tr>\n<tr>\n<td>Yerel SMTP Sunucusu (Mailhog vb.)<\/td>\n<td>Tamamen \u00fccretsizdir, internet ba\u011flant\u0131s\u0131 gerektirmez.<\/td>\n<td>Kurulum ve bak\u0131m maliyeti vard\u0131r.<\/td>\n<td>Yerel geli\u015ftirme ortamlar\u0131<\/td>\n<\/tr>\n<tr>\n<td>Sanal SMTP Servisleri (Mailtrap vb.)<\/td>\n<td>Kurulum gerektirmez, API deste\u011fi \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr.<\/td>\n<td>\u00dccretsiz planlar\u0131nda limitler olabilir.<\/td>\n<td>CI\/CD s\u00fcre\u00e7leri ve u\u00e7tan uca (E2E) testler<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu stratejiler aras\u0131ndan, \u00f6zellikle u\u00e7tan uca (E2E) testler i\u00e7in sanal SMTP servisleri veya yerel SMTP ara\u00e7lar\u0131 en sa\u011fl\u0131kl\u0131 sonu\u00e7lar\u0131 verir. \u00c7\u00fcnk\u00fc bu ara\u00e7lar sayesinde kodumuz ger\u00e7ekten bir e-posta g\u00f6nderir, ancak bu e-posta ger\u00e7ek d\u00fcnyaya yay\u0131lmadan sanal bir aray\u00fczde yakalan\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Node.js ile \u015eifresiz Giri\u015f Testi Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>\u015eimdi, teorik bilgileri prati\u011fe d\u00f6kelim. Bu b\u00f6l\u00fcmde, Node.js ve Express kullanarak basit bir \u015fifresiz giri\u015f mekanizmas\u0131 olu\u015fturaca\u011f\u0131z. Ard\u0131ndan, bu mekanizmay\u0131 test etmek i\u00e7in \u00fccretsiz bir sanal SMTP servisi olan <code>Ethereal Email<\/code> k\u00fct\u00fcphanesini kullanaca\u011f\u0131z.<\/p>\n<h3>Ad\u0131m 1: Proje Kurulumu ve Gerekli K\u00fct\u00fcphaneler<\/h3>\n<p>\u0130lk olarak bo\u015f bir klas\u00f6r olu\u015fturun ve projenizi ba\u015flat\u0131n. Gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<div class=\"code-container\">\n<pre><code>mkdir passwordless-test\ncd passwordless-test\nnpm init -y\nnpm install express nodemailer dotenv\nnpm install --save-dev jest supertest<\/code><\/pre>\n<\/div>\n<p>Burada <code>nodemailer<\/code> e-posta g\u00f6ndermek i\u00e7in, <code>jest<\/code> ve <code>supertest<\/code> ise testlerimizi yaz\u0131p \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<h3>Ad\u0131m 2: E-posta G\u00f6nderim Kodunun Yaz\u0131lmas\u0131<\/h3>\n<p>\u015eimdi, kullan\u0131c\u0131n\u0131n e-posta adresini alan ve ona giri\u015f ba\u011flant\u0131s\u0131 g\u00f6nderen bir Express sunucusu olu\u015ftural\u0131m. <code>server.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine \u015fu kodlar\u0131 ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>const express = require('express');\nconst nodemailer = require('nodemailer');\nconst app = express();\n\napp.use(express.json());\n\n\/\/ Ge\u00e7ici bir veri taban\u0131 (In-memory DB)\nconst activeTokens = new Map();\n\n\/\/ E-posta g\u00f6nderici yap\u0131land\u0131rmas\u0131 (Test ortam\u0131 i\u00e7in dinamik olu\u015fturulacak)\nlet transporter;\n\nasync function initMailTransporter() {\n    if (process.env.NODE_ENV === 'test') {\n        \/\/ Test ortam\u0131nda sanal hesap olu\u015fturuyoruz\n        const testAccount = await nodemailer.createTestAccount();\n        transporter = nodemailer.createTransport({\n            host: testAccount.smtp.host,\n            port: testAccount.smtp.port,\n            secure: testAccount.smtp.secure,\n            auth: {\n                user: testAccount.user,\n                pass: testAccount.pass\n            }\n        });\n    } else {\n        \/\/ \u00dcretim (Production) ortam\u0131 SMTP ayarlar\u0131\n        transporter = nodemailer.createTransport({\n            host: \"smtp.gercek-servis.com\",\n            port: 587,\n            auth: {\n                user: \"user@domain.com\",\n                pass: \"password\"\n            }\n        });\n    }\n}\n\n\/\/ \u015eifresiz giri\u015f iste\u011fi rotas\u0131\napp.post('\/api\/login-request', async (req, res) => {\n    const { email } = req.body;\n    if (!email) {\n        return res.status(400).json({ error: 'E-posta adresi gerekli.' });\n    }\n\n    \/\/ Rastgele bir token olu\u015fturuyoruz\n    const token = Math.random().toString(36).substring(2, 15);\n    activeTokens.set(token, email);\n\n    const magicLink = <code>https:\/\/uygulamaniz.com\/verify?token=${token}<\/code>;\n\n    try {\n        const info = await transporter.sendMail({\n            from: '\"\u015eifresiz Giri\u015f\" &lt;noreply@uygulamaniz.com&gt;',\n            to: email,\n            subject: 'Giri\u015f Yapmak \u0130\u00e7in T\u0131klay\u0131n',\n            text: <code>Merhaba, giri\u015f yapmak i\u00e7in \u015fu ba\u011flant\u0131ya t\u0131klay\u0131n: ${magicLink}<\/code>,\n            html: <code>&lt;p&gt;Merhaba,&lt;\/p&gt;&lt;p&gt;Giri\u015f yapmak i\u00e7in &lt;a href=&quot;${magicLink}&quot;&gt;buraya t\u0131klay\u0131n&lt;\/a&gt;.&lt;\/p&gt;<\/code>\n        });\n\n        \/\/ Test ortam\u0131nda e-posta \u00f6nizleme URL'sini yan\u0131t olarak d\u00f6nebiliriz (Test kolayl\u0131\u011f\u0131 i\u00e7in)\n        const previewUrl = nodemailer.getTestMessageUrl(info);\n        \n        return res.status(200).json({ \n            message: 'E-posta ba\u015far\u0131yla g\u00f6nderildi.',\n            previewUrl: previewUrl \/\/ Sadece testlerde kullan\u0131\u015fl\u0131d\u0131r\n        });\n    } catch (error) {\n        return res.status(500).json({ error: 'E-posta g\u00f6nderilemedi.' });\n    }\n});\n\nmodule.exports = { app, initMailTransporter, activeTokens };<\/code><\/pre>\n<\/div>\n<p>Bu kod blo\u011funda, test ortam\u0131nda \u00e7al\u0131\u015f\u0131rken <code>nodemailer.createTestAccount()<\/code> fonksiyonunu kullanarak an\u0131nda sahte bir SMTP hesab\u0131 olu\u015fturuyoruz. B\u00f6ylece hi\u00e7bir ger\u00e7ek e-posta adresine ihtiya\u00e7 duymadan sistemi test edebiliyoruz.<\/p>\n<h3>Ad\u0131m 3: Test Ortam\u0131nda E-postay\u0131 Yakalama ve Do\u011frulama<\/h3>\n<p>\u015eimdi yazd\u0131\u011f\u0131m\u0131z bu ak\u0131\u015f\u0131 test edecek bir test dosyas\u0131 olu\u015ftural\u0131m. <code>server.test.js<\/code> dosyas\u0131n\u0131 olu\u015fturun ve \u015fu kodlar\u0131 ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>const request = require('supertest');\nconst { app, initMailTransporter } = require('.\/server');\n\nbeforeAll(async () => {\n    \/\/ Test ba\u015flamadan \u00f6nce sanal SMTP sunucusunu ba\u015flat\u0131yoruz\n    process.env.NODE_ENV = 'test';\n    await initMailTransporter();\n});\n\ndescribe('\u015eifresiz Giri\u015f Ak\u0131\u015f\u0131 Testi', () => {\n    it('Kullan\u0131c\u0131 e-posta girdi\u011finde giri\u015f ba\u011flant\u0131s\u0131 i\u00e7eren e-posta g\u00f6nderilmelidir', async () => {\n        const response = await request(app)\n            .post('\/api\/login-request')\n            .send({ email: 'testkullanici@example.com' });\n\n        expect(response.statusCode).toBe(200);\n        expect(response.body.message).toBe('E-posta ba\u015far\u0131yla g\u00f6nderildi.');\n        \n        \/\/ Ethereal Email taraf\u0131ndan olu\u015fturulan \u00f6nizleme URL'sinin varl\u0131\u011f\u0131n\u0131 kontrol ediyoruz\n        expect(response.body.previewUrl).toBeDefined();\n        console.log('Test E-postas\u0131 \u00d6nizleme Ba\u011flant\u0131s\u0131:', response.body.previewUrl);\n    });\n\n    it('E-posta adresi bo\u015f g\u00f6nderildi\u011finde hata d\u00f6nmelidir', async () => {\n        const response = await request(app)\n            .post('\/api\/login-request')\n            .send({});\n\n        expect(response.statusCode).toBe(400);\n        expect(response.body.error).toBe('E-posta adresi gerekli.');\n    });\n});<\/code><\/pre>\n<\/div>\n<p>Bu testi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalinizde <code>npx jest server.test.js<\/code> komutunu vermeniz yeterlidir. Test ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, terminalde sahte e-postan\u0131n i\u00e7eri\u011fini g\u00f6rebilece\u011finiz bir Ethereal linki yazd\u0131r\u0131lacakt\u0131r. Bu linke taray\u0131c\u0131n\u0131zdan t\u0131klayarak e-postan\u0131n tasar\u0131m\u0131n\u0131 ve ba\u011flant\u0131lar\u0131n do\u011frulu\u011funu manuel olarak da kontrol edebilirsiniz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir E-Ticaret Giri\u015f Ak\u0131\u015f\u0131n\u0131n Test Edilmesi<\/h2>\n<p>Geli\u015ftirdi\u011fimiz teorik yap\u0131y\u0131 daha iyi anlamak i\u00e7in ger\u00e7ek bir vaka analizine g\u00f6z atal\u0131m. T\u00fcrkiye&#8217;de faaliyet g\u00f6steren &#8220;H\u0131zl\u0131Market&#8221; ad\u0131nda hayali bir yerel e-ticaret giri\u015fimi ele alal\u0131m. H\u0131zl\u0131Market, sepet d\u00f6n\u00fc\u015f\u00fcm oranlar\u0131n\u0131 art\u0131rmak amac\u0131yla \u015fifre kullan\u0131m\u0131n\u0131 tamamen kald\u0131rmaya ve sihirli ba\u011flant\u0131 (magic link) ile giri\u015fe ge\u00e7meye karar verdi.<\/p>\n<p>\u0130lk ba\u015flarda geli\u015ftirici ekibi, test a\u015famas\u0131nda kendi ki\u015fisel \u015firket e-postalar\u0131n\u0131 kulland\u0131. Ancak, haftal\u0131k yap\u0131lan b\u00fcy\u00fck g\u00fcncellemelerde otomatik test senaryolar\u0131 (Cypress ile yaz\u0131lm\u0131\u015f) her \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, Google Workspace sunucular\u0131 bu yo\u011fun e-posta trafi\u011fini &#8220;\u015f\u00fcpheli etkinlik&#8221; olarak alg\u0131lad\u0131. Sonucunda ise \u015firketin resmi e-posta sunucusu ge\u00e7ici olarak engellendi ve t\u00fcm operasyon durma noktas\u0131na geldi.<\/p>\n<p>Bu sorunu \u00e7\u00f6zmek i\u00e7in ekip, test altyap\u0131s\u0131n\u0131 tamamen de\u011fi\u015ftirdi. Geli\u015ftirme (development) ve staging (haz\u0131rl\u0131k) ortamlar\u0131nda ger\u00e7ek e-posta g\u00f6nderen servis devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131. Bunun yerine Docker \u00fczerinde \u00e7al\u0131\u015fan yerel bir <code>Mailhog<\/code> konteyneri konumland\u0131r\u0131ld\u0131. Cypress testleri, Mailhog&#8217;un sundu\u011fu REST API&#8217;sini kullanacak \u015fekilde g\u00fcncellendi.<\/p>\n<p>Yeni ak\u0131\u015f \u015fu \u015fekilde kurguland\u0131:<\/p>\n<ol>\n<li>Cypress testi, &#8220;Giri\u015f Yap&#8221; butonuna basarak kullan\u0131c\u0131n\u0131n e-postas\u0131n\u0131 g\u00f6nderir.<\/li>\n<li>Uygulama, e-postay\u0131 yerel Mailhog SMTP sunucusuna iletir.<\/li>\n<li>Cypress testi, Mailhog API&#8217;sine (<code>http:\/\/localhost:8025\/api\/v2\/messages<\/code>) anl\u0131k bir HTTP iste\u011fi atarak en son gelen e-postay\u0131 JSON format\u0131nda \u00e7eker.<\/li>\n<li>Gelen JSON i\u00e7erisindeki HTML metninden d\u00fczenli ifadeler (regular expressions) yard\u0131m\u0131yla sihirli ba\u011flant\u0131 (magic link) ay\u0131klan\u0131r.<\/li>\n<li>Test arac\u0131, ay\u0131klanan bu ba\u011flant\u0131y\u0131 ziyaret ederek kullan\u0131c\u0131n\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f yapt\u0131\u011f\u0131n\u0131 do\u011frular.<\/li>\n<\/ol>\n<p>Bu sayede H\u0131zl\u0131Market ekibi, tek bir ger\u00e7ek e-posta bile g\u00f6ndermeden, saniyeler i\u00e7inde u\u00e7tan uca \u015fifresiz giri\u015f testlerini tamamlamay\u0131 ba\u015fard\u0131. Gelen kutusu kaosu tamamen sona erdi ve testlerin \u00e7al\u0131\u015fma s\u00fcresi %75 oran\u0131nda k\u0131sald\u0131.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Test S\u00fcre\u00e7lerini Nas\u0131l Optimize Edebilirsiniz?<\/h2>\n<p>E-posta testlerinizi bir \u00fcst seviyeye ta\u015f\u0131mak ve s\u00fcrekli entegrasyon (CI) s\u00fcre\u00e7lerinizde maksimum verim almak i\u00e7in \u015fu ileri d\u00fczey teknikleri uygulayabilirsiniz:<\/p>\n<ul>\n<li><strong>Ge\u00e7ici E-posta Servisleri (Disposable Email APIs):<\/strong> E\u011fer testlerinizin d\u0131\u015f d\u00fcnyaya a\u00e7\u0131k bir staging ortam\u0131nda ger\u00e7ek sunucularla \u00e7al\u0131\u015fmas\u0131 gerekiyorsa, Mailosaur veya Mailtrap gibi servislerin sundu\u011fu API tabanl\u0131 ge\u00e7ici e-posta kutular\u0131n\u0131 kullan\u0131n. Bu servisler size dinamik olarak e-posta adresleri \u00fcretir ve gelen kutusunu API \u00fczerinden okuman\u0131za izin verir.<\/li>\n<li><strong>D\u00fczenli \u0130fadeler (Regex) ile Token Ay\u0131klama:<\/strong> E-posta i\u00e7eri\u011finden giri\u015f kodunu veya ba\u011flant\u0131s\u0131n\u0131 ay\u0131klamak i\u00e7in esnek regex yap\u0131lar\u0131 kullan\u0131n. \u00d6rne\u011fin; <code>\/href=\"([^\"]+)\"\/<\/code> ifadesi HTML i\u00e7erisindeki t\u00fcm linkleri yakalaman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>\u00c7evre De\u011fi\u015fkenleri (Environment Variables) Kullan\u0131m\u0131:<\/strong> SMTP ayarlar\u0131n\u0131z\u0131 asla kodun i\u00e7erisine g\u00f6mmeyin. <code>.env<\/code> dosyalar\u0131 kullanarak test, geli\u015ftirme ve \u00fcretim ortamlar\u0131ndaki e-posta g\u00f6nderim davran\u0131\u015flar\u0131n\u0131 dinamik olarak kontrol edin.<\/li>\n<li><strong>H\u0131z S\u0131n\u0131rlar\u0131n\u0131 Test Ortam\u0131nda Devre D\u0131\u015f\u0131 B\u0131rak\u0131n:<\/strong> \u015eifresiz giri\u015f sistemleri, brute-force (kaba kuvvet) sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemek i\u00e7in genellikle h\u0131z s\u0131n\u0131rlay\u0131c\u0131lara (rate limiter) sahiptir. Testlerinizin yar\u0131da kalmamas\u0131 i\u00e7in, test ortam\u0131nda bu s\u0131n\u0131rlay\u0131c\u0131lar\u0131 pasif hale getirin veya limit de\u011ferlerini \u00e7ok y\u00fcksek tutun.<\/li>\n<\/ul>\n<h2>Sonu\u00e7<\/h2>\n<p>\u015eifresiz giri\u015f sistemleri, modern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Kullan\u0131c\u0131 dostu olan bu sistemleri test etmek, do\u011fru ara\u00e7lar ve stratejiler kullan\u0131lmad\u0131\u011f\u0131nda bir kabusa d\u00f6n\u00fc\u015febilir. Ancak, bu makalede g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, sanal SMTP sunucular\u0131 ve test k\u00fct\u00fcphaneleri sayesinde &#8220;gelen kutusu kaosu&#8221; ya\u015famadan kararl\u0131 ve h\u0131zl\u0131 testler yazmak m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>JavaScript ekosisteminde Nodemailer ve Ethereal gibi \u00fccretsiz ara\u00e7larla ba\u015flayabilir, projeleriniz b\u00fcy\u00fcd\u00fck\u00e7e Mailhog veya Mailtrap gibi daha geli\u015fmi\u015f \u00e7\u00f6z\u00fcmlere ge\u00e7i\u015f yapabilirsiniz. Unutmay\u0131n, iyi kurgulanm\u0131\u015f bir test altyap\u0131s\u0131, geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131r ve uygulaman\u0131z\u0131n kalitesini her zaman \u00fcst seviyede tutar.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>\u015eifresiz giri\u015f testlerinde neden ki\u015fisel e-posta adresimi kullanmamal\u0131y\u0131m?<\/h3>\n<p>Ki\u015fisel e-posta adresinizi kullanmak, k\u0131sa s\u00fcrede gelen kutunuzun y\u00fczlerce test e-postas\u0131yla dolmas\u0131na yol a\u00e7ar. Ayr\u0131ca, e-posta servis sa\u011flay\u0131c\u0131n\u0131z\u0131n spam filtreleri tetiklenebilir ve alan ad\u0131n\u0131z\u0131n (domain) e-posta g\u00f6nderim itibar\u0131 (sender reputation) zarar g\u00f6rebilir.<\/p>\n<h3>Mailhog ve Mailtrap aras\u0131ndaki temel fark nedir?<\/h3>\n<p>Mailhog, yerel bilgisayar\u0131n\u0131zda veya Docker \u00fczerinde \u00e7al\u0131\u015ft\u0131rabilece\u011finiz tamamen a\u00e7\u0131k kaynakl\u0131 ve \u00fccretsiz bir ara\u00e7t\u0131r. Mailtrap ise bulut tabanl\u0131 bir hizmettir; kurulum gerektirmez, geli\u015fmi\u015f API&#8217;ler sunar ancak belirli bir kullan\u0131mdan sonra \u00fccretli planlara ge\u00e7menizi gerektirebilir.<\/p>\n<h3>E-posta i\u00e7erisindeki sihirli ba\u011flant\u0131y\u0131 (magic link) test kodumla nas\u0131l yakalar\u0131m?<\/h3>\n<p>E-postay\u0131 g\u00f6nderdi\u011finiz sanal SMTP servisinin API&#8217;sini kullanarak e-posta i\u00e7eri\u011fini (HTML veya d\u00fcz metin olarak) \u00e7ekebilirsiniz. Ard\u0131ndan, JavaScript&#8217;teki d\u00fczenli ifadeler (Regex) yard\u0131m\u0131yla ba\u011flant\u0131 adresini (URL) metin i\u00e7erisinden ay\u0131klay\u0131p test arac\u0131n\u0131zla bu adrese istek atabilirsiniz.<\/p>\n<h3>CI\/CD (S\u00fcrekli Entegrasyon) s\u00fcrecinde e-posta testlerini nas\u0131l otomatikle\u015ftirebilirim?<\/h3>\n<p>CI\/CD s\u00fcre\u00e7lerinde (\u00f6rne\u011fin GitHub Actions) testlerinizi \u00e7al\u0131\u015ft\u0131r\u0131rken, arka planda bir Mailhog Docker konteyneri ba\u015flatabilirsiniz. Test kodunuz bu yerel konteynere e-posta g\u00f6nderir ve API \u00fczerinden e-postalar\u0131 kontrol ederek s\u00fcreci tamamen otomatik ve izole bir \u015fekilde tamamlar.<\/p>\n<p>#Teknoloji #WebGeli\u015ftirme #JavaScript #Yaz\u0131l\u0131mTesti #NodeJS<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/simulate-passwordless-email-sending-nodejs\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/simulate-passwordless-email-sending-nodejs<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"\u015eifresiz giri\u015f e-postalar\u0131n\u0131 test ederken gelen kutunuzun dolup ta\u015fmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? JavaScript ile kaos ya\u015famadan test yapman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","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-43027","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>JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi - 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\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi\" \/>\n<meta property=\"og:description\" content=\"\u015eifresiz giri\u015f e-postalar\u0131n\u0131 test ederken gelen kutunuzun dolup ta\u015fmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? JavaScript ile kaos ya\u015famadan test yapman\u0131n yollar\u0131n\u0131 ke\u015ffedin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-03T06:01:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-03T06:02:09+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=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi\",\"datePublished\":\"2026-07-03T06:01:44+00:00\",\"dateModified\":\"2026-07-03T06:02:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\"},\"wordCount\":2155,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\",\"name\":\"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-03T06:01:44+00:00\",\"dateModified\":\"2026-07-03T06:02:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi\"}]},{\"@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":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi - 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\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi","og_description":"\u015eifresiz giri\u015f e-postalar\u0131n\u0131 test ederken gelen kutunuzun dolup ta\u015fmas\u0131ndan s\u0131k\u0131ld\u0131n\u0131z m\u0131? JavaScript ile kaos ya\u015famadan test yapman\u0131n yollar\u0131n\u0131 ke\u015ffedin.","og_url":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-03T06:01:44+00:00","article_modified_time":"2026-07-03T06:02:09+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi","datePublished":"2026-07-03T06:01:44+00:00","dateModified":"2026-07-03T06:02:09+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/"},"wordCount":2155,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/","name":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-03T06:01:44+00:00","dateModified":"2026-07-03T06:02:09+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/js-ile-sifresiz-giris-e-postalarini-test-etme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JS ile \u015eifresiz Giri\u015f E-postalar\u0131n\u0131 Test Etme Rehberi"}]},{"@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\/43027","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=43027"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43027\/revisions"}],"predecessor-version":[{"id":43028,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43027\/revisions\/43028"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}