You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by Apache Wiki <wi...@apache.org> on 2006/12/12 03:05:52 UTC
[Tapestry Wiki] Update of "SendingHtmlEmailWithTap" by SamGendler
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for change notification.
The following page has been changed by SamGendler:
http://wiki.apache.org/tapestry/SendingHtmlEmailWithTap
New page:
= HTML Email =
If you would like to use a Tapestry page to render an html email, you can use the following procedures, which were most recently posted to the tapestry-users mailing list by Dave Kallstrom. These are directly copied from his emails.
For Tapestry 4.0.x
{{{
BaseHTMLMessagePage sendPage = (BaseHTMLMessagePage) getHtmlPage(inner);
ByteArrayOutputStream out = new ByteArrayOutputStream();
IMarkupWriter writer = new MarkupWriterImpl("text/html", new
PrintWriter(out), new AsciiMarkupFilter());
inner.activate(sendPage);
inner.renderPage(writer);
writer.flush();
subjectAndBody[0] = sendPage.getSubject();
subjectAndBody[1] = out.toString();
inner.cleanup();
getRequestGlobals(cycle).store(cycle);
}}}
I also have the following method in my bookmarks, but I don't have an attribution. Could be the same user, but I'm not at all sure.
{{{
// page is the page with the email template
IPage prevPage = cycle.getPage();
page.setProperty("user", user);
page.setProperty("url", url);
ByteArrayOutputStream out = new ByteArrayOutputStream();
IMarkupWriter writer = page.getResponseWriter(out);
cycle.activate(page);
cycle.renderPage(writer);
writer.flush();
String body = out.toString();
cycle.activate(prevPage);
}}}
I'm not so sure about activating a different page in the cycle and then reactivating the original, though. I suspect the upper method is more correct.
However, these methods no longer worked in 4.1, s when Dave Kallstrom figured out a new methodology, he posted it to the list:
{{{
ResponseBuilder defaultBuilder =
getRequestGlobals(cycle).getResponseBuilder();
IEngine engine = cycle.getEngine();
RequestCycleFactory factory = getRequestCycleFactory(cycle);
IRequestCycle inner = factory.newRequestCycle(engine);
String[] subjectAndBody = new String[2];
BaseHTMLMessagePage sendPage =
(BaseHTMLMessagePage) getHtmlPage(inner);
ByteArrayOutputStream out = new ByteArrayOutputStream();
IMarkupWriter writer =
new MarkupWriterImpl("text/html",
new PrintWriter(out),
new AsciiMarkupFilter());
ResponseBuilder builder =
new EmailResponseBuilder(writer,
engine.getInfrastructure().getAssetFactory(),
false,
cycle);
getRequestGlobals(cycle).store(builder);
inner.activate(sendPage);
inner.renderPage(builder);
writer.flush();
subjectAndBody[0] = sendPage.getSubject();
subjectAndBody[1] = out.toString();
inner.cleanup();
}}}
He added the following comment, too.
{{{
Notice the storing of the EmailResponseBuilder in requestGlobals and then
replacing it with the original DefaultResponseBuilder.
I'm not sure if all of this was necessary but it's the only way I could get
it to work. I will investigate using hivemind to wire up the
EmailResponseBuilder and also the HtmlEmailPage. But for now this is how I
got it to work.
}}}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org