Node.JS Mail Gönderme

Merhabalar, Node.JS derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde Node.JS ile e-mail gönderme işlemlerini anlatacağım. Hadi başlayalım !
Node.JS ile e-mail gönderebilmek için tabiki bir tane Node.JS projesi oluşturmanız gerekiyor. Bunun için proje oluşturmak istediğiniz klasöre terminal (Windows için Powershell yada CMD) ile geçip
npm init --yes
komutunu çalıştırmanız gerekiyor. Ardından projemiz oluşturulacaktır fakat projemizin çalışma dosyası hala eksik, hemen proje klasörü içerisinde bir tane index.js adında bir dosya oluşturalım ve artık bir sonraki adıma geçelim.
E-mail göndermek için kullanacağımız paketin adı nodemailer ve bu paket Node.JS ile beraber gelmiyor, o yüzden projemize eklememiz gerekiyor. Projeye paket ekleme işleri NPM ile yapılıyor. NPM ile paketi projeye dahil etmek için ise yine terminalden
npm i nodemailer
komutunu çalıştıralım ve NPM’in paketi indirip projeye dahil etmesini bekleyelim. Nodemailer paketide projeye eklendiğine göre artık mail gönderme işlemlerini yapmaya başlayabiliriz.
Elbette ilk iş kurduğumuz nodemailer paketini index.js sayfamızda çağırmak, bunun için sayfanın en başına
const nodemailer = require('nodemailer');
kod satırını yazalım. Bu sayede nodemailer paketini sorunsuz bir şekilde kullanabileceğiz. Mail gönderebilmek için bize lazım olan şeyler; bir adet mail (tabi bu mailin kullanıcı adı ve şifresini bilmemiz gerekiyor), mail sağlayıcımızın kullandığı sunucu adresi ve portu, mail göndereceğimiz kişinin e-mail adresi, mail içeriği ve konu. Örneğin Gmail’e girip mail gönderdiğimizde biz bu bilgileri Gmail’e sağlıyoruz ve Gmail’de Google sunucularını kullanarak istediğiniz kişiye mail gönderiyor. Bizde şimdi nodemailer paketine bu bilgileri sağlayacağız ki, oda bizim yerimize mail sunucumuza giriş yapıp tıpkı elle gönderir gibi maili gönderebilsin. Öncelikle mail sunucumuz ile ilgili bölümleri sağlayalım. Bunun için nodemailer sınıfı altındaki createTransport() fonksiyonunu kullanacağız ve bu fonksiyon object tipinde bir tane parametre alıyor. Elbette parametre olarak gönderdiğimiz object içerisinde sunucu bilgileri yer alacak. Örneğin bizim sunucumuz mail.softwaresup.net, portumuz 465, gönderim yapacağımız mail adresi suforce@softwaresup.net, mail şifremiz ise 123456 olsun. Buna göre gerekli bilgileri yerleştirelim.
const transporter = nodemailer.createTransport({
host: 'mail.softwaresup.net',
port: 465,
secure: true,
auth: {
user: 'suforce@softwaresup.net',
pass: '123456'
}
});
host, port, user ve pass bilgilerinin ne olduğunu anlamışsınız fakat bide secure bilgisi ekledim. secure bilgisi ile mail sunucusunun SSL kullanıp kullanmadığını belirtiyoruz. true gönderirsek SSL kullanıyor, false gönderirsek kullanmıyor demektir. Ayrıca nodemailer paketinde şöyle 2 güzel şey var;
Birincisi default olarak port 465 ve secure true olarak atanmıştır, yani bu iki parametreyi göndermesekte olur.Fakat sunucu portu 465’ten farklı ise portu ve sunucumuz SSL kullanmıyorsada secure parametresini false olarak belirtmemiz gerek. Aksi halde sunucuya giriş yapamayacak ve hata verecektir.
İkincisi Dünyada en çok bilinen Gmail, Hotmail gibi servisler için host, port ve secure bilgilerini göndermenize gerek yok. Örneğin Gmail için şöyle yapabilirsiniz;
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'birisi@gmail.com',
pass: 'birisinin şifresi'
}
});
Tabi Google, Hotmail gibi servisleri değilde örneğin kendi sunucunuzun mail alt yapısını kullanacaksanız port, host ve secure bilgilerini elle vermeniz gerekmekte. Evet sunucuya giriş bilgilerini verdik ama bi test edelim ve giriş yaptıralım. Bunun için createTransport() fonksiyonundan bize dönen transporter nesnesi altında bulunan verify() fonksiyonunu kullanacağız. Bu fonksiyon sunucuya girişte hata oluşursa bunu bildirmek için error, başarılı olursa success parametreleri alan callback fonksiyon ile kullanılıyor. Yani şöyle;
transporter.verify((error, success) => {
if (error)
console.log('Sunucuya Girişte Sorun Oluştu !');
console.log('Sunucuya Başarıyla Giriş Yapıldı !');
});
Evet sunucu tarafını hallettik, şimdi geldi mail tarafına. Mail tarafında ise artık mailin içeriğine geçebiliriz. Bir mailin içeriğinde alıcı, gönderici takma adı, mail başlığı ve mail içeriği olabilmekte. İşte bizde şimdi bu bilgileri tanımlayacağız. Ve tabiki bunu JSON objesi ile yapacağız. Örneğin alıcı necatichdar@softwaresup.net, mail konusu ‘Günlük Yazılar’, mail içeriği ‘Bugünkü yazıları yayınlandın mı ?’, mailde görünmesini istediğimiz takma adımız ise ‘SUForce’ olsun. O zaman şöyle bir JSON objesi oluşturmamız gerekiyor.
const mailBilgileri = {
from: 'SUForce',
to: 'necatichdar@softwaresup.net',
subject: 'Günlük Yazılar',
text: 'Bugünkü yazıları yayınlandın mı ?'
};
Ben bir kişiye göndermek istiyorum fakat siz aynı maili birden fazla kişiye göndermek istiyorsanız to verisini her birinin arasına virgül olacak şekilde arka arkaya yazabilirsiniz(to: ‘necatichdar@softwaresup.net, birisi@gmail.com, oteki@gmail.com, birbaskasi@hotmail.com’ gibi). Ayrıca mailler HTML desteklemekte. Tabiki nodemailer paketinde de bu destek var fakat bunu mail bilgilerini oluşturduğumuz JSON objesi içerisinde html özelliği ile belirtmemiz gerekiyor. Yani az önceki bilgileri bide HTML destekli hale getirirsek;
const mailBilgileri = {
from: 'SUForce',
to: 'necatichdar@softwaresup.net',
subject: 'Günlük Yazılar',
text: 'Bugünkü yazıları yayınlandın mı ?',
html: '<span style="color:#fff;background:red;border:1px solid #000;margin:3px;">Bugünkü yazıları yayınlandın mı ?</span>'
};
E mail ile dosyada gönderebiliyoruz, nodemailer’da bu özellik var mı diye sorarsanız, cevap evet gönderebilirsiniz. Burda da 2 seçeneğiniz var.
Birincisi Doğrudan okunabilir dosya (metin belgeleri, HTML belgeleri gibi) göndermek istiyorsanız dosya içeriğini ayrı belirterek istediğiniz isimde bir dosyaya yazdırılıp gönderilmesini sağlayabilirsiniz. Örneğin şöyle birşey yapalım;
const mailBilgileri = {
from: 'SUForce',
to: 'necatichdar@softwaresup.net',
subject: 'Günlük Yazılar',
text: 'Bugünkü yazıları yayınlandın mı ?',
attachments: [{
filename: 'dosya.txt',
content: `Aşağıda benim yayınladığım yazıların linkini görebilirsin.
1- https://softwaresup.net/icerik/node-js-os-modulu/
2- https://softwaresup.net/icerik/node-js-web-sitesine-senkron-istek-gonderme/`
}]
};
Görüldüğü üzere content içerisinde yazdığımız veri filename olarak verdiğimiz dosyaya yazılacak ve o dosya maile eklenecektir.
İkincisi Eklenecek dosyanın içeriğini bir başka dosyadan almak için içeriği alınacak dosyayı okuyup maille gönderilecek dosyaya yazdırabiliriz. Fakat yine content ve filename bilgileri olacak ama content değeri olarak yerel bir dosyadan okunan veriyi göndereceğiz. Bunun için Node.JS ile beraber gelen fs modülünü kullanacağız. Bu modül ile dosyanın tipi ne olursa olsun (doğrudan okunabilir yada okunamaz/binary) okuyabiliriz. Burada okuma yapmak için fs modülü altında bulunan createReadStream() fonksiyonunu kullanacağız. Bu fonksiyon okunacak dosyanın yolunu parametre olarak istiyor ve geriye dosyanın içeriğini döndürüyor. Bizde bu dönen değeri content bilgisi olarak verirsek doğrudan maille gönderilecek dosya içerisine yazmış oluruz. Uzun lafın kısası:
const mailBilgileri = {
from: 'SUForce',
to: 'necatichdar@softwaresup.net',
subject: 'Günlük Yazılar',
text: 'Bugünkü yazıları yayınlandın mı ?',
attachments: {
filename: 'dosya.txt',
content: fs.createReadStream('rapor.pdf')
}
}
Tabi fs modülünü kullanabilmek için index.js dosyamız içerisinde çağırmamız gerekiyor. Bunun için sayfanın en başına
const fs = require('fs');
kod satırını eklememiz gerekiyor. Bu satırıda ekledikten sonra herhangi bir hata kalmayacaktır. (fs modülü hakkında daha detaylı bilgiye buraya tıklayarak ulaşabilirsiniz.)
Evet sunucu bilgilerini bildirerek mail sunucumuza giriş yaptık, mail içeriğini belirledik fakat henüz mail göndermedik. Sunucuda giriş yaptık öylece bekliyoruz. Mail göndermek için ise transporter nesnesi altında bulunan sendMail() fonksiyonunu kullanacağız. Bu fonksiyon JSON tipinde mail bilgilerini parametre olarak alıyor ve bize error ile info bilgilerini barındıran callback fonksiyon veriyor. Bu callback fonksiyon ile mailin gidip gitmediğini öğrenebiliriz. Kısaca kodumuz şöyle olmalı;
transporter.sendMail(bilgiler, (error, info) => {
if (error)
console.log('Mail Gönderilirken Hata Oluştu. Hata Mesajı: ' + error.message);
console.log('Mail Başarıyla Gönderildi.');
});
Evet Node.JS ile mail gönderme işlemleri bu kadardı. Yazdığım tüm kodları toplu olması için aşağıya bırakıyorum;
const transporter = nodemailer.createTransport({
host: 'mail.softwaresup.net',
port: 465,
secure: true,
auth: {
user: 'suforce@softwaresup.net',
pass: '123456'
}
});
transporter.verify((error, success) => {
if (error)
console.log('Sunucuya Girişte Sorun Oluştu !');
console.log('Sunucuya Başarıyla Giriş Yapıldı !');
});
const mailBilgileri = {
from: 'SUForce',
to: 'necatichdar@softwaresup.net',
subject: 'Günlük Yazılar',
text: 'Bugünkü yazıları yayınlandın mı ?',
html: '<span style="color:#fff;background:red;border:1px solid #000;margin:3px;">Bugünkü yazıları yayınlandın mı ?</span>',
attachments: {
filename: 'dosya.txt',
content: fs.createReadStream('rapor.pdf')
}
};
transporter.sendMail(bilgiler, (error, info) => {
if (error)
console.log('Mail Gönderilirken Hata Oluştu. Hata Mesajı: ' + error.message);
console.log('Mail Başarıyla Gönderildi.');
});
Tüm Node.JS derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.