Showing posts with label core java. Show all posts
Showing posts with label core java. Show all posts

Tuesday, September 20, 2016

Send Email and Attache Text or Image file in Java tutorial

I am going to give you a brief about how it send email in java programs. Sending emails is one of the common tasks in real life applications and that’s why Java provides robust JavaMail API that we can use to send emails using SMTP server. JavaMail API supports both TLS and SSL authentication for sending emails.

we will learn how to use JavaMail API to send emails using SMTP server with no authentication, TLS and SSL authentication and how to send attachments and attach and use images in the email body. For TLS and SSL authentication, I am using GMail SMTP server because it supports both of them.

JavaMail API is not part of standard JDK, so you will have to download it from it’s official website i.e JavaMail Home Page. Download the latest version of the JavaMail reference implementation and include it in your project build path. The jar file name will be javax.mail.jar.

If you are using Maven based project, just add below dependency in your project.

<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>

1)Creating javax.mail.Session object

2)Creating javax.mail.internet.MimeMessage object, we have to set different properties in this object such as recipient email address, Email Subject, Reply-To email, email body, attachments etc.

3)Using javax.mail.Transport to send the email message.

The logic to create session differs based on the type of SMTP server, for example if SMTP server doesn’t require any authentication we can create the Session object with some simple properties whereas if it requires TLS or SSL authentication, then logic to create will differ.

So I will create a utility class with some utility methods to send emails and then I will use this utility method with different SMTP servers.

Here is the sample code:

EmailUtil.java:

import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
 * @author Abhinaw.Tripathi
 *
 */
public class EmailUtil
{
/**
* Utility method to send simple HTML email
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendEmail(Session session, String toEmail, String subject, String body){
try
   {
     MimeMessage msg = new MimeMessage(session);
     //set message headers
     msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
     msg.addHeader("format", "flowed");
     msg.addHeader("Content-Transfer-Encoding", "8bit");
     msg.setFrom(new InternetAddress("Abhinaw. [email protected]", "NoReply-JD"));
     msg.setReplyTo(InternetAddress.parse("[email protected]", false));
     msg.setSubject(subject, "UTF-8");
     msg.setText(body, "UTF-8");
     msg.setSentDate(new Date());
     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
     System.out.println("Message is ready");
         Transport.send(msg);
     System.out.println("EMail Sent Successfully!!");
   }
   catch (Exception e)
{
     e.printStackTrace();
   }
}
/**
* Utility method to send email with attachment
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendAttachmentEmail(Session session, String toEmail, String subject, String body)
{
try
{
        MimeMessage msg = new MimeMessage(session);
        msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
    msg.addHeader("format", "flowed");
    msg.addHeader("Content-Transfer-Encoding", "8bit");  
    msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));
    msg.setReplyTo(InternetAddress.parse("[email protected]", false));
    msg.setSubject(subject, "UTF-8");
    msg.setSentDate(new Date());
    msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));    
        // Create the message body part
        BodyPart messageBodyPart = new MimeBodyPart();
        // Fill the message
        messageBodyPart.setText(body);
        // Create a multipart message for attachment
        Multipart multipart = new MimeMultipart();

        // Set text message part
        multipart.addBodyPart(messageBodyPart);

        // Second part is attachment
        messageBodyPart = new MimeBodyPart();
        String filename = "abc.txt";
        DataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);
        multipart.addBodyPart(messageBodyPart);
        // Send the complete message parts
        msg.setContent(multipart);
        // Send message
        Transport.send(msg);
        System.out.println("EMail Sent Successfully with attachment!!");
     }
catch (MessagingException e)
{
        e.printStackTrace();
   }
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}

/**
* Utility method to send image in email body
* @param session
* @param toEmail
* @param subject
* @param body
*/
public static void sendImageEmail(Session session, String toEmail, String subject, String body)
{
try
{
        MimeMessage msg = new MimeMessage(session);
        msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
    msg.addHeader("format", "flowed");
    msg.addHeader("Content-Transfer-Encoding", "8bit");    
    msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));
    msg.setReplyTo(InternetAddress.parse("[email protected]", false));
    msg.setSubject(subject, "UTF-8");
    msg.setSentDate(new Date());
    msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));    
        // Create the message body part
        BodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText(body);      
        // Create a multipart message for attachment
        Multipart multipart = new MimeMultipart();
        // Set text message part
        multipart.addBodyPart(messageBodyPart);
        // Second part is image attachment
        messageBodyPart = new MimeBodyPart();
        String filename = "image.png";
        DataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);
        //Trick is to add the content-id header here
        messageBodyPart.setHeader("Content-ID", "image_id");
        multipart.addBodyPart(messageBodyPart);
        //third part for displaying image in the email body
        messageBodyPart = new MimeBodyPart();
        messageBodyPart.setContent("<h1>Attached Image</h1>" +"<img src='cid:image_id'>", "text/html");
        multipart.addBodyPart(messageBodyPart);      
        //Set the multipart message to the email message
        msg.setContent(multipart);
        // Send message
        Transport.send(msg);
        System.out.println("EMail Sent Successfully with image!!");
     }
catch (MessagingException e)
{
        e.printStackTrace();
   }
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
}


Now if you wish to send simple email do something like this:

SimpleEmail.java:

import java.util.Properties;
import javax.mail.Session;
/**
 * @author Abhinaw.Tripathi
 *
 */
