1

I want to send an email with html markup text. I want that my code gets the message from a file on my pc and I want to be able to use variables I have in my project. so that my message comes up like: Hello [username] and that [username] is a variable.

package com.email;

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
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;


public class SendMail extends javax.mail.Authenticator { 

  private String _user; 
  private String _pass; 

  private String[] _to = new String[1]; 
  private String _from; 

  private String _port; 
  private String _sport; 

  private String _host; 

  private String _subject; 
  private String _body; 

  private boolean _auth; 

  private boolean _debuggable; 

  private Multipart _multipart; 


  public SendMail() {
    _host = "smtp.live.com"; // default smtp server
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port

    _user = "[email protected]"; // username 
    _pass = "password"; // password 
    _from = "[email protected]"; // email sent from 
    _subject = "Welcome to Ravenous!"; // email subject 
    _body = "<h2 style='font-style: normal;font-weight: 700;Margin-bottom: 0;Margin-top: 0;font-size: 24px;line-height: 32px;font-family: Open Sans,sans-serif;color: #44a8c7;text-align: center'>Welcome to Ravenous!</h2><p style='font-style: normal;font-weight: 400;Margin-bottom: 0;Margin-top: 16px;font-size: 15px;line-height: 24px;font-family: Open Sans,sans-serif;color: #60666d;text-align: center'>Hello, we hope that you enjoy your stay on Ravenous.</p>"; // email body 
    _to[0] = "";
    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    _multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 

  public SendMail(String to) { 
    this(); 
    _user = "[email protected]";
    _pass = "password";

    _to[0] = to; 
  } 

  public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
        addressTo[i] = new InternetAddress(_to[i]); 
      } 
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 

      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setContent(_body, "text/html; charset=utf-8"); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 

  private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.host", _host); 

    if(_debuggable) { 
      props.put("mail.debug", "true"); 
    } 

    if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
   // props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.put("mail.smtp.starttls.enable", "true");

    return props; 
  } 

  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 

  public void setBody(String _body) { 
    this._body = _body; 
  } 

  public String[] getTo() { 
    return _to; 
  } 

  public void setTo(String[] _to) { 
    this._to = _to; 
  } 

  public String getFrom() { 
    return _from; 
  } 

  public void setFrom(String _from) { 
    this._from = _from; 
  }
  public String getSubject() { 
    return _subject; 
  } 

  public void setSubject(String _subject) { 
    this._subject = _subject; 
  }   
  // more of the getters and setters ….. 
} 

So how would I get my html message from an html file and send it with some variables?

This is what my template file looks like:

package com.email;

import java.io.*;
import java.util.*;

import com.world.entity.impl.player.Player;

import freemarker.template.*;

public class Template {

    public static String body;

    public static void  getTemplate() throws Exception {

        Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
        cfg.setDirectoryForTemplateLoading(new File("./data/templates/"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

        Map<String, Object> root = new HashMap<String, Object>();
        root.put("userName", SendMail._username);
        Map<String, String> latest = new HashMap<String, String>();
        root.put("latestProduct", latest);
        latest.put("url", "products/greenmouse.html");
        latest.put("name", "green mouse");

        freemarker.template.Template temp = cfg.getTemplate("Welcome.ftl");

        Writer out = new OutputStreamWriter(System.out);
        body = out.toString();
        temp.process(root, out);

    }

}
1

1 Answer 1

2

Use a templating engine for this, I personally did this with freemarker.

It allows you to store a template alongside your program which you fill by using variables passed from your code.

Map root = new HashMap();
root.put("name", "John Doe");
...
Template temp = cfg.getTemplate("mymailtemplate.ftl");
...

In the template you simply write something like this:

<h1>Welcome ${name}!</h1>

There is a good example on the freemarker page

Sign up to request clarification or add additional context in comments.

5 Comments

Thank you very much, I am going to use this, but I have one question. I have used that example file and made my tfl file, but how do I make that the body of the email in my script?
Unfortunately the Template does not allow writing to a string directly. So you will need to do something like this:stackoverflow.com/questions/19181206/…. Doing so you convert a Writer to a String, this String then can be assigned to your _body.
Okay, I did that, but now it isn't sending the email. I added my template file to the main post.
Swap the last two lines: first processing, then assign to body
I did that, but I still don't get an email. Can you help me again?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.