farkmt2official 1
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

[NODE JS] Nodemailer ile E-posta Gönderme

nodejs.png


[NODE JS] Nodemailer ile E-posta Gönderme

Selam arkadaşlar, bugün Node.js ile e-posta gönderme konusunu ele alacağız. E-posta gönderme hemen hemen her web uygulamasında ihtiyaç duyulan bir özelliktir. Kullanıcı kayıt onayı, şifre sıfırlama, bildirimler, faturalar... Hepsi e-posta ile gönderilir. Nodemailer, Node.js ekosisteminde bu iş için en çok kullanılan kütüphanedir ve bunu hak ediyor.

Nodemailer, SMTP protokolü üzerinden e-posta göndermenizi sağlayan güçlü bir modüldür. Gmail, Outlook, Yahoo gibi popüler servislerle uyumlu çalışır. Ayrıca SendGrid, Mailgun, Amazon SES gibi profesyonel e-posta servislerini de destekler. Ben production projelerimde genellikle SendGrid veya Amazon SES kullanıyorum çünkü Gmail'in günlük gönderim limiti var.

Kurulumu basittir, npm install nodemailer ile yüklersiniz. Sonra bir transporter oluşturursunuz. Transporter, e-postayı hangi servis üzerinden göndereceğinizi belirleyen konfigürasyondur. Host, port, authentication bilgilerini verirsiniz. Gmail için özel bir konfigürasyon vardır, service parametresini gmail olarak ayarlarsınız.

Gmail kullanacaksanız dikkat etmeniz gereken önemli bir nokta var. Normal şifrenizle giriş yapamazsınız, Google güvenlik ayarlarından "App Password" oluşturmanız gerekir. İki faktörlü doğrulamayı aktif edip sonra uygulama şifresi oluşturursunuz. Bu şifreyi Nodemailer konfigürasyonunda kullanırsınız. Bu adımı atlayan çok geliştirici gördüm, sonra "neden çalışmıyor" diye soruyorlar.

HTML formatında e-posta göndermek de mümkündür. text yerine html parametresini kullanırsınız. HTML e-postalarda dikkat etmeniz gereken şey, e-posta istemcilerinin CSS desteğinin sınırlı olduğudur. Inline CSS kullanmanızı öneririm. Flexbox, Grid gibi modern CSS özellikleri çoğu e-posta istemcisinde çalışmaz. Table based layout hâlâ en güvenilir yöntemdir.

Dosya eki göndermek için attachments parametresini kullanırsınız. Dosya yolunu, buffer'ını veya stream'ini verebilirsiniz. Birden fazla ek de gönderebilirsiniz. Gömülü resimler için CID referansı kullanabilirsiniz, böylece HTML içinde resim gösterebilirsiniz.

Template engine entegrasyonu da önemli bir konudur. Her e-posta için HTML stringi elle yazmak yerine Handlebars, EJS, Pug gibi template engine'leri kullanabilirsiniz. Bu sayede dinamik içerikli, tutarlı görünümlü e-postalar oluşturabilirsiniz.

Hata yönetimi konusunda dikkatli olun. E-posta gönderimi ağ bağımlı bir işlemdir, her zaman başarısız olabilir. Try-catch bloğu ile hataları yakalayın ve kullanıcıya anlamlı geri bildirim verin. Retry mekanizması da eklemenizi öneririm, ilk denemede başarısız olan e-postayı birkaç kez daha deneyebilirsiniz.

Kod:
// emailService.js - Nodemailer ile e-posta servisi
const nodemailer = require('nodemailer');

// SMTP Transporter oluşturma
const transporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 587,
  secure: false,
  auth: {
    user: process.env.EMAIL_USER,
    pass: process.env.EMAIL_PASS
  }
});

// Basit metin e-posta gönderme
async function basitMailGonder(alici, konu, mesaj) {
  try {
    const info = await transporter.sendMail({
      from: '"Node.js Uygulama" <noreply@example.com>',
      to: alici,
      subject: konu,
      text: mesaj
    });
    console.log('E-posta gönderildi: ' + info.messageId);
    return info;
  } catch (error) {
    console.error('E-posta gönderilemedi:', error.message);
    throw error;
  }
}

