Send Mail with Spring Boot, Simple Mail — Bahasa Indonesia

Satya Syahputra
3 min readJun 19, 2020

--

sumber: https://spring.io/images/OG-Spring.png

Hi temen-temen kali ini gw akan berbagi tutorial untuk membuat mail sender menggunakan Java Mail Sender yang digunakan di Spring Boot.

Sebelum memulai, temen-temen akan saya anggap sudah mengetahui dan memahami :

Selanjutnya yang perlu dipersiapkan :

  • Gunakan email untuk test dan tidak menggunakan 2-FA
  • Enable IMAP/POP di G-Mail (Penting)
  • Untuk referensi ini GitHub-nya (branch simple-mail ya!)
  • Menggunakan dependency seperti di bawah ini
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}

Oke kita mulai dari struktur project, untuk struktur nya kita buat sederhana aja pake model, service & controller seperti contoh di bawah.

Struktur Project Simple Mail

Pertama kita buat dulu application.yml. Temen-temen cukup rename file application.yml.example menjadi application.yml kemudian ubah <your_email> dan <your_email_password> yang digunakan untuk mengirim email.

spring:
mail:
host: smtp.gmail.com
username: <your_email>
password: <your_email_password>
port: 587
protocol: smtp
test-connection: true
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
connectiontimeout: 5000
timeout: 5000
writetimeout: 5000
starttls:
enable: true

Selanjutnya kita lihat di model Mail.java yang mana ini merupakan model untuk mengirim isi request subject, recipientdan body.

package com.satyadara.mailsender.model;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Mail implements Serializable {

private String subject;

private String recipient;

private String body;
}

Selanjutnya kita buat service yang mana akan digunakan untuk menjalankan send mail menggunakan JavaMailSender. Di sini ada kelas interface yang digunakan untuk facade MailService.java yang cukup membuat abstraksi satu method.

package com.satyadara.mailsender.service;

import com.satyadara.mailsender.model.Mail;

public interface MailService {
void send(Mail mail);
}

Sedangkan untuk kelas implementasi SimpleMailServiceImpl.java yang akan implement dari MailService.java

package com.satyadara.mailsender.service.impl;

import com.satyadara.mailsender.model.Mail;
import com.satyadara.mailsender.service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
// Penjelasan nomor 1
@Service("simpleMail")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SimpleMailServiceImpl implements MailService {
// Penjelasan nomor 2
private final JavaMailSender sender;

@Override
public void send(Mail mail) {
// Penjelasan nomor 3
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(mail.getRecipient());
message.setSubject(mail.getSubject());
message.setText(mail.getBody());


// Penjelasan nomor 4
sender.send(message);
}
}
  1. Kelas implementasi ini merupakan Service yang memiliki nama bean simpleMail. Kemudian untuk annotation RequiredArgsConstructor ini digunakan untuk mempermudah kita dalam melakukan dependency injection Autowired.
  2. Deklarasi bean JavaMailSender di sini tidak perlu menggunakan Autowired karena sudah di-handle oleh annotationRequiredArgsConstructor.
  3. Membuat SimpleMailMessagebaru dengan isi alamat email penerima (recipient), subject dan body email.
  4. Melakukan kirim email menggunakan JavaMailSender dengan format isi email dari request Mailyang menggunakan SimpleMailMessage.

Setelah selesai membuat service kemudian kita buat controller untuk akses melalui http client. Di sini gw buat contohnyaWebController.java.

package com.satyadara.mailsender.controller;

import com.satyadara.mailsender.model.Mail;
import com.satyadara.mailsender.service.MailService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
// Penjelasan Nomor 1
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WebController {
// Penjelasan Nomor 2
@Qualifier("simpleMail")
private final MailService simpleMail;
// Penjelasan Nomor 3
@PostMapping(value = "/simple-mail",consumes = MediaType.APPLICATION_JSON_VALUE)
public void sendSimpleMail(@RequestBody Mail mail) {
// Penjelasan Nomor 4
simpleMail.send(mail);
}
}
  1. Kelas WebController merupakan RestController yang mana menggunakan http method seperti GET, PUT, POST, dll untuk komunikasinya dan mendukung RequestBody yang pada contoh tutorial ini menggunakan Content-Typedengan formatJSON (application/json).
  2. Deklarasi MailService dan menggunakan bean tertentu yang memiliki nama beansimpleMail.
  3. Endpoint yang akan kita buat menggunakan http method POST dan hanya menerima Content-Type dengan format JSON (application/json). Untuk path yang digunakan endpoint ini yaitu /simple-mail
  4. Melakukan proses mengirim email menggunakan MailService dengan nama bean simpleMail.

Sekarang coba jalankan dengan cli ./gradlew bootRun.

Untuk mencoba email itu bisa dengan mencoba dengan curl berikut :

curl --request POST \
--url http://localhost:8080/simple-mail \
--header 'content-type: application/json' \
--data '{
"subject" : "Test",
"recipient": "<REPLACE WITH RECIPIENT EMAIL>",
"body": "Hi!"
}'

Sekarang coba cek email recipient sudah ada email masuk. Yeay!
Ada juga video tutorial-nya 👌 Semoga bisa membantu 😊 Terimakasih.

--

--