使用Wiser测试邮件发送

最近在做一个小项目,里面有发送邮件这一功能,本文主要是讲如何通过Spring发送邮件,已经一个邮件测试框架 — wiser的介绍。

如何使用Spring发送邮件 首先主要用到的一个类是JavaMailSenderImpl,它位于Spring的org.springframework.mail. javamail包中,主要是用来发送邮件的。为了发送邮件,需要提供给它一系列的参数。这些参数我都配置在了resources包下的一个xml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="javaMailSenderImpl" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com"/>
        <property name="port" value="587"/>
        <property name="username" value="twufeedmycat@gmail.com"/>
        <property name="password" value="@twu292012"/>

        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
            </props>
        </property>
</bean>

host: 邮件发送服务器的地址 port: 与服务器通信的端口 username & password: 一个gmail账户即可 mail.smtp.auth: 提供给邮件服务器,校验发送方的授权,也许是为了组织没有授权的发送方肆意发送垃圾邮件 mail.smtp.starttls.enable: 将一般连接升级到加密连接,而无需另开一个端口进行加密传输。这里要设为true才能使用gmail的邮件服务器

上面的步骤只是建立了连接,下面聊聊发送的内容。 建立邮件内容,需要用到SimpleMailMessage这个类,它在org.springframework.mail这个包中。下面的代码展示了如何用它创建邮件内容:

1
2
3
4
5
6
SimpleMailMessage mailMessage = new SimpleMailMessage();

    mailMessage.setTo(emailAddress);
    mailMessage.setFrom(fromAddress);
    mailMessage.setSubject(subject);
    mailMessage.setText(content);

内容建立好后,就应该发送了,直接调用JavaMailSenderImpl的send方法就OK。

1
mailSender.send(mailMessage);

这样就完成了邮件的发送过程,下面来聊聊如何测试。我用到了Wiser框架,道理很简单。既然开始我是之间向google的邮件服务器通信,并让它发送邮件,那么现在测试我就应该发到Wiser上去。在测试用的resources文件夹下,我有一个与上面提到的同名的xml文件,但是配置的JavaMailSenderImpl中的配置肯定是不同的,这次是配置的Wiser,需要注意的是Wiser并不是一个邮件服务器,在我看来,它是一个监听一个端口的程序,每一条经过这个端口发送出的信息,都会被它捕获到,然后存在一个队列中,这样我们就能从这个队列中取出消息进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="javaMailSenderImple" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="localhost"/>
        <property name="port" value="25000"/>
        <property name="username" value="username"/>
        <property name="password" value="password"/>

        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
            </props>
        </property>
</bean>

同时,下面的代码被我用于junit测试中:

1
2
3
4
5
6
7
8
9
10
11
12
13
private Wiser wiser;

    @Before
    public void setUp() {
        wiser = new Wiser();
        wiser.setPort(25000);
        wiser.start();
    }

    @After
    public void tearDown() {
        wiser.stop();
}

setPort: 设置被监听的端口,与xml中给JavaMailSenderImpl配置的一样。 最后,启动单元测试,读取发送的邮件进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
mailSender.sendEmailToCustomerAfterRegistration(customerNickname, customerEmail);

    WiserMessage wiserMessage = wiser.getMessages().get(0);
    String expectedReceiver = "adam@test.com";
    String expectedSender = "admin@thebank.com";
    String expectedSubject = "Welcome!";
    String expectedContent = "Dear adam, welcome to the bank";

    assertThat(wiserMessage.getEnvelopeReceiver(), is(expectedReceiver));
    assertThat(wiserMessage.getEnvelopeSender(), is(expectedSender));
    assertThat(wiserMessage.getMimeMessage().getContent().toString().trim(), is(expectedContent));
    assertThat(wiserMessage.getMimeMessage().getSubject().trim(), is(expectedSubject));

这就是我在项目中使用到的发送邮件和其测试的技术。