Send Mail with Spring Boot, Simple Mail — Bahasa Indonesia
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 :
- Spring Boot serta cara membuat project-nya
- Dependency Injection
- Gradle / Maven
- Lombok (bukan yang buat nyambel ataupun pulau ya! haha)
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.
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
, recipient
dan 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);
}
}
- Kelas implementasi ini merupakan
Service
yang memiliki nama beansimpleMail.
Kemudian untuk annotationRequiredArgsConstructor
ini digunakan untuk mempermudah kita dalam melakukan dependency injectionAutowired.
- Deklarasi bean
JavaMailSender
di sini tidak perlu menggunakanAutowired
karena sudah di-handle oleh annotationRequiredArgsConstructor.
- Membuat
SimpleMailMessage
baru dengan isi alamat email penerima (recipient), subject dan body email. - Melakukan kirim email menggunakan
JavaMailSender
dengan format isi email dari requestMail
yang menggunakanSimpleMailMessage.
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);
}
}
- Kelas
WebController
merupakanRestController
yang mana menggunakan http method sepertiGET, PUT, POST, dll
untuk komunikasinya dan mendukungRequestBody
yang pada contoh tutorial ini menggunakanContent-Type
dengan formatJSON (application/json).
- Deklarasi
MailService
dan menggunakan bean tertentu yang memiliki nama beansimpleMail.
- Endpoint yang akan kita buat menggunakan http method
POST
dan hanya menerimaContent-Type
dengan formatJSON (application/json).
Untuk path yang digunakan endpoint ini yaitu/simple-mail
- Melakukan proses mengirim email menggunakan
MailService
dengan nama beansimpleMail.
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.