Friday, March 30, 2012

Combine gmail and Java mail library to create your email compaign

If you use gmail for your company, you can run your own email campaign without paying those email campaign companies.  Write a small script or Java program to pull user data from your database and create a pretty HTML based email template. If you want to track them, insert the tracking in the HTML content.  Use the following code to start sending emails to your users.  Just be sure not to abuse the gmail account.


import java.io.File;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


public class Mailman extends javax.mail.Authenticator
{
    private String smtpServer;
    private String from;
    private String password;
    private boolean useAuth;


    public Mailman(String sender)
    {
        from = sender;
        smtpServer = "smtp.gmail.com";
    }


    public String getSmtpServer() { return smtpServer; }
    public void setSmtpServer(String svr) { smtpServer = svr; }


    public String getSender() { return from; }
    public void setSender(String fm) { from = fm; }


    public String getPassword() { return password; }
    public void setPassword(String passwd) {
        password = passwd;
        if (passwd != null && passwd.length() > 0) {
            useAuth = true;
        } else {
            useAuth = false;
        }
    }


    /*
     * This method sends plain text mail.
     */
    public void send(String subject, String body, String to, String cc)
    {
        try
        {
            Message msg = createMessage(subject, to, cc);
            msg.setText(body);
            Transport.send(msg);
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }


    /*
     * this method sends mail with file attachments
     */
    public void send(String subject, String body, List<String> attachPaths, String to, String cc)
    {
        try
        {
            Message msg = createMessage(subject, to, cc);
            Multipart multipart = new MimeMultipart();
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(body);
            multipart.addBodyPart(messageBodyPart);


            for (String fileAttachment : attachPaths) {
                MimeBodyPart attachment = new MimeBodyPart();
                DataSource source = new FileDataSource(fileAttachment);
                attachment.setDataHandler(new DataHandler(source));
                attachment.setFileName(new File(fileAttachment).getName());
                multipart.addBodyPart(attachment);
            }
            msg.setContent(multipart);


            Transport.send(msg);
        }
        catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }


    protected Message createMessage(String subject, String to, String cc) throws Exception
    {
        Properties props = System.getProperties();
        props.put("mail.smtp.host", smtpServer);
        Session session = null;
        if ( useAuth ) {
            props.put("mail.smtp.starttls.enable","true");
            props.put("mail.smtp.auth", "true"); 
            // SSL
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");


            session = Session.getInstance(props, this);
        } else {
            session = Session.getInstance(props);
        }
        // create a new message
        Message msg = new MimeMessage(session);


        if (from == null) {
          from = System.getProperty("user.name");
        }
        msg.setFrom(new InternetAddress(from));
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));
        if (cc != null) {
            msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false));
        }


        // set the subjecttext
        msg.setSubject(subject);
        // set some other header information
        msg.setHeader("X-Mailer", "s3ar-JavaMail");
        msg.setSentDate(new Date());


        return msg;
    }


    @Override
    public PasswordAuthentication getPasswordAuthentication()
    {
        // you can read the password from a file
        // which should set mode as 0400


        return new PasswordAuthentication(from, password);
    }
}

No comments:

Post a Comment