public class SimpleEmail
{
   public static void main(String[] args)
   {
   System.out.println("SimpleEmail Start");
   String smtpHostServer = "smtp.gmail.com";
   String emailID = "[email protected]";
   Properties props = System.getProperties();
   props.put("mail.smtp.host", smtpHostServer);
   Session session = Session.getInstance(props, null);
   EmailUtil.sendEmail(session, emailID,"SimpleEmail Testing Subject", "SimpleEmail Testing Body");
   }
 

}

if  you wish to send email with SSL Authentication do something like this:

SSLEmail.Java:

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class SSLEmail
{
/**
  Outgoing Mail (SMTP) Server
  requires TLS or SSL: smtp.gmail.com (use authentication)
  Use Authentication: Yes
  Port for SSL: 465
*/
public static void main(String[] args)
{
final String fromEmail = "[email protected]"; //requires valid gmail id
final String password = "mypassword"; // correct password for gmail id
final String toEmail = "[email protected]"; // can be any email id

System.out.println("SSLEmail Start");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
props.put("mail.smtp.socketFactory.port", "465"); //SSL Port
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true"); //Enabling SMTP Authentication
props.put("mail.smtp.port", "465"); //SMTP Port

Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, password);
}
};

Session session = Session.getDefaultInstance(props, auth);
System.out.println("Session created");
       EmailUtil.sendEmail(session, toEmail,"SSLEmail Testing Subject", "SSLEmail Testing Body");
       EmailUtil.sendAttachmentEmail(session, toEmail,"SSLEmail Testing Subject with Attachment", "SSLEmail Testing Body with Attachment");
       EmailUtil.sendImageEmail(session, toEmail,"SSLEmail Testing Subject with Image", "SSLEmail Testing Body with Image");
}


}

TLSEmail.java:

/**
 * 
 */
package com.advanceemail;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
/**
 * @author Abhinaw.Tripathi
 *
 */
public class TLSEmail 
{
/**
  Outgoing Mail (SMTP) Server
  requires TLS or SSL: smtp.gmail.com (use authentication)
  Use Authentication: Yes
  Port for TLS/STARTTLS: 587
*/
public static void main(String[] args)
{
final String fromEmail = "[email protected]"; //requires valid gmail id
final String password = "mypassword"; // correct password for gmail id
final String toEmail = "[email protected]"; // can be any email id 
System.out.println("TLSEmail Start");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
props.put("mail.smtp.port", "587"); //TLS Port
props.put("mail.smtp.auth", "true"); //enable authentication
props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
       //create Authenticator object to pass in Session.getInstance argument
Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() 
{
return new PasswordAuthentication(fromEmail, password);
}
};
Session session = Session.getInstance(props, auth);
EmailUtil.sendEmail(session, toEmail,"TLSEmail Testing Subject", "TLSEmail Testing Body");
}
}



In above all code i have shown you how to send email .however you can also attache text file and image file also.very simple code.in fact you can also design the email in HTML format.



Friday, May 27, 2016

Design Pattern - Observer Pattern tutorial example java

What is Observer Pattern?

Yes, Observer Pattern is Behavioral Design Pattern.In the Observer pattern ,an object called subject maintains a collect of objects called Observers. when the subject changes it notifies the observers.

For Example:
The observer pattern defines a link between objects so that when one objects state changes all dependent objects are updated automatically.a very famous example of Producer-Consumer problem in core java.

So, Observer pattern is designed to help cope with one to many relationships between objects allowing changes in an object to update many associated objects.


When to use Observer Pattern:

  • when a change to one object requires changing others and we do not know how many objects need to be changed.
  • When an object should be able to notify other objects without making assumptions about who these objects are.
  • when an abstraction has two aspects  one depends on the other.
Implementation:


public interface TempratureSubject
{
  public void addObserver(TempratureObserver TempratureObserver);
  public void removeObserver(TempratureObserver TempratureObserver);
  public void notify();
}

public interface TempratureObserver 
{
  public void update(int temparature);
}

public class TemparatureStation implements TempratureSubject
{
  Set<TempratureObserver> temparatureObservers;
  int temparature;
  
  public TemparatureStation(int temp)
  {
    this.temparature=temp;
  }
  
  public void addObserver(TempratureObserver tempObserver)
  {
    temparatureObservers.add(tempObserver);
  }
  
  public void removeObserver(TempratureObserver tempObserver)
  {
    temparatureObservers.add(tempObserver);
  }
  
  public void notify()
  {
    Iterator<TempratureObserver> it=tempObserver.iterator();
while(it.hasNext)
{
  TempratureObserver tempObserver= it.next();
  tempObserver.update(temparature);
}
  }
  
  public void setTemparature(int newTemparature)
  {
     System.out.println("Setting temparature to " + newTemparature); 
     temparature=newTemparature;
notify();
           
  }  
}



how client will use this pattern?Let say,

public class TempratureCustmer implements TempratureObserver
{
  public void update(int temparature)
  {
    System.out.println("Customer 1 found the temparature as"+ temparature);
  }
}

public class observerTest
{
  public static void main(String args[])
  {
    TemparatureStation tempStation=new  TemparatureStation();
TempratureCustmer tcustomer=new TempratureCustmer();
tempStation.addObserver(tcustomer);
tempStation.removeObserver(tcustomer);
tempStation.setTemparature(35);
  }
}

Very Important Points to remember before using Observer pattern

  • Also known as Depedents ,Publish-Subscibe patterns.
  • Define one to many dependency between objects.
  • Abstract coupling between subject and obsever.
  • Unexpected updates because observer have no knowledge of each others presence.