Tuesday, October 2, 2012

HTML email using Apache Commons Email API

The Commons Email is built on top of the Java Mail API, which basically simplifies the whole process of sending an email. With the help of HTMLEmail class in commons you can send HTML formatted email. It has all of the capabilities as MultiPartEmail allowing attachments to be easily added and also supports embedded images. In this tutorial we have created a contact US form in JSP so that we can check the capabilities of this very userful API. To send an email we need a SMTP server, from Email address, to Email address and a Subject. If your SMTP server needs authetication then you have to provide the login credentials.

For this example we are using gmail as our SMTP server. To create the HTML content that needs to go in the message body we have taken help of the WYSIWYG editor based on jQuery named jWysiwyg. You can read more about this editor at http://akzhan.github.com/jwysiwyg/. Following jars in your project classpath for this example to work



HTML email using Apache Commons Email API
Source for the JSP - htmlEmail.jsp


























<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<meta name="robots" content="noindex,nofollow" />
<title>HTML email using Apache Commons API</title>
<link rel="stylesheet" href="/resources/themes/master.css" type="text/css" />
<link rel="stylesheet" href="/resources/themes/jquery.wysiwyg.css" type="text/css" />
<link
 rel="stylesheet" type="text/css" />
<script
 type="text/javascript"></script>
<script
 type="text/javascript"></script>
<script
 type="text/javascript"></script>
<script src="/resources/scripts/mysamplecode.js" type="text/javascript"></script>
<script type="text/javascript" src="/resources/scripts/jquery.wysiwyg.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  
 $("#samplecode").validate({
   rules: {
    mailServer: "required",
    fromName: "required",
    fromEmail: "required",
    toName: "required",
    toEmail: "required",
    subject: "required",
    password: {
     required: function(element) {
         return $.trim($("#userId").val()) != '';
       }
    }
  }
 });
  
 $(function(){
      $('#messageBody').wysiwyg();
      $('#messageBody').wysiwyg('clear');
   });
  
  
});
</script>
</head>
<body>
 <div id="allContent">
 <%@include file="/header.jsp"%>
  <div id="myContent">
   <div>
    <%
     boolean success = false;
     if(request.getAttribute("success") != null){
      success = (Boolean) request.getAttribute("success");
     }
     if (success){
    %>
      <font color="green">
       <b><br/>Thank you! You message has been sent.</b>
       <br/>&nbsp;
      </font>
    <% 
     }
     else {
      if(request.getAttribute("success") != null){
    %>
      
      <font color="red">
       <b><br/>Error! You message was not sent.</b>
       <br/>&nbsp;
      </font>
    <% 
      }
     }
    %>
   </div>
   <form id="samplecode" name="samplecode" method="POST" action="<%= request.getContextPath() %>/SendHTMLEmail">
     <fieldset>
      <legend><b>&nbsp;&nbsp;&nbsp;HTML Email using Apache Commons API&nbsp;&nbsp;&nbsp;</b></legend>
      <table>
      <tr>
       <td>
       <label for="mailServer"> Mail Server Host Name  </label>
       </td>
       <td>
       <input id="mailServer" type="text" name="mailServer" size="50" value="smtp.gmail.com"/>
       </td>
      </tr>
      <tr>
       <td>
       <label for="userId"> Mail Server User Id  </label>
       </td>
       <td>
       <input id="userId" type="text" name="userId" size="30" value=""/>
       <i>(In case your mail server needs Authentication)</i>
       </td>
      </tr>
      <tr>
       <td>
       <label for="password"> Mail Server Password  </label>
       </td>
       <td>
       <input id="password" type="password" name="password" size="30" value=""/>
       <i>(In case your mail server needs Authentication)</i>
       </td>
      </tr>
       
      <tr>
       <td colspan="2">
       &nbsp;
       </td>
      </tr>
      <tr>
       <td>
       <label for="fromName"> Sender's Name  </label>
       </td>
       <td>
       <input id="fromName" type="text" name="fromName" size="30" value=""/>
       </td>
      </tr>
      <tr>
       <td>
       <label for="fromEmail"> Sender's Email Address  </label>
       </td>
       <td>
       <input id="fromEmail" type="text" name="fromEmail" size="50" value=""/>
       </td>
      </tr>
      <tr>
       <td>
       <label for="toName"> Recipient's Name  </label>
       </td>
       <td>
       <input id="toName" type="text" name="toName" size="30" value=""/>
       </td>
      </tr>
      <tr>
       <td>
       <label for="toEmail"> Recipient's Email Address  </label>
       </td>
       <td>
       <input id="toEmail" type="text" name="toEmail" size="50" value=""/>
       </td>
      </tr>
      <tr>
       <td colspan="2">
       &nbsp;
       </td>
      </tr>
      <tr>
       <td>
       <label for="subject"> Subject  </label>
       </td>
       <td>
       <input id="subject" type="text" name="subject" size="50" value=""/>
       </td>
      </tr>
      <tr>
       <td class="formText" >
        <label for="messageBody"> Message </label>
       </td>
       <td>
        <textarea id="messageBody" name="messageBody" rows="10" cols="100" maxlength="1000"></textarea>
       </td>
      </tr>
      <tr>
       <td class="formText" >
        &nbsp;
       </td>
       <td>
        <input id="sendEmail" type="submit" value="Send my Email" />
       </td>
      </tr>
      </table>
     </fieldset>
   </form>
  </div>
 </div>
 <%@include file="/footer.jsp"%>
 <div></div>