// HTML formatlı e-posta gönderme
async function htmlMailGonder(alici, konu, htmlIcerik) {
  try {
    const info = await transporter.sendMail({
      from: '"Node.js Uygulama" <noreply@example.com>',
      to: alici,
      subject: konu,
      html: htmlIcerik
    });
    console.log('HTML e-posta gönderildi: ' + info.messageId);
    return info;
  } catch (error) {
    console.error('HTML e-posta gönderilemedi:', error.message);
    throw error;
  }
}

// Dosya ekli e-posta gönderme
async function dosyaEkliMailGonder(alici, konu, mesaj, dosyaYolu) {
  try {
    const info = await transporter.sendMail({
      from: '"Node.js Uygulama" <noreply@example.com>',
      to: alici,
      subject: konu,
      text: mesaj,
      attachments: [
        {
          filename: dosyaYolu.split('/').pop(),
          path: dosyaYolu
        }
      ]
    });
    console.log('Dosya ekli e-posta gönderildi: ' + info.messageId);
    return info;
  } catch (error) {
    console.error('Dosya ekli e-posta gönderilemedi:', error.message);
    throw error;
  }
}

// Hoş geldin e-postası şablonu
async function hosgeldinMailiGonder(kullanici) {
  var htmlSablon = '<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">';
  htmlSablon += '<div style="background-color: #2ecc71; color: white; padding: 20px; text-align: center;">';
  htmlSablon += '<h1>Hoş Geldiniz!</h1>';
  htmlSablon += '</div>';
  htmlSablon += '<div style="padding: 20px; background-color: #f9f9f9;">';
  htmlSablon += '<h2>Merhaba ' + kullanici.isim + ',</h2>';
  htmlSablon += '<p>Uygulamamıza kayıt olduğunuz için teşekkür ederiz.</p>';
  htmlSablon += '<p>Hesabınızı aktifleştirmek için aşağıdaki butona tıklayın:</p>';
  htmlSablon += '<div style="text-align: center; margin: 30px 0;">';
  htmlSablon += '<a href="https://example.com/verify/' + kullanici.token + '" ';
  htmlSablon += 'style="background-color: #2ecc71; color: white; padding: 12px 30px; ';
  htmlSablon += 'text-decoration: none; border-radius: 5px; font-size: 16px;">Hesabı Aktifleştir</a>';
  htmlSablon += '</div>';
  htmlSablon += '<p>Bu link 24 saat geçerlidir.</p>';
  htmlSablon += '</div>';
  htmlSablon += '<div style="text-align: center; padding: 10px; color: #999; font-size: 12px;">';
  htmlSablon += '<p>Bu e-postayı siz talep etmediyseniz lütfen dikkate almayın.</p>';
  htmlSablon += '</div></div>';

  return await htmlMailGonder(
    kullanici.email,
    'Hoş Geldiniz - Hesabınızı Aktifleştirin',
    htmlSablon
  );
}

// Şifre sıfırlama e-postası
async function sifreSifirlamaMailiGonder(kullanici) {
  var htmlIcerik = '<div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">';
  htmlIcerik += '<h2>Şifre Sıfırlama Talebi</h2>';
  htmlIcerik += '<p>Merhaba ' + kullanici.isim + ',</p>';
  htmlIcerik += '<p>Şifrenizi sıfırlamak için aşağıdaki linke tıklayın:</p>';
  htmlIcerik += '<a href="https://example.com/reset/' + kullanici.resetToken + '">Şifremi Sıfırla</a>';
  htmlIcerik += '<p>Bu link 1 saat geçerlidir.</p>';
  htmlIcerik += '</div>';

  return await htmlMailGonder(
    kullanici.email,
    'Şifre Sıfırlama',
    htmlIcerik
  );
}

module.exports = {
  basitMailGonder,
  htmlMailGonder,
  dosyaEkliMailGonder,
  hosgeldinMailiGonder,
  sifreSifirlamaMailiGonder
};

// Kullanım örneği - server.js
// require('dotenv').config();
// const emailService = require('./emailService');
//
// emailService.basitMailGonder(
//   'alici@example.com',
//   'Test E-postası',
//   'Bu bir test mesajıdır.'
// ).then(() => console.log('Gönderildi!'))
//   .catch((err) => console.error('Hata:', err));

Nodemailer ile e-posta gönderimi gerçekten basittir. Ama production'da dikkat etmeniz gereken şeyler var: rate limiting, bounce handling, spam filtrelerine takılmamak. Bu konularda profesyonel servisler (SendGrid, Mailgun, SES) işinizi çok kolaylaştırır. Hadi kolay gelsin!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst