如何使用JavaMailSenderImpl发送UTF-8编码的电子邮件正文?
我以这种方式发送电子邮件:如何使用JavaMailSenderImpl发送UTF-8编码的电子邮件正文?,java,email,encoding,utf-8,Java,Email,Encoding,Utf 8,我以这种方式发送电子邮件: @Test public void testEmailCharacterSet() throws MessagingException, UnsupportedEncodingException { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setDefaultEncoding("utf-8"); mailSender.setHost("*****"
@Test
public void testEmailCharacterSet() throws MessagingException, UnsupportedEncodingException {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding("utf-8");
mailSender.setHost("*****");
mailSender.setUsername("*****");
mailSender.setPassword("*****");
Properties properties = new Properties();
properties.setProperty("mail.mime.charset", "utf-8");
mailSender.setJavaMailProperties(properties);
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false, "utf-8");
mimeMessage.setContent("Árvíztűrő tükörfúrógép 3", "text/html");
helper.setFrom("noreply@foobar.com");
helper.setTo("foobar@gmail.com");
mailSender.send(mimeMessage);
}
正如你所看到的,我在任何地方都可以设置utf-8。我的问题是输出的原始字节仍然是拉丁文1,至少我在Wireshark中看到了这一点:
Date: Sun, 17 May 2015 18:16:21 +0200 (CEST)
From: noreply@foobar.com
To: foobar@gmail.com
Message-ID: <13648335.0.1431879381653.JavaMail.foo@foo-dell>
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
=C1rv=EDzt?r? t=FCk=F6rf=FAr=F3g=E9p 3
.
因此,很明显,它只针对JavaMailSenderImpl
。如果您添加以下行:
properties.setProperty("mail.smtp.allow8bitmime", "true");
properties.setProperty("mail.smtps.allow8bitmime", "true");
对于您的代码,邮件将具有内容传输编码:标题设置为8位,邮件将可读。这对我很有用-
mailssender.send(新的mimessagepreparator(){
public void prepare(MimeMessage MimeMessage)抛出消息异常{
mimessagehelper message=新的mimessagehelper(mimessage,true,“UTF-8”);
message.setFrom(“me@mail.com");
message.setTo(“you@mail.com");
message.setSubject(“我的主题”);
message.setText(“我的文本”,true);
message.addInline(“myLogo”,新类路径资源(“img/myLogo.gif”);
message.addAttachment(“myDocument.pdf”,新类路径资源(“doc/myDocument.pdf”);
}
});
如果在java源代码中用\u0171
替换呢?那么结果会是什么呢?在电线上也显示为“?”。我认为这是关于引用的可打印的
传输编码不太可能,引用的可打印的只关心输入中的字节。该错误显然是由于String->byte[]
转换引起的,并且在转换过程中无法识别char
。如果您执行mimeMessage.setContent(String.getBytes(“UTF-8”)
操作,抛出异常,关于byte[]不是有效输入。这对我有帮助,谢谢!我已经按照@andrzej skierski的建议将MimeMessageHelper设置为UTF-8
properties.setProperty("mail.smtp.allow8bitmime", "true");
properties.setProperty("mail.smtps.allow8bitmime", "true");
mailSender.send(new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws MessagingException {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
message.setFrom("me@mail.com");
message.setTo("you@mail.com");
message.setSubject("my subject");
message.setText("my text <img src='cid:myLogo'>", true);
message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
}
});