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);
}
}