五、发送带附件的邮件
发送带附件的邮件和发送内嵌的邮件相似,都是multipart类型的邮件。在src下存放两个文件:"2.jpg"和"文档.doc"。注意当附件名为中文时,会出现乱码,此时需用MimeUtility.encodeWord()方法对文件名进行编码:
public void sendAttachmentEmail(JavaMailSender sender) throws MessagingException{
MimeMessage msg=sender.createMimeMessage();
//创建MimeMessageHelper实例,第2个参数表示是否为multipart邮件,第3个参数表示MimeMessage的编码
MimeMessageHelper helper=new MimeMessageHelper(msg,true,"utf8");//true表示为multipart邮件
helper.setFrom("dongkk@sina.com");
helper.setTo("dongkk@sina.com");
helper.setSubject("注册成功-带附件");
helper.setText("欢迎访问www.sina.com.cn");
try {
ClassPathResource file1=new ClassPathResource("2.jpg");
helper.addAttachment("2.jpg",file1.getFile());
ClassPathResource file2=new ClassPathResource("文档.doc");
helper.addAttachment(MimeUtility.encodeWord(file2.getFilename()),file2.getFile());
//当附件的文件名带有中文时,会出现乱码。所以需对文件名进行编码转换,可使用
//javax.mail.internet.MimeUtility.encodeWord(String filename)
//如果主题出现乱码,可以使用该函数,也可以使用下面的函数
//helper.setSubject(MimeUtility.encodeText(String text,String charset,String encoding))
//第2个参数表示字符集,第三个为目标编码格式。
//MimeUtility.encodeWord(String word,String charset,String encoding)
} catch (IOException e) {
e.printStackTrace();
}
sender.send(msg);
System.out.println("成功发送带附件邮件!");
}
此时,附件能正常显示中文名。关于Spring中发送邮件的乱码问题可参考http://blog.csdn.net/matrixjava/archive/2008/11/06/3237772.aspx。其介绍了3种常遇到的问题:
1.增加验证,否则会报:553 authentication is required 的错误信息
Properties prop = new Properties();
prop.setProperty("mail.smtp.auth", "true");
JavaMailSenderImpl.setJavaMailProperties(prop);
2.当邮件内容是HTML语言时的中文问题:
初始化MimeMessageHelper辅助类时,设置"GBK" encoding!如:
MimeMessageHelper messageHelp = new MimeMessageHelper(message,true,"GBK");
同时在设置:<META http-equiv=Content-Type content='text/html; charset=GBK'>
如果都设置为"UTF-8",在某些邮件客户端标题不能正常显示!
3.邮件附件的中文问题!
spring的文档里面说MimeMessageHelper设置了encoding,同时对title,text,attach产生作用,但还是会出问题:解决方法:MimeUtility.encodeWord(file.getName());就OK了!