Spring Boot Mail Templates

Spring Boot : Email (with AutoConfigure)

*) We have already registered one Mail Account(Gmail.com)

S#1 Goto Browser and Enter URL : www.gmail.com
    [Contact with Gmail Server]
S#2 Fill details un/pwd for Login
S#3 Click on compose button for new message creation
S#4 Fill details (to,cc,bcc,subject,text, attachments..etc)
S#5 Click on Send Button

   ---------------------------------------------------------------
*) Java Mail Sender API(Sun/Oracle) used by Spring Boot with AutoConfig
   for implementing Email Application.

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

*) MimeMessage : [MIME-Multipurpose Internet Mail Extension]
 It means, your email supports sending data like Image, Audio, Video,
 Pdf, Document, Text..etc.

=> Here, MIME indicates any MediaType.

*) JavaMailSender (I)  [org.springframework.mail.javamail]
   JavaMailSenderImpl(C) is impl class given by Spring F/w,
   which is Auto configured by Spring boot that helps us to
   Login With Mail Server. 

---------------------------------------------------------
Google Search: google gmail server smtp details
host: smtp.gmail.com
port: 587 (TLS)
username: javaraghu2018@gmail.com
password: 0044javaraghu2200

---Spring Java Based configuration----
@Configuration
public class AppConfig {
   @Bean
   public JavaMailSender  jms() {
     JavaMailSenderImpl  jm = new JavaMailSenderImpl();
     jm.setHost("smtp.gmail.com");
     jm.setPort(587);
     jm.setUsername("javaraghu2018@gmail.com");
     jm.setPassword("0044javaraghu2200");
     jm.setJavaMailProperties(props()->"tls->true");
     return jm;
   }
}
----------------------------------
*) Above code is automated and given in jar 'spring-boot-autoconfigure'
   class name : MailSenderPropertiesConfiguration. (ctrl+shift+T)

*) But Above code is activated  on few conditions.
a. spring-boot-starter-mail  added in pom.xml
b. You must provide keys using prefix "spring.mail"
c. You did not create this Bean manually like Spring code.

---application.properties----------------------------------
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=javaraghu2018@gmail.com
spring.mail.password=0044javaraghu2200
spring.mail.properties.mail.smtp.starttls.enable=true
----------------------------------------------------

---application.yml----------------------------------
spring:
  mail:
    host: smtp.gmail.com
    password: 0044javaraghu2200
    port: 587
    username: javaraghu2018@gmail.com
    properties:
      mail:
        smtp:
          starttls:
            enable: true
----------------------

*) By using JavaMailSender(I) we can create one empty Message
*) By using MimeMessageHelper(C) [org.springframework.mail.javamail]
   we can fill data
*) By using JavaMailSender(I) we can send message.


----------------------------------------------------
Q) What is IOS N/w Layers Model Design?

Q) Which Protocol is used for Emails?

Q) How to add security to current protocol?

Q) What is the difference b/w TLS, SSL?


Q) What is CC and BCC and difference?
A)

Q) What is method overloading?
A) 
------------------------------------------------

=============code=========================================
Name: SpringBoot2MailApp
Dep : Java Mail Sender

1. application.yml
spring:
  mail:
    host: smtp.gmail.com
    password: 0044javaraghu2200
    port: 587
    username: javaraghu2018@gmail.com
    properties:
      mail:
        smtp:
          starttls:
            enable: true

2. Service class
package in.nareshit.raghu.service;

import javax.mail.internet.MimeMessage;

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

@Component
public class MailService {
	
	@Autowired //Read new JavaMailSenderImpl() from container
	private JavaMailSender sender;
	
	public boolean sendEmail(
			String to,
			String cc[],
			String bcc[],
			String subject,
			String text,
			Resource file
			) 
	{
		boolean isSent = false;
		
		try {
			//create new MimeMessage
			MimeMessage message = sender.createMimeMessage();
			
			// Use Helper class and fill details(to,cc..)
			//MimeMessageHelper helper = new MimeMessageHelper(message, file!=null?true:false); 
			MimeMessageHelper helper = new MimeMessageHelper(message, file!=null);
			
			helper.setTo(to);
			if(cc!=null)
				helper.setCc(cc);
			if(bcc!=null)
				helper.setBcc(bcc);
			
			helper.setSubject(subject);
			helper.setText(text);
			
			if(file!=null) {
				//file name, file data
				helper.addAttachment(file.getFilename(), file);
			}
			
			//send message
			sender.send(message);
			
			isSent=true;
		} catch (Exception e) {
			isSent=false;
			e.printStackTrace();
		}
		
		return isSent;
	}
}