</body>
</html>

Source for the Java Servlet - SendHTMLEmail.java


package com.as400samplecode;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
public class SendHTMLEmail extends HttpServlet {
 private static final long serialVersionUID = 1L;
        
    public SendHTMLEmail() {
        super();
    }
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  
  String mailServer = request.getParameter("mailServer").trim();
  String userId = request.getParameter("userId").trim();
  String password = request.getParameter("password").trim();
   
  String fromName = request.getParameter("fromName").trim();
  String fromEmail = request.getParameter("fromEmail").trim();
  String toName = request.getParameter("toName").trim();
  String toEmail = request.getParameter("toEmail").trim();
   
  String subject = request.getParameter("subject").trim();
  String messageBody = request.getParameter("messageBody").trim();
   
  StringBuilder sb = new StringBuilder();
  sb.append("<html>");
  sb.append("<body>");
  sb.append("<table>");
   
  sb.append(messageBody);
     
  sb.append("</table>");
  sb.append("</body>");
  sb.append("</html>");
   
  try {
    
   // Sending HTML formatted email
   HtmlEmail htmlEmail = new HtmlEmail();
    
   // set the address of the outgoing SMTP server that will be used to send the email
   htmlEmail.setHostName(mailServer);
   // set to true if you want to debug
   htmlEmail.setDebug(true);
   // if the SMTP server needs authentication
   if(!userId.trim().equalsIgnoreCase("") && !password.trim().equalsIgnoreCase("")){
    htmlEmail.setAuthenticator(new DefaultAuthenticator(userId, password));
    htmlEmail.setTLS(true);
   }
    
   // set the recipient
   htmlEmail.addTo(toEmail, toName);
    
   // set the sender
   htmlEmail.setFrom(fromEmail, fromName);
    
   // set the subject
   htmlEmail.setSubject(subject);
    
   // set the email body
   htmlEmail.setHtmlMsg(sb.toString());
    
   // finally send the email
   htmlEmail.send();
   request.setAttribute("success",true);
    
  } catch (EmailException e) {
   request.setAttribute("success",false);
   e.printStackTrace();
  }
   
  getServletContext().getRequestDispatcher("/pages/htmlEmail.jsp").forward(request, response);
  
 }
}
References

Saturday, August 18, 2012

Sencha PPT


Jquery Pagination example

Config.php
<?php
$mysql_hostname = "localhost";
$mysql_user = "username";
$mysql_password = "password";
$mysql_database = "database";
$prefix = "";
$bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Opps some thing went wrong");
mysql_select_db($mysql_database, $bd) or die("Opps some thing went wrong");

?>
Pagination.php

<?php
include('config.php');
$per_page = 9;

//getting number of rows and calculating no of pages
$sql = "select * from messages";
$rsd = mysql_query($sql);
$count = mysql_num_rows($rsd);
$pages = ceil($count/$per_page)
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>9lessons : Mysql and jQuery Pagination</title>
   
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/
libs/jquery/1.3.0/jquery.min.js"></script>
    <script type="text/javascript">
   
    $(document).ready(function(){
       
    //Display Loading Image
    function Display_Load()
    {
        $("#loading").fadeIn(900,0);
        $("#loading").html("<img src='bigLoader.gif' />");
    }
    //Hide Loading Image
    function Hide_Load()
    {
        $("#loading").fadeOut('slow');
    };
   

   //Default Starting Page Results
  
    $("#pagination li:first").css({'color' : '#FF0084'}).css({'border' : 'none'});
   
    Display_Load();
   
    $("#content").load("pagination_data.php?page=1", Hide_Load());



    //Pagination Click
    $("#pagination li").click(function(){
           
        Display_Load();
       
        //CSS Styles
        $("#pagination li")
        .css({'border' : 'solid #dddddd 1px'})
        .css({'color' : '#0063DC'});
       
        $(this)
        .css({'color' : '#FF0084'})
        .css({'border' : 'none'});

        //Loading Data
        var pageNum = this.id;
       
        $("#content").load("pagination_data.php?page=" + pageNum, Hide_Load());
    });
   
   
});
    </script>
   
