用 Spring 发送邮件的注意事项

使用Spring 的封装的MailSender,确实省事多了! 但在使用中,还是得注意些问题,记录如下:

  1. 增加验证,否则会报:553 authentication is required 的错误信息

    1
    2
    3
    Properties prop = new Properties(); 
    prop.setProperty("mail.smtp.auth", "true");
    JavaMailSenderImpl.setJavaMailProperties(prop);

    注意 :此处 prop.setProperty("mail.smtp.auth", "true"); 中 true 必须用双引号引用起来,不然会报错,具体原因参考 Properties 文档。

  2. 当邮件内容是HTML语言时的中文问题

    初始化MimeMessageHelper辅助类时,设置”GBK” encoding!

    1
    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产生作用,但还是会出问题,解决方法:

    1
    MimeUtility.encodeWord(file.getName());

以下是一段完整的邮件发送测试代码,暂无附件设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/**
* MailTest.java
* Created on 2008-1-23 下午04:56:38
* Description: Test for mail sending
*/
package cn.edu.ccnu.inc.test;

import java.util.Properties;

import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import junit.framework.TestCase;

/**
* @author <a href="mailto:huangfengjing@163.com">Iven</a>
*/
public class MailTest extends TestCase {

private static MailSender sender = null;
private static SimpleMailMessage message = null;

public void setUp() {
sender = new JavaMailSenderImpl();
((JavaMailSenderImpl)sender).setHost("smtp.163.com");
((JavaMailSenderImpl)sender).setUsername("username");
((JavaMailSenderImpl)sender).setPassword("password");
Properties config = new Properties();
config.put("mail.smtp.auth", "true");
((JavaMailSenderImpl)sender).setJavaMailProperties(config);
message = new SimpleMailMessage();
}

public void testSend() {
message.setTo("huangfengjing@yahoo.com.cn");
message.setSubject("Test my owen sending program");
message.setFrom("huangfengjing@gmail.com");
message.setText("Test......");

this.assertNotNull(sender);

sender.send(message);
}
}

最后

注意:在用户名和密码都没有问题的情况下,如果代码抛出javax.mail.AuthenticationFailedException异常,先用OutLook测试一下看能否进行正常的收发邮件,有时信箱如果是新注册的话,邮件的服务商默认刚注册的帐号是不能使用pop3的。例如163.com在我进行代码测试时,刚刚注册的帐号是没有权限使用该功能的,所以就会抛出上述的异常。