2012-03-12 171 views
3

我试图使用Greenmail在本地主机上测试电子邮件功能。问题是我没有安装SMTP服务器,并且觉得安装一个过于致命。我的期望是,应该有一个免费的库,让我保持我的发送邮件代码相同,但不是真正发送电子邮件到SMTP服务器,将它发送到我的本地机器,以便我可以检索它们(为了单位测试)。在没有安装SMTP服务器的情况下测试Greenmail

我曾经在使用Grails进行开发时使用过Greenmail,并且体验非常棒。但是我找不到类似于Spring Framework的东西。在Greenmail页面上,它说有一个与JBoss捆绑在一起的模拟SMTP服务器。但我不想运行JBoss,因为目前我的web应用程序在Tomcat上运行。

Tomcat有没有类似的服务?或者有没有更好的方法将测试邮件发送到本地主机,在那里我可以检索发送的邮件?

UPDATE

我试着用拉尔夫的方法,但它仍然产生同样的异常:

[SimpleAsyncTaskExecutor-1] 2012-03-13 10:19:39,475 - ERROR: com.test.my.service.emailing.impl.EmailServiceImpl - Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect 
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect; message exception details (1) are: 
Failed message 1: 
javax.mail.MessagingException: Could not connect to SMTP host: localhost, port: 3025; 
    nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 
    at javax.mail.Service.connect(Service.java:288) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340) 
    at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:336) 
    at com.test.my.service.emailing.impl.EmailServiceImpl.test(EmailServiceImpl.java:388) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:80) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(Unknown Source) 
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:233) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189) 
    at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1359) 
    ... 19 more 

回答

8

您可以使用Greenmail任何Java程序,不管它是使用Spring或不。你不需要任何Spring特定的东西。

它运行某种进程中的邮件服务器。

import com.icegreen.greenmail.util.GreenMail; 
import com.icegreen.greenmail.util.GreenMailUtil; 
import com.icegreen.greenmail.util.ServerSetupTest; ... 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("ApplicationContext-Greenmail.xml") 
public class EmailServiceIntegrationTest { 

    /** Class under test */ 
    @Resource 
    private EmailService emailService; 

    private GreenMail greenMail; 

    @Before 
    public void startMailServer() { 
     greenMail = new GreenMail(ServerSetupTest.SMTP); 
     greenMail.start(); 
    } 

    @After 
    public void stopMailServer() { 
     greenMail.stop(); 
    } 

    @Test 
    public void testPledgeReminder() 
       throws InterruptedException, MessagingException { 

     String mailText = "Hallo World"; 
     String mailSubject = "Hallo"; 
     String mailTo = "[email protected]"; 

     /** when: sending a mail */ 
     emailService.send(mailSubject, mailTo, mailText); 

     assertTrue(greenMail.waitForIncomingEmail(5000, 1)); 
     Message[] messages = greenMail.getReceivedMessages(); 
     assertEquals(1, messages.length); 
     assertEquals(mailText, messages[0].getSubject());  
     String body = GreenMailUtil.getBody(messages[0]).replaceAll("=\r?\n", ""); 
     assertEquals(mailText, body);  
    } 

} 

重要:使用端口3025

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="javaMailProperties"> 
     <util:properties> 
      <prop key="mail.debug">false</prop> 
      <prop key="mail.transport.protocol">smtp</prop> 
      <prop key="mail.smtp.port">3025</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.user">[email protected]</prop> 
      <prop key="mail.smtp.host">localhost</prop> 
      <prop key="mail.smtp.from">[email protected]</prop> 
     </util:properties> 
    </property> 
    <property name="username" value="test"/> 
    <property name="password" value="xxx"/> 
    <property name="defaultEncoding" value="utf8" /> 
</bean> 

那么这个配置将配置一个Spring JavaMailSender其邮件发送到启动和测试代码完成了讹诈的服务器。

+0

使用端口3025?我没有听说过有关这一切的所有搜索后,但它似乎值得一试 – 2012-03-13 02:54:40

+0

请看看我的更新的问题。我无法完成这项工作 – 2012-03-13 03:24:05

+0

我的防火墙似乎有问题。我现在工作很好。感谢您的支持! – 2012-03-13 03:54:23

0

似乎有人曾提出这样的整合:http://sourceforge.net/mailarchive/forum.php?thread_name=45DEB9E3.6090608%40consol.de&forum_name=greenmail-developers

不知道它是否仍然是工作......

+0

来修改,谢谢,但你似乎误解了我需要的东西。我想使用JavaMail,但不知何故配置绿色邮件接收电子邮件。通过这种方式,我不需要来回更改代码(在测试时切换为Greenmail类,并切换回JavaMail以在生产中发送真正的电子邮件) – 2012-03-13 03:32:07

2

编辑(2017年11月):

Dumbster链接是死的,有它在github上https://github.com/kirviq/dumbster

----原始消息----叉

看一看Dumbster - 我将其用于所有单元测试,因为它允许我对发送的实际电子邮件进行断言。

http://quintanasoft.com/dumbster/

+1

我更喜欢greenmail,因为我对Grails有很好的体验。但如果事情不行,我会给Dumbster一个尝试。谢谢! – 2012-03-13 03:33:50

0

做这样的事情在spring测试对我来说工作得很好:

ServerSetupTest.setPortOffset(<SOME_CUSTOM_PORT>); 
testEmailServer = new GreenMail(); 
testEmailServer.start(); 

ServerSetupTest类背后的主要想法是创建一个用户定义的端口ServerSetup测试偏移。有关更多详细信息,请参见docs

0

尝试手动设置讹诈服务器的端口是这样的:

@Before 
public void startMailServer() 
    throws Exception 
{ 
    ServerSetup setup = new ServerSetup(3025,"localhost","smtp"); 
    greenMail = new GreenMail(setup); 
    greenMail.start(); 
} 

,然后设置你的电子邮件发件人的端口上面一样,要注意协议/主机/端口:

email.protocol=smtp 
email.host=localhost 
email.port=3025 
[email protected] 
[email protected] 
email.auth=true 
[email protected] 

与bean配置:

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="protocol" value="${email.protocol}" /> 
    <property name="host" value="${email.host}" /> 
    <property name="port" value="${email.port}" /> 
    <property name="username" value="${email.username}" /> 
    <property name="password" value="${email.password}" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.${email.protocol}.auth">${email.auth}</prop> 
     </props> 
    </property> 
</bean> 
相关问题