使用JavaMail发送包含Unicode字符的电子邮件

6

我使用以下代码成功地通过GMail的SMTP服务器发送电子邮件:

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.ssl", "true");                 
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.timeout", "5000");             
        props.put("mail.smtp.connectiontimeout", "5000"); 

        // Do NOT use Session.getDefaultInstance but Session.getInstance
        // See: http://forums.sun.com/thread.jspa?threadID=5301696
        final Session session = Session.getInstance( props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication( USER, PWD );
                    }
                });

        try {
            final Message message = new MimeMessage(session);
            message.setFrom( new InternetAddress( USER ) );
            message.setRecipients( Message.RecipientType.TO, InternetAddress.parse( TO ) );
            message.setSubject( emailSubject );
            message.setText( emailContent );
            Transport.send(message);
            emailSent = true;
        } catch ( final MessagingException e ) {
            e.printStackTrace();
        }

其中emailContent是包含Unicode字符(如欧元符号)的String

当邮件到达(另一个GMail帐户时),欧元符号已被转换为ASCII“?”问号。

我对电子邮件不太了解:电子邮件可以使用任何字符编码吗?

我应该修改上面的代码以使用允许Unicode字符的编码?

2个回答

14

回答我自己的问题:您需要使用Message类中的setHeader方法,就像这样(已尝试并且可以工作):

message.setHeader("Content-Type", "text/plain; charset=UTF-8");

除非有充分的理由,否则不应直接设置标头。在我看来,更好的解决方案是将charset参数添加到setText(text)方法中,就像这样:setText(text,“UTF-8”)。 UTF-8是一个很好的通用选择。 - David Balažic

4
你需要使用MIME头来指定内容类型,以告诉它你想要发送UTF-8格式的电子邮件。请使用MimeMessage并调用带有两个参数的setText方法,传递字符集。

我需要在哪里/如何做这个? - NoozNooz42
1
不要调用message.setText(emailContent),而是要调用message.setText(emailContent, "utf-8")。这是更正确的做法。 - dkarp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接