部署后,Java utf8电子邮件无法与IE一起使用

时间:2011-04-23 19:24:48

标签: java email jsp character-encoding

当我在本地运行应用程序时,我有一个可以正常使用IE的邮件程序类,但是在服务器上部署后它会一直发送gobbledygook和不可读的字符,我不知道问题出在哪里,一切都是utf8,这是我的代码:

    public static void sendHTMLEmail(String to, String subject, String body)
        throws EmailException {

    HtmlEmail email = new HtmlEmail();
    email.setSmtpPort(25);
    email.setAuthenticator(new DefaultAuthenticator("myMail","myPass"));
    email.setDebug(false);
    email.setHostName("smtp.gmail.com");


    email.setFrom("webmail@mysite.com","Webmail@mysite");
    email.setCharset("UTF-8");
    email.setSubject(subject);

    // --set Body-- 
    String HTMLBody ="<html xmlns='http://www.w3.org/1999/xhtml'>";
    HTMLBody += "<head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head>";
    HTMLBody += "<body><div dir='rtl'>";
    HTMLBody += body;
    HTMLBody += "</div></body></html>";
    // -----------

    email.setHtmlMsg(HTMLBody);
    email.setTextMsg("Your email client does not support HTML messages");

    email.addTo(to);
    email.setTLS(true);
    email.send();

}

这是我的图书馆:

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.commons.mail.SimpleEmail;

thnx你的时间

1 个答案:

答案 0 :(得分:2)

我假设String body方法参数实际上是用户提供的数据,该数据已在某些<input><textarea>中输入并由<form method="post">提交一个JSP页面。

将使用charset提交数据,如包含表单的页面的Content-Type标题中所指定的那样。如果Content-Type标题中没有字符集,那么浏览器只会做出最佳猜测,而MSIE通常不像其他人那样聪明,它只会抓住客户端平台的默认编码。

您需要确保完成以下三项工作:

  • 确保包含<form>的HTTP响应已与charset=UTF-8标头中的Content-Type一起发送。您可以通过在负责生成响应的JSP顶部添加以下行来实现此目的:

    <%@page pageEncoding="UTF-8" %>
    

    这不仅将响应编码设置为UTF-8,还隐式将Content-Type标头设置为text/html;charset=UTF-8

  • 确保处理表单提交的servlet使用相同的字符编码处理获取的HTTP请求中的输入数据。您可以通过在之前添加以下行来获得此请求,例如getParameter()

    request.setCharacterEncoding("UTF-8");
    

    一种更方便的方法是将该行放在某些Filter中,该行已映射到感兴趣的URL模式上,这样您就不需要在所有servlet上复制该行了。

  • 确保使用accept-charset的{​​{1}}属性。 MSIE对此有严重的错误。