I noticed that after rendering a Seam mail which failed (email address not entered), redirects - using Redirect.instance() - had the string 'null' stuck on the front of them.
It turns out to be two problems:
1) UIMessage does not call MailFacesContextImpl.stop() if an exception is thrown in UIMessage.renderChildren
Fix:
@Override public void encodeChildren(FacesContext context) throws IOException { try { JSF.renderChildren(FacesContext.getCurrentInstance(), this); } catch (Exception e){ MailFacesContextImpl.stop(); throw new FacesException(e); } }