Spring应用程序上的多个邮件服务器

时间:2015-03-23 21:25:37

标签: java spring email

我正在使用Spring开发应用程序。此应用程序有客户,每个客户都有自己的邮件服务器配置(端口,主机,用户名,密码等)。我的应用程序必须通过客户邮件服务器发送电子邮件。 我的意思是,我不能使用经典:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">

将会有许多MailServerImpls,每个客户一个,我将拥有数百个。每次客户登录时,都会要求他提供此邮件服务器配置。

根据客户的某些操作,我的应用程序必须使用客户邮件服务器发送电子邮件。

那么,使用Spring执行此操作的最佳方法是什么? 我希望最好的解决方案是不要做new MailServerImpl()并在每次发送电子邮件时设置属性......

非常感谢。

2 个答案:

答案 0 :(得分:3)

从.properties文件或数据库中读取端口,主机,用户名,密码等。这样,您将拥有一个mailSender实现,但每个客户端配置不同。

你可以使用Apache Commons Email而不是使用bean,而是每次创建一个对象并发送邮件:

Email email = new SimpleEmail();
email.setHostName("smtp.googlemail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator("username", "password"));
email.setSSLOnConnect(true);
email.setFrom("user@gmail.com");
email.setSubject("TestMail");
email.setMsg("This is a test mail ... :-)");
email.addTo("foo@bar.com");
email.send();

您将在与用户的关系中存储在数据库中的值。

答案 1 :(得分:1)

这个问题对我来说有点模糊,没有详细说明您如何代表客户及其电子邮件服务器配置。

您可以做的是在某些字典结构中在Customers及其配置之间进行映射。

接受来自客户的并发请求(带有其标识符)并将其添加到某个FIFO队列,然后让线程池接受并处理这些请求。您可以控制可以重用的工作线程数和电子邮件实现实例。

如果此实现具有类变量,则每个线程都可以与您正在使用的任何电子邮件实现的实例相关联。您可以使用在所有线程之间共享的电子邮件抽象单例,其中连接属性仅在方法的本地范围内。