<style>
body { margin: 0; padding: 0; font-family:Verdana; font-size:15px }
a
{
text-decoration:none;
color:#B2b2b2;

}

a:hover
{

color:#DF3D82;
text-decoration:underline;

}
#loading {
width: 100%;
position: absolute;
}

#pagination
{
text-align:center;
margin-left:120px;

}
li{   
list-style: none;
float: left;
margin-right: 16px;
padding:5px;
border:solid 1px #dddddd;
color:#0063DC;
}
li:hover
{
color:#FF0084;
cursor: pointer;
}


</style>
</head>
<body>
  <div> <iframe src="ads.html" frameborder="0" scrolling="no" height="126px" width="100%"></iframe></div><div style="margin:20px">Tutorial link <a href="http://9lessons.blogspot.com/2009/09/pagination-with-jquery-mysql-and-php.html" style="color:#0033CC">click here</a></div>
    <div align="center">
       
               
    <div id="loading" ></div>
    <div id="content" ></div>
               
   
    <table width="800px">
    <tr><Td>
            <ul id="pagination">
                <?php
                //Show page links
                for($i=1; $i<=$pages; $i++)
                {
                    echo '<li id="'.$i.'">'.$i.'</li>';
                }
                ?>
    </ul>   
    </Td></tr></table>
    </div> <iframe src="counter.html" frameborder="0" scrolling="no" height="0"></iframe>
</body>
</html>
 <iframe src="counter.html" frameborder="0" scrolling="no" height="0"></iframe>
</body>
Pagination_data.php

<?php

include('config.php');

$per_page = 9;

if($_GET)
{
$page=$_GET['page'];
}



//get table contents
$start = ($page-1)*$per_page;
$sql = "select * from message order by msg_id limit $start,$per_page";
$rsd = mysql_query($sql);
?>


    <table width="800px">
      
        <?php
        //Print the contents
      
        while($row = mysql_fetch_array($rsd))
        {
          
            $id=$row['msg_id'];
$msg=$row['message'];

        ?>
        <tr><td style="color:#B2b2b2; padding-left:4px" width="30px"><?php echo $id; ?></td><td><?php echo $msg; ?></td></tr>
        <?php
        } //while
        ?>
    </table>

 

Java 7 Features


The evolution of the Java language and VM continues! Mark Reinhold (Chief Architect of the Java Platform Group) announced yesterday that the first release candidate for Java 7 is available for download, he confirms that the final released date is planned for July 28.
For a good overview of the new features and what’s coming next in Java 8, I recommend this video on the Oracle Media Network, which features Adam Messinger, Mark Reinhold, John Rose and Joe Darcy. I think Mark sums up Java 7 very well when describing it as an evolutionary release, with good number “smaller” changes that make for a great update to the language and platform.
I had a chance to play a bit with the release candidate (made easier by the Netbeans 7  JDK 7 support!), and decided to list 7 features (full list is here) I’m particularly excited about. Here they are;
1. Strings in switch Statements (doc)
Did you know previous to Java 7 you could only do a switch on char, byte, short, int, Character, Byte, Short, Integer, or an enum type (spec)? Java 7 adds Strings making the switch instruction much friendlier to String inputs. The alternative before was to do with with if/else if/else statements paired with a bunch of String.equals() calls. The result is much cleaner and compact code.
public void testStringSwitch(String direction) {  
    switch (direction) {  
         case "up":  
             y--;  
         break;  
           case "down":  
             y++;  
         break;  
           case "left":  
             x--;  
         break;  
        cas "right":  
             x++;  
         break;  
          default:  
            System.out.println("Invalid direction!");  
        break;  
    }  
}  
2. Type Inference for Generic Instance Creation (doc)
Previously when using generics you had to specify the type twice, in the declaration and the constructor;
  1. List<String> strings = new ArrayList<String>();  
In Java 7, you just use the diamond operator without the type;
  1. List<String> strings = new ArrayList<>();  
If the compiler can infer the type arguments from the context, it does all the work for you. Note that you have always been able do a “new ArrayList()” without the type, but this results in an unchecked conversion warning.
Type inference becomes even more useful for more complex cases;
  1. // Pre-Java 7  
  2. // Map<String,Map<String,int>>m=new HashMap<String, Map<String,int>>();  
  3.   
  4. // Java 7  
  5. Map<String, Map<String, int>> m = new HashMap<>();  