3. Runner class
package in.nareshit.raghu.runner;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import in.nareshit.raghu.service.MailService;

@Component
public class MailServiceRunner implements CommandLineRunner{

	@Autowired
	private MailService ms;
	
	public void run(String... args) throws Exception {
		Resource file = new FileSystemResource("F:\\Images\\SpringBoot8PM_22022021.png"); 
		
		boolean sent = ms.sendEmail(
				"javaraghu2018@gmail.com", 
				new String[] {
						"chsprakash86@gmail.com",
						"amritagrawal255@gmail.com",
						"ambikareddy7198@gmail.com",
						"umangsontakke70@gmail.com"
				}, new String[] {
						"mahanandananda2017@gmail.com",
						"nageswarik997@gmail.com",
						"yerane21@gmail.com",
						"prasanta.sahoo@irisbusiness.com",
						"anjaliguptajnp21@gmail.com"

				}, 
				"Welcome to MySubject", 
				"Hello Data!" + new Date(), file);
		
		if(sent)
			System.out.println("MAIL SENT");
		else 
			System.out.println("NOT SENT");
	}
}
------------------------------------------------------------



Q) Are yu going to send email everytime with attachment or 
  without attachment?

A) It may be with attachment/ with out with attachment.

file!=null? then allocate attachment memory : else no.


*) file!=null?true:false
  If file exist then allocate attchment memory else not.

1) a>b?tue:false
   is equal to below (in short format)
2) a>b


*) MiemMessage : MIME- Multipurpose Internet Mail Extension
   [Any type of data..]

*) MimeMessageHelper :  Supports filling data in Message object
    (to,subj,text,att...)

*) This object takes two inputs "message:MimeMessage,multipart:boolean"
*) If you attachments to pass using email then define multipart=true,
   else define multipart=false.

*) To create one empty message use JavaMailSender
    MimeMessage message = sender.createMimeMessage();

*) even to submit/send message use JavaMailSender
    sender.send(message);

-------------------------------------------------------------
*) In Helper class we have setText() overloaded methods

  setText(String text);     //calling setText(text,false) internally.
  setText(String text, boolean html);  

*) If first method is called then data is sent as plain text (Display
   what it is). 2nd method convert data into HTML Format and gives
   output in HTML Output(like browser output).
----------------------------------------------------------
Q) What is Template Email?
A) Define one HTML Format commonly for multiple users.
  and replace their data at runtime and send to them using
  HTML Format

--core java code--
package in.nareshit.raghu;

import java.io.FileInputStream;

public class MailTemplate {

	private static String template =null;

	static {
		try {
			FileInputStream fis = new FileInputStream("F:\\Notes\\mailtemplate.txt");
			byte[] bytes= new byte[fis.available()];
			fis.read(bytes);
			template = new String(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	public static String getTemplate() {
		return template;
	}

	public static void main(String[] args) {
		String template = getTemplate();
		template=template.replace("{{user}}", "AJAY")
				.replace("{{firstname}}", "SENTIL")
				.replace("{{lastname}}", "AJAY KUMAR")
				.replace("{{date}}", new java.util.Date().toString());

		System.out.println(template);
	}
}

---mailtemplate.txt---
<html>
<body>
<h1>WELCOME TO {{user}} </h1>
This is sample mail to Mr/Mrs/Ms. {{firstname}} - {{lastname}} <br/>
<b>Thank you very much.</b>
Date : {{date}}
</body>
</html>
-----------------------

Q) Read File Data into one String variable?
FileInputStream fis = new FileInputStream("F:\\Notes\\mailtemplate.txt");
byte[] bytes= new byte[fis.available()];
fis.read(bytes);
template = new String(bytes);

Q) Replace Sting data with other String input?

template.replace(toBereplaced, replaceText)

Q) What is method overloading?
same method name with different parameters.


