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

Java Spring应用程序上的多个邮件服务器,java,spring,email,Java,Spring,Email,我正在用Spring开发一个应用程序。此应用程序有客户,每个客户都有自己的邮件服务器配置(端口、主机、用户名、密码等)。我的应用程序必须通过客户邮件服务器发送电子邮件。 我的意思是,我不能使用经典: 将有许多MailServerImpl,每个客户一个,我将有数百个。每次客户登录时,都会要求他提供此邮件服务器配置 在客户执行某些操作后,我的应用程序必须使用客户邮件服务器发送电子邮件 那么,用Spring实现这一点的最佳方法是什么? 我希望最好的解决方案不是每次必须发送电子邮件时都执行新建Mail

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

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

在客户执行某些操作后,我的应用程序必须使用客户邮件服务器发送电子邮件

那么,用Spring实现这一点的最佳方法是什么? 我希望最好的解决方案不是每次必须发送电子邮件时都执行
新建MailServerImpl()
并设置属性


非常感谢。

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

您可以使用bean,也可以不使用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();

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

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

您可以做的是在一些字典结构中建立客户与其配置之间的映射

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


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

但是,每隔几秒钟更改这些参数不是一个问题吗?我想如果应用程序必须同时通过不同的邮件服务器发送两封电子邮件,并发性可能会有问题。我不知道Apache Commons电子邮件。这可能是一个不错的选择。将您的答案与@user3360241答案混合在一起,我可以想出如何实现它。我将为每个客户创建一个
SimpleEmail
,并将其存储在地图中。我将使用FIFO中的线程发送电子邮件(使用
task:executor
)。每个线程只会更改消息、收件人和主题。拥有JavaMailSenderImpl工厂可能是胡说八道吗?我正在考虑拥有JavaMailSenderImpl的映射(customerID将是映射的关键)。我不知道内存中是否有200个JavaMailSenderImpl真的有问题。使用FIFO队列避免单例邮件服务器上的并发更改是个好主意。我必须为每个客户创建一个FIFO队列,这样我就可以从不同的客户发送10封电子邮件,但如果这10封电子邮件来自同一个客户,它们将排队并一封接一封地发送。正如对@Robert Niestroj的评论,我将为每个客户创建一封Apache简单电子邮件(这将是每个客户的单例邮件),从技术上讲,所有客户只能有一个FIFO。允许客户在单个请求中定义多个电子邮件-收件人,并将此类请求存储在FIFO中,而不是在FIFO中为每个请求定义一封邮件。Apache客户端允许在一个实例中有多个收件人。