Node.js, Express.js | İleri Seviye E-Posta Gönderim Konseptleri

Nabi Güzel
Huawei Developers - Türkiye
5 min readJul 1, 2022

Giriş

Herkese merhaba,

Sunucu tarafında, kullanıcıya bazı mailler göndeririz. Bu maillere; şifre unutulması durumunda iletilen bir kod veya erişim linki içeren mail, şifre değişimi sonrası kullanıcı uyarı maili, kullanıcıya bir bülten iletimi gibi durumları örnek verebiliriz.

Bu yazıda, Node.js ve Express.js ile geliştirilmiş bir uygulamada, uygulama kullanıcılarına şablon tasarımları kullanılarak, kullanıcının diline uygun metinlerle mail gönderiminin nasıl yapıldığını inceleyeceğiz.

Kullanacağımız Teknolojiler

Projede temelde 3 kütüphane kullanacağız. Bunlar:

  • i18n
  • nodemailer
  • nodemailer-express-handlebars

i18n ile çoklu dil kullanımı

Sunucu taraflı geliştirmelerde kullanıcıya belli başlı mesajları, kullanıcının diline uygun bir dil çevirisi ile sonuç döndürmek gerekmektedir. Bunun için kullanılan en yaygın kütüphane “i18n” kütüphanesidir.

i18n kullanımında, desteklemeyi düşündüğümüz her dile özel yazılmış “json” uzantılı dosyalar oluştururuz. Bu dosyalarda ortak anahtar kelimeler(veya cümleler) ve anahtar kelimenin(cümlenin) o dilde karşılığı yazılır. Burada daha fazla ayrıntıya girmeden ilgili dokümanı ve bu konu hakkında yazılmış makalelere bakmanızı öneririm.

Nodemailer ile e-posta gönderimi

Maillerin gönderimi için node.js de kullanılan en yaygın kütüphanelerden biri “nodemailer” kütüphanesidir.

Nodemailer yapılandırması, kullanılan e-posta hizmetine göre değişkenlik gösterir. Örnek yapılandırma için aşağıda, resmi sitesinden alıntı yaptığım örneğe bakabilirsiniz.

Nodemailer ile mail gönderimi

Handlebar ile semantik şablon oluşturma

Handlebar basit bir şablonlama dilidir. Handlebar, geliştirdiğimiz web sitesini parçalara ayırmamıza ve parametrikleri kullanarak yönetmemize olanak tanır.

Örneğin; üzerinde çalıştığımız web sitesi için tasarımın alt kısmını (footer) ve üst kısmını (header) ve ortaya gelecek farklı parametre ve tasarımlara sahip gövde (body) kısımlarını parçalar haline getirip, bunları belli bir yapıda ana yerleşim (main layout) içinde parametrik olarak birleştirip bir web sitesi elde edebiliriz.

Detaylı bilgi için aşağıda verdiğim resmi dokümana bakabilirsiniz.

express-handlebars nedir?

Bu kütüphane, Express içinde Handlebars kullanımı için geliştirilmiş ve tam yığın (fullstack) bir web sayfası yazmamıza imkan sunan bir kütüphanedir. Bu kütüphane sayesinde hangi sayfanın ana kalıp sayfası olduğu, hangi sayfaların parçalı dosyalar olduğu gibi bir yapıyı kurabiliyoruz. Ayrıca görüntüleme sayfası içinde kullanılacak fonksiyonları da belirleyebiliyoruz.

Aşağıda verdiğim örnekte “engine” içinde yazılan parametreler sayesinde yukarıda belirlediğim yapıyı kurabildim. Yapı kurulduktan sonra ise yazdığım örnek kullanımda, görüntülemek istediğim sayfanın “contactForm” sayfası olduğunu ve bu sayfanın “main” ismindeki ana yerleşim sayfası içinde gösterilmesini istiyorum.

