I got some hints from the Spring project source code, MessageTool source code and this 3 year old message by Mr. Bubna "Re: Using Velocity tools in an application?" and finally got this working.
I wanted to figure out how to access the MessageTool from within a Velocity context and send the contents via mail. Hopefully this will help out others having similar trouble. So to test this out I added entries to my config files: ******************************************************************** This was in my main Strut-Config.xml file: <message-resources parameter="resources.application"/> ******************************************************************** ******************************************************************** This was in a test-config.xml file <message-resources key="nonStandardResources" parameter="resources.nonStandardResources.application"/> ******************************************************************** ******************************************************************** next the template file: at mywebapp/mailTemplates/testTemplate.vm $title : $text.get("test.mail.name", ["jon","doe"]) $title with no args: $text.get("test.mail.name") $title with args and bundle: $text.get("test.mail.name", "nagisateiHotelResources", ["jon", "doe"] ) ******************************************************************** ******************************************************************** Struts Action mapping in the Struts module: <action path="/test/testSendingVelocityMail" type = "mydomain.myapp.action.TestSendingMailAction" scope="request" > <forward name ="success" path="/test/sendMail.vm" /> </action> ******************************************************************** ******************************************************************** The web page: /test/sendMail.vm <html> <head> <title>Velocity Mail Test Page</title> <meta http-equiv=Content-Type content="text/html; charset=utf-8"> </head> <body> <p> <a href="$link.setAction("/test/testSendingVelocityMail.do")" >Send a test email</a> </p> </body> </html> ******************************************************************** ******************************************************************** The Action Class /* * Created on Feb 17, 2006 * * */ import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.exception.MethodInvocationException; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.RuntimeConstants; import org.apache.velocity.tools.struts.MessageTool; import org.apache.velocity.tools.view.context.ChainedContext; import org.apache.velocity.tools.view.servlet.WebappLoader; public class TestSendingMailAction extends Action { static Logger logger = Logger.getLogger(TestSendingMailAction.class); public static final String TEST_TEMPLATE = "mailTemplates/testTemplate.vm"; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { MessageTool messageTool = new MessageTool(); ServletContext servletContex = this.getServlet().getServletContext(); // Init the VelocityEngine Instance VelocityEngine engine = new VelocityEngine(); this.initializeEngine(engine); ChainedContext chainedContext = new ChainedContext(engine, request, response, servletContex); messageTool.init(chainedContext); VelocityContext context = new VelocityContext(); context.put("title", "MessageTool test mail"); context.put("text", messageTool); String bodyText = createBodyText(engine, context); this.sendMail(bodyText); return (mapping.findForward("success")); } /** * @param engine * @param context */ private String createBodyText(VelocityEngine engine, VelocityContext context) { StringWriter sw = new StringWriter(); Template temp; try { temp = engine.getTemplate(TEST_TEMPLATE); temp.merge(context, sw); String body = sw.toString(); } catch (ResourceNotFoundException e) { logger.error("resource no Found: " + e); } catch (ParseErrorException e) { logger.error("Parse Error Exception: " + e); } catch (MethodInvocationException e) { logger.error("MethodInvocationException, applying template: " + e); } catch (Exception e) { logger.error("General Exception, applying template: " + e); } return sw.toString(); } private void sendMail(String bodyText) { String subject = "test mail"; String fromName = "Jon Doe"; String fromEmail = "[EMAIL PROTECTED]"; String toRecipient = "Mr. Recipient"; String toEmail = "[EMAIL PROTECTED]"; Properties mailProps = new Properties(); mailProps.put("mail.host", "localhost"); mailProps.put("debug", "true"); Session session = Session.getDefaultInstance(mailProps, null); MimeMessage msg = new MimeMessage(session); InternetAddress toAddress; try { toAddress = new InternetAddress(toEmail, MimeUtility.encodeText( toRecipient, "UTF-8", null)); if (fromName != null && fromEmail != null) { msg.setFrom(new InternetAddress(fromEmail, MimeUtility .encodeText(fromName, "UTF-8", null))); } msg.setRecipient(Message.RecipientType.TO, toAddress); msg.setSubject(MimeUtility.encodeText(subject, "UTF-8", null)); msg.setHeader("X-Mailer", "Mailer"); msg.setSentDate(new Date()); msg.setText(bodyText, "UTF-8"); Transport.send(msg); } catch (UnsupportedEncodingException e) { logger.error("Problem encoding mail: " + e); } catch (MessagingException e) { logger.error("Problem sending mail: " + e); } } /** * @param engine */ private void initializeEngine(VelocityEngine engine) { engine.setApplicationAttribute("javax.servlet.ServletContext", this .getServlet().getServletContext()); Properties p = new Properties(); p.setProperty(RuntimeConstants.RESOURCE_LOADER, "webapp"); p.setProperty("webapp.resource.loader.class", WebappLoader.class .getName()); p.setProperty("resource.manager.logwhenfound", "true"); p.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.SimpleLog4JLogSystem"); p.setProperty("runtime.log.logsystem.log4j.category", "VelocityMailManager"); try { engine.init(p); } catch (Exception e) { logger.error("failed to init the velocity engine: " + e); } } } Cheers, David ******************************************************************** David Sperling wrote: >Hi- > >I'm trying to send mail from a Struts Action with velocity 1.5 and >velocity-tools-1.2. > >The faq: >http://wiki.apache.org/jakarta-velocity/VelocityFAQ >Says: > > >>>You can get this instance for other uses of velocity by calling >>> >>> >getVelocityEngine > > >>>from a subclass >> >> > >Another recommendation from this list was to: > > >>>To get the VelocityEngine from getVelocityEngine(), >>> >>> > > >So my question is how do you get the VelocityEngine from the >getVelocityEngine()? > >I've spent hours on google trying to find some code that calls the >getVelocityEngine() >but the only thing I could come up with was a VelocityManager class from >opensymphony. >And the VelocityManager.java class from opensymphony is quite complex >and has >many dependencies. > > >Cheers, > > > > >--------------------------------------------------------------------- >To unsubscribe, e-mail: [EMAIL PROTECTED] >For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]