=======================code==========================
Name :SpringBoot2Email
Dep  : Java Mail Sender

1. application.yml
spring:
  mail:
    host: smtp.gmail.com
    password: 0044javaraghu2200
    port: 587
    username: javaraghu2018@gmail.com
    properties:
      mail:
        smtp:
          starttls:
            enable: true

2. MailTemplate
package in.nareshit.raghu;

import java.io.FileInputStream;

public class MailTemplate {

	private static String template =null;

	static {
		try {
			FileInputStream fis = new FileInputStream("F:\\Notes\\mailtemplate.txt");
			byte[] bytes= new byte[fis.available()];
			fis.read(bytes);
			template = new String(bytes);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static String getTemplate() {
		return template;
	}

	public static String getTemplateData(
			String user,String fn,String ln)
	{
		String template = getTemplate();
		template=template.replace("{{user}}", user)
				.replace("{{firstname}}", fn)
				.replace("{{lastname}}", ln)
				.replace("{{date}}", new java.util.Date().toString());
		return template;
	}
}

3. MailService
package in.nareshit.raghu.service;

import javax.mail.internet.MimeMessage;

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

@Component
public class MailService {
	
	@Autowired //Read new JavaMailSenderImpl() from container
	private JavaMailSender sender;
	
	public boolean sendEmail(
			String to,
			String cc[],
			String bcc[],
			String subject,
			String text,
			Resource file
			) 
	{
		boolean isSent = false;
		
		try {
			//create new MimeMessage
			MimeMessage message = sender.createMimeMessage();
			
			// Use Helper class and fill details(to,cc..)
			//MimeMessageHelper helper = new MimeMessageHelper(message, file!=null?true:false); 
			MimeMessageHelper helper = new MimeMessageHelper(message, file!=null);
			
			helper.setTo(to);
			if(cc!=null)
				helper.setCc(cc);
			if(bcc!=null)
				helper.setBcc(bcc);
			
			helper.setSubject(subject);
			helper.setText(text,true);
			//helper.setText(text);//false
			
			if(file!=null) {
				//file name, file data
				helper.addAttachment(file.getFilename(), file);
			}
			
			//send message
			sender.send(message);
			
			isSent=true;
		} catch (Exception e) {
			isSent=false;
			e.printStackTrace();
		}
		
		return isSent;
	}
	
	
	public boolean sendEmail(
			String to,
			String subject,
			String text) 
	{
		return sendEmail(to, null, null, subject, text, null);
	}
}


4. Test Runner
package in.nareshit.raghu.runner;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import in.nareshit.raghu.MailTemplate;
import in.nareshit.raghu.service.MailService;

@Component
public class MailServiceRunner implements CommandLineRunner{

	@Autowired
	private MailService ms;
	
	public void run(String... args) throws Exception {
		Resource file = new FileSystemResource("F:\\Images\\SpringBoot8PM_22022021.png"); 
		/*
		boolean sent = ms.sendEmail(
				"javaraghu2018@gmail.com", 
				null, null, 
				"Welcome to MySubject", 
				MailTemplate.getTemplateData(
						"KUMAR", "Rank. Jayrai", " RAJU"),
				file);
		*/
		boolean sent = ms.sendEmail("javaraghu2018@gmail.com", "Welcome to MySubject",
				MailTemplate.getTemplateData(
						"SAMUL", "St. Annos", " Phillips ")
				);
		if(sent)
			System.out.println("MAIL SENT");
		else 
			System.out.println("NOT SENT");
	}
}
=====================================================================
*)Note : Email sending failed.

a. Invalid Un/password (or with spaces in yml/props files)
b. Purchased Service from Google 
   else enable less secure apps
    > Click on Top right corner on email account (profile picture)
    > Manage your google account
    > Security
    > Less Secure Apps
    > Turn on Less secure apps.
c. Disable Antivirus for few minutes.
d. 2 step verification must be disabled.
e.*** System JDK/JRE, OS is effected with virus.

*) Google Search: google email domain purchase
-----------------------------------------------------------------