Örnekte yer alan “path.render” fonksiyon kullanımında ilk parametreden sonra göndereceğimiz herhangi bir parametre veya nesnenin, “contactForm” parametresinde olduğu gibi, sayfa içinde bir değişken olarak kullanabileceğini belirtebiliyoruz.

Express handlebars kullanımı

Her ne kadar bu makale için konu dışı olsa da “express-handlebars” kullanımını “nodemailer-express-handlebars” kullanımının daha iyi anlaşılır olması için verdim.

Ayrıca geliştirme sürecinde, yaptığımız her değişiklikte, tasarladığımız sayfaları görüntüleyip kontrol etmek ve test etmek için mail göndermek yerine, sadece geliştirme modu için tarayıcıda harici bir sayfa olarak görüntülemek için “express-handlebars” kullanabiliriz. Bu da, hızlı geliştirme yapmamızı sağlar.

Neden nodemailer-express-handlebars?

Biz bu projede “express-handlebars” üzerinden geliştirilmiş, “nodemailer” için tasarlanmış “nodemailer-express-handlebars” kütüphanesini kullanacağız.

Yukarıda yer alan “Nodemailer ile mail gönderimi” örneğinden farklı olarak aşağıda yer alan örnekte “sendMail” fonksiyonu öncesinde “compile” olarak “nodemailer-express-handlebars” kullanması gerektiğini belirtiyoruz.

Aşağıdaki örnekte yer alan “hbs(opitons)” da yer alan “options” parametresi ise yukarıda yer alan “Express handlebars kullanımı” örneğinde yer alan “engine” fonksiyonu parametreleri yapı ve kullanım amacı ile birer bir aynıdır.

Aşağıdaki örnekte dikkat edilmesi gereken kısım ise “sendMail” fonksiyonundaki “text” ve “html” parametreleri yerine, mailin iletilmeden önce hangi sayfa ile derlenip iletileceğini “template” ile, bu sayfa içinde kullanılacak parametrelerin neler olduğunu da “context” ile belirliyoruz.

Nodemailer Express Handlebars kullanımı

Handlebars içinde i18n kullanımı

Öncelikle projeye i18n yükleyip, gerekli konfigürasyon ayalarını yapmak gerekiyor. Sonrasında,“Nodemailer Express Handlebars kullanımı” örneğinde olduğu gibi, “helpers” içinde i18n den türettiğiniz bir “translate” fonksiyonunu görüntüleme sayfasına parametre olarak iletiriz. Artık bu sayede mail için tasarladığımız sayfalarda bu fonksiyonu kullanarak sayfa içinde yer alan metinleri, isteği gerçekleştiren kullanıcının diline uygun olarak çevirip, malin iletilmesini sağlamış oluruz.

Aşağıda örneğini yazdığım kodda “translate” ile başlayanların tümü yukarıdaki tanımlamada “helpers” içinde tanımladığım fonksiyonlardır. “Helpers” fonksiyonlarında ilk parametreden sonraki parametreler bir bütün olarak iletilir. Bu nedenle birden fazla parametre kullanılması gereken metin çevirileri için yazdığım “translateByHash” ismindeki fonksiyonu kullanırız. Ayrı bir kullanım olarak, tek bir parametre için, “%s” kullanarak şu örnekteki gibi de yazılabiliriz:

{{translate “Dear %s” userName}}
Handlebars kodu
Tasarlanan mail

Örnek proje kodlaması

Yukarıda verdiğim kod parçalarını, derleyip daha düzgün hale getirdiğim proje dosyasına aşağıdaki GitHub linkinden erişebilirsiniz.

Sonuç

Geliştirdiğimiz bu yapı sayesinde kullanıcılara iletilen sisteme ait maillerin yapı ve kodlama olarak dosyalanıp daha düzgün takibi ve kodlamasını ve görünüm olarak tasarımının daha iyi olmasını ayrıca içerdiği metinlerin dil değişkenli olmasını sağlamış olduk.

İyi kodlamalar…

--

--