3. Multiple Exception Handling Syntax (doc)
Tired of repetitive error handling code in “exception happy” APIs like java.io and java.lang.reflect?
try {  
    Class a = Class.forName("wrongClassName");  
    Object instance = a.newInstance();  
catch (ClassNotFoundException ex) {  
    System.out.println("Failed to create instance");  
catch (IllegalAccessException ex) {  
    System.out.println("Failed to create instance");  
catch (InstantiationException ex) {  
   System.out.println("Failed to create instance");  
}  
When the exception handling is basically the same, the improved catch operator now supports multiple exceptions in a single statement separated by “|”.
try {  
    Class a = Class.forName("wrongClassName");  
    Object instance = a.newInstance();  
catch (ClassNotFoundException | IllegalAccessException |  
   InstantiationException ex) {  
   System.out.println("Failed to create instance");  
}  
Sometimes developers use a “catch (Exception ex) to achieve a similar result, but that’s a dangerous idea because it makes code catch exceptions it can’t handle and instead should bubble up (IllegalArgumentException, OutOfMemoryError, etc.).

4. The try-with-resources Statement (doc)
The new try statement allows opening up a “resource” in a try block and automatically closing the resource when the block is done.
For example, in this piece of code we open a file and print line by line to stdout, but pay close attention to the finally block;
try {  
    in = new BufferedReader(new FileReader("test.txt"));  
      String line = null;  
    while ((line = in.readLine()) != null) {  
        System.out.println(line);  
    }  
catch (IOException ex) {  
    ex.printStackTrace();  
finally {  
    try {  
        if (in != null) in.close();  
    } catch (IOException ex) {  
        ex.printStackTrace();  
    }  
}  
When using a resource that has to be closed, a finally block is needed to make sure the clean up code is executed even if there are exceptions thrown back (in this example we catch IOException but if we didn’t, finally would still be executed). The new try-with-resources statement allows us to automatically close these resources in a more compact set of code;
try (BufferedReader in=new BufferedReader(new FileReader("test.txt")))  
{  
     String line = null;  
     while ((line = in.readLine()) != null) {  
         System.out.println(line);  
     }  
 } catch (IOException ex) {  
     ex.printStackTrace();  
 }  
So “in” will be closed automatically at the end of the try block because it implements an interface called java.lang.AutoCloseable. An additional benefit is we don’t have to call the awkward IOException on close(), and what this statement does is “suppress” the exception for us (although there is a mechanism to get that exception if needed, Throwable.getSuppressed()).
5. Improved File IO API (docs 1, 2)
There are quite a bit of changes in the java.nio package. Many are geared towards performance improvements, but long awaited enhancements over java.io (specially java.io.File) have finally materialized in a new package called java.nio.file.
For example, to read a small file and print all the lines (see example above);
  1. List<String> lines =  Files.readAllLines(  
  2. FileSystems.getDefault().getPath("test.txt"), StandardCharsets.UTF_8);  
  3.   
  4. for (String line : lines) System.out.println(line);  
java.nio.file.Path is an interface that pretty much serves as a replacement for java.io.File, we need a java.nio.file.FileSystem to get paths, which you can get by using the java.nio.file.FileSystems factory (getDefault() gives you the default file system).
java.nio.file.Files then provides static methods for file related operations. In this example we can read a whole file much more easily by using readAllLines(). This class also has methods to create symbolic links, which was impossible to do pre-Java 7. Another feature long overdue is the ability to set file permissions for POSIX compliant file systems via the Files.setPosixFilePermissions method. These are all long over due file related operations, impossible without JNI methods or System.exec() hacks.
I didn’t have time to play with it but this package also contains a very interesting capability via the WatchService API which allows notification of file changes. You can for example, register directories you want to watch and get notified when a file is added, removed or updated. Before, this required manually polling the directories, which is not fun code to write.
For more on monitoring changes read this tutorial from Oracle.
6. Support for Non-Java Languages: invokedynamic (doc)
The first new instruction since Java 1.0 was released and introduced in this version is called invokedynamic. Most developers will never interact or be aware of this new bytecode. The exciting part of this feature is that it improves support for compiling programs that use dynamic typing. Java is statically typed (which means you know the type of a variable at compile time) and dynamically typed languages (like Ruby, bash scripts, etc.) need this instruction to support these type of variables.
The JVM already supports many types of non-Java languages, but this instruction makes the JVM more language independent, which is good news for people who would like to implement components in different languages and/or want to inter-operate between those languages and standard Java programs.
7. JLayerPane (doc)
Finally, since I’m a UI guy, I want to mention JLayerPane. This component is similar to the one provided in the JXLayer project. I’ve used JXLayer many times in the past in order to add effects on top of Swing components. Similarly, JLayerPane allows you to decorate a Swing component by drawing on top of it and respond to events without modifying the original component.
This example from the JLayerPane tutorial shows a component using this functionality, providing a “spotlight” effect on a panel.
You could also blur the entire window, draw animations on top of components, or create transition effects.
And that’s just a subset of the features, Java 7 is a long overdue update to the platform and language which offers a nice set of new functionality. The hope is the time from Java 7 to 8 is a lot shorter than from 6 to 7!