Sunday, July 8, 2012

Email with Attachments via Spring and SendGrid (Part 5)

Review

We have just completed our application. In the previous sections, we have discussed the functional specs, created the Java classes, declared the configuration files, and wrote the HTML form. In this section, we will build and run the application using Maven, and show how to import the project in Eclipse.


Running the Application

Access the source code

To download the source code, please visit the project's Github repository (click here)

Building with Maven

  1. Ensure Maven is installed
  2. Open a command window (Windows) or a terminal (Linux/Mac)
  3. Run the following command:
    mvn tomcat:run
  4. You should see the following output:
    [INFO] Scanning for projects...
    [INFO] Searching repository for plugin with prefix: 'tomcat'.
    [INFO] artifact org.codehaus.mojo:tomcat-maven-plugin: checking for updates from central
    [INFO] artifact org.codehaus.mojo:tomcat-maven-plugin: checking for updates from snapshots
    [INFO] ------------------------------------------
    [INFO] Building spring-emailupload-tutorial Maven Webapp
    [INFO]    task-segment: [tomcat:run]
    [INFO] ------------------------------------------
    [INFO] Preparing tomcat:run
    [INFO] [apt:process {execution: default}]
    [INFO] [resources:resources {execution: default-resources}]
    [INFO] [tomcat:run {execution: default-cli}]
    [INFO] Running war on http://localhost:8080/spring-emailupload-tutorial
    Jul 8, 2012 7:22:24 PM org.apache.catalina.startup.Embedded start
    INFO: Starting tomcat server
    Jul 8, 2012 7:22:25 PM org.apache.catalina.core.StandardEngine start
    INFO: Starting Servlet Engine: Apache Tomcat/6.0.29
    Jul 8, 2012 7:22:25 PM org.apache.catalina.core.ApplicationContext log
    INFO: Initializing Spring root WebApplicationContext
    Jul 8, 2012 7:22:27 PM org.apache.coyote.http11.Http11Protocol init
    INFO: Initializing Coyote HTTP/1.1 on http-8080
    Jul 8, 2012 7:22:27 PM org.apache.coyote.http11.Http11Protocol start
    INFO: Starting Coyote HTTP/1.1 on http-8080
    
  5. Note: If the project will not build due to missing repositories, please enable the repositories section in the pom.xml!

Access the Entry page

  1. Follow the steps with Building with Maven
  2. Open a browser
  3. Enter the following URL (8080 is the default port for Tomcat):
    http://localhost:8080/spring-emailupload-tutorial/email

Compose a message

  1. Fill-in the To fields
  2. Fill-in the Cc field
  3. Fill-in the From fields
  4. Fill-in the Subject field
  5. Fill-in the Message field


Attach a file

  1. Click on "Add a file"
  2. Browse for a file and add it. Check the logs and you should see something similar to the following:
    [DEBUG] [http-8080-4 07:29:06] (TraceInterceptor.java:writeToLog:21) Entering EmailController.upload(org.springframework.web.multipart.commons.CommonsMultipartFile@1b7a72b)
    [DEBUG] [http-8080-4 07:29:06] (EmailController.java:upload:49) Dummy1.jpg - 15009
    [DEBUG] [http-8080-4 07:29:06] (TraceInterceptor.java:writeToLog:21) Leaving EmailController.upload(): [UploadedFile [name=Dummy1.jpg, size=15009, url=null, thumbnail_url=null, delete_url=null, delete_type=null]]
    

Attach multiple files

  1. Click on "Add another file"
  2. Browse for files and add them. Check the logs and you should see something similar to the following:
    [DEBUG] [http-8080-4 07:29:43] (TraceInterceptor.java:writeToLog:21) Entering EmailController.upload(org.springframework.web.multipart.commons.CommonsMultipartFile@ba2b6b)
    [DEBUG] [http-8080-4 07:29:43] (EmailController.java:upload:49) Dummy2.jpg - 30364
    [DEBUG] [http-8080-4 07:29:43] (TraceInterceptor.java:writeToLog:21) Leaving EmailController.upload(): [UploadedFile [name=Dummy2.jpg, size=30364, url=null, thumbnail_url=null, delete_url=null, delete_type=null]]
    [DEBUG] [http-8080-2 07:29:43] (TraceInterceptor.java:writeToLog:21) Entering EmailController.upload(org.springframework.web.multipart.commons.CommonsMultipartFile@788a7b)
    [DEBUG] [http-8080-2 07:29:43] (EmailController.java:upload:49) Dummy3.jpg - 17677
    [DEBUG] [http-8080-2 07:29:43] (TraceInterceptor.java:writeToLog:21) Leaving EmailController.upload(): [UploadedFile [name=Dummy3.jpg, size=17677, url=null, thumbnail_url=null, delete_url=null, delete_type=null]]
    

Send the email

  1. Click on "Send" to send the email. Check the logs and you should see something similar to the following:
    [DEBUG] [http-8080-1 07:32:09] (TraceInterceptor.java:writeToLog:21) Entering EmailController.send(Message [senderName=, senderEmail=krams915@yahoo.com, ccEmail=, subject=Test, body=Test, receiverName=, receiverEmail=flamark_915@yahoo.com, filename=Dummy1.jpg,Dummy2.jpg,Dummy3.jpg])
    [DEBUG] [http-8080-1 07:32:09] (TraceInterceptor.java:writeToLog:21) Entering SendGridEmailService.send(Message [senderName=, senderEmail=krams915@yahoo.com, ccEmail=, subject=Test, body=Test, receiverName=, receiverEmail=flamark_915@yahoo.com, filename=Dummy1.jpg,Dummy2.jpg,Dummy3.jpg])
    [DEBUG] [http-8080-1 07:32:20] (TraceInterceptor.java:writeToLog:21) Leaving SendGridEmailService.send(): StatusResponse [success=true, message=Message sent, ]
    [DEBUG] [http-8080-1 07:32:20] (TraceInterceptor.java:writeToLog:21) Leaving EmailController.send(): StatusResponse [success=true, message=Message sent, ]
    
  2. Also check your email account for the actual email message

Note:

When adding a file via the "Add a file" link, the file is automatically uploaded to the backend. The backend responds with an object containing the filename (and other file details). When you click on the "Upload" button, the form data is sent along with the filename. The file itself is never uploaded in this second step because it's already in the server!

Import the project in Eclipse

  1. Ensure Maven is installed
  2. Open a command window (Windows) or a terminal (Linux/Mac)
  3. Run the following command:
    mvn eclipse:eclipse -Dwtpversion=2.0
  4. You should see the following output:
    [INFO] Scanning for projects...
    [INFO] Searching repository for plugin with prefix: 'eclipse'.
    [INFO] org.apache.maven.plugins: checking for updates from central
    [INFO] org.apache.maven.plugins: checking for updates from snapshots
    [INFO] org.codehaus.mojo: checking for updates from central
    [INFO] org.codehaus.mojo: checking for updates from snapshots
    [INFO] artifact org.apache.maven.plugins:maven-eclipse-plugin: checking for updates from central
    [INFO] artifact org.apache.maven.plugins:maven-eclipse-plugin: checking for updates from snapshots
    [INFO] -----------------------------------------
    [INFO] Building spring-emailupload-tutorial Maven Webapp
    [INFO]    task-segment: [eclipse:eclipse]
    [INFO] -----------------------------------------
    [INFO] Preparing eclipse:eclipse
    [INFO] No goals needed for project - skipping
    [INFO] [eclipse:eclipse {execution: default-cli}]
    [INFO] Adding support for WTP version 2.0.
    [INFO] -----------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] -----------------------------------------
    
    This command will add the following files to your project:
    .classpath
    .project
    .settings
    target
    You may have to enable "show hidden files" in your file explorer to view them
  5. Open Eclipse and import the project

Conclusion

That's it! We've have successfully completed our email application with Spring, SendGrid, and jQuery-File-Upload. We've also learned how to setup an HTML form for attaching multiple files.

I hope you've enjoyed this tutorial. Don't forget to check my other tutorials at the Tutorials section.

Revision History


Revision Date Description
1 July 8 2012 Uploaded tutorial

StumpleUpon DiggIt! Del.icio.us Blinklist Yahoo Furl Technorati Simpy Spurl Reddit Google I'm reading: Email with Attachments via Spring and SendGrid (Part 5) ~ Twitter FaceBook

Subscribe by reader Subscribe by email Share

8 comments:

  1. Krams, thanks for your tutorial. File successfully written to disk, but i receive Exception in thread "http-bio-8084-exec-5" java.lang.OutOfMemoryError: PermGen space
    when try to load file to server.

    I also try put next code to catalina.sh file, but it dont help me.

    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m
    -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m
    -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

    ReplyDelete
  2. i successfully resolve my trouble by replacing in catalina.sh file JAVA_OPTS to CATALINA_OPTS.

    But i all the same not understand why recieve java.lang.OutOfMemoryError: PermGen during file loading by size around 100 Kbytes.

    ReplyDelete
  3. If i try to load file with no english name i get the file on disk and on success window with name like Фото.

    How to solve this trouble?

    ReplyDelete
    Replies
    1. I got to solve this problem.
      Look at https://issues.springsource.org/browse/SPR-6443 .

      Delete
  4. This comment has been removed by the author.

    ReplyDelete
  5. can you tell how to save these feilds in database mysql?

    ReplyDelete
  6. I have read your blog its very attractive and impressive. I like it your blog.

    Spring online training Spring online training Spring Hibernate online training Spring Hibernate online training Java online training

    spring training in chennai spring hibernate training in chennai

    ReplyDelete