Sending Email On Spring Boot Projecti

Merhabalar arkadaşlar.

Bu yazıda Spring Boot tabanlı bir projede mail gönderimi işleminin nasıl yapılacağını anlatacağım. Bu yazı için kullandığımız kaynak kodlara https://github.com/ilkgunel/MemberRestAPIProject adresindeki projeden ulaşabilirsiniz.

İlk olarak pom.xml dosyamıza Spring Boot’un mail gönderme ile ilgili olan kütüphanesini ekleyelim.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Akabinde application.properties dosyamızda mail gönderimi sırasında kullanılacak sunucu bilgileri tanımlarını yapalım.

application.properties

#Mail Sending Properties
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=ilkgunel93@gmail.com
spring.mail.password=password of e-mail account
spring.mail.protocol=smtp
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.debug=true 

application.properties dosyası içerisinde

  • spring.mail.host özelliği ile mail gönderimi için kullanılacak host tanımı yapılıyor. Biz Gmail kullanacağımız için mail host’u olarak smtp.gmail.com’u kullanacağız.
  • spring.mail.port özelliği ile mail gönderimi için port tanımı yapıyoruz. Gmail için bu değer 587’dir.
  • spring.mail.username özelliği ile mail gönderimi için kullanacağımız e-posta adresini tanımlıyoruz. Bu örnekte mail ilkgunel93@gmail.com adresinden gelecek.
  • spring.mail.password özelliği ile e-posta adresinin şifresini tanımlıyoruz. Burada Gmail hesabınızın şifresini de girebilirsiniz ya da bir uyglama şifresi oluşturup onu kullanabilirsiniz.
  • spring.mail.protocol özelliği ile mail gönderim protokolünü tanımlıyoruz. Bizim için bu değer SMTP’dir.
  • spring.mail.properties.mail.smtp.auth özelliğini true değeri ile kullanarak yetkilendirme akışına gireceğini söylüyoruz.
  • spring.mail.properties.mail.smtp.starttls.enable özelliğine true değer atayarak TLS protokolünün de kullanılacağını söylüyoruz.

MailUtil.java

package com.ilkaygunel.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.logging.Level;

@Component
public class MailUtil {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private LoggingUtil loggingUtil;

    public SimpleMailMessage templateForSimpleMessage() {

        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setSubject("Hesabınızı Aktifleştirin");
        simpleMailMessage.setText("Hesabınızın aktifleştirilmesi için bu linke tıklayınız: \nhttp://localhost:8080/MemberRestAPIProject/activateMemberWebServiceEndpoint/activateMember?activationToken=%s/");

        return simpleMailMessage;
    }

    public void sendActivationMail(String emailAddress, String activationToken) {
        SimpleMailMessage simpleMailMessage = templateForSimpleMessage();
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        try {
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            mimeMessageHelper.setText(String.format(simpleMailMessage.getText(), activationToken), true);
            mimeMessageHelper.setTo(emailAddress);
            mimeMessage.setSubject(simpleMailMessage.getSubject());

            FileSystemResource file
                    = new FileSystemResource(new File("/home/ilkaygunel/Desktop/notlar.txt"));
            mimeMessageHelper.addAttachment("Notes", file);

        } catch (MessagingException messagingException) {
            loggingUtil.getLoggerForEmailSending(this.getClass()).log(Level.SEVERE, messagingException.getMessage());

        }
        mailSender.send(mimeMessage);
    }

}

MailUtil sınıfımız içerisinde @Autowired notasyonu Spring tarafından referans atanacak olan bir JavaMailSender nesnesi tanımlıyoruz. Ayrıca mail gönderimi sırasında oluşabilecek hataların loglanması için bir de LoggingUtil nesnesini AutoWired ile doldurduk.

templateForSimpleMessage() metodu ile bir template hazırlıyoruz ve SimpleMailMessage nesnesi oluşturup bu nesnenin setSubject metodu mail konusunu, setText metodu ile de mail’in gövdesini hazırlıyoruz. Mail’in text kısmında kullanıcıya hesabını aktifleştirmesi için bir activation link gönderiliyor. Activation link’in son kısmında bir activation token yer alıyor. Bu activation token template içerisinde parametrik olarak %s ile tanımlı ve değerin linke geçirilmesi sendActivationMail içerisinde yapılıyor.

sendActivationMail() metodu içerisinde templateForSimpleMessage() metodunu çağırarak template’i SimpleMailMessage nesnesine atıyoruz. Bizim örneğimizde bir de attachemtn olacağı için burada MimeMessage üzerinden gideceğiz. try bloğu içerisinde az önce oluşturduğumuz MimeMessage nesnesini MimeMessageHelper sınıfının yapılandırıcısına parametre olarak geçirip bir MimeMessageHelper nesnesi elde ediyoruz. MimeMessageHelper nesnesinin setText metoduna template’den alınan text, activationToken alanı değeri ile değiştirilerek gönderiliyor. setTo metodu ile mail’in kime gideceği, setSubject metodu ile de mail başlığı kaydediliyor.

Son aşamada ise mail’e eklemek istediğimiz dosyayının path bilgisini File sınıfı yapılandırıcısına vererek bir File nesnesi elde ediyoruz ve File nesnesini de FileSystemResource sınıfı yapılandırıcısına vererek bir FileSystemResource nesnesi elde ediyoruz. Elde ettiğimiz bu FileSystemResource nesnesini de mimeMessageHelper nesnesinin addAttachment metoduna parametre geçirerek kaydetmiş oluyoruz.

catch bloğu içerisinde MessagingException tipindeki hatalar loglanacak.

sendActivationMail metodunun son adımında da mailSender üzerinden send metoduna mimeMessage nesnesini parametre olarak geçirip mail’imizi gönderiyoruz.

Mail gönderilmesini istediğimiz herhangi bir yerde de sınıf içerisinde AutoWired ile doldurduğumuz MailUtil nesnesi üzerinden sendActivationMail(…) metoduna email adresini ve activationToken’ı parametre olarak geçirip çağırabiliriz.

Ekran Görüntüleri

Şimdi email bilgisi ilkay.gunel@kod5.org olacak şekilde bir bir üye kaydı isteği gönderiyorum.

Bana üye kaydının başarı ile yapıldığına dair API response’u dönüyor. Mail hesabımı kontrol edeceğim şimdi:

Az önce üye kaydı isteğinde e-posta adresi olarak girdiğim ilkay.gunel@kod5.org adresine activation mail’inin geldiğini görüyorum. Ayrıca ek kısmında notlar.txt dosyasının yer aldığını da görüyorum.

Bu yazıda anlatacaklarım bu kadar arkadaşlar. Spring Boot alt yapısındaki bir projede nasıl mail gönderilir onu anlatmış oldum. Başka bir yazıda görüşmek üzere.

Görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle