如何使用异步 API 在 Java 中发送电子邮件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5288098/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to send email in java using asynchronous API
提问by MS Ibrahim
I was trying to send email using simple method and it was very slower. and some told me to send email via Asynchronous API.
我试图使用简单的方法发送电子邮件,但速度非常慢。有些人告诉我通过异步 API 发送电子邮件。
This was my old question Email code makes the code slower in java spring MVC
这是我的老问题电子邮件代码使 java spring MVC 中的代码变慢
can anyone guide on this what is that and how will it make sending email faster
任何人都可以指导这是什么以及它将如何使发送电子邮件更快
回答by AndyMoose
Setup an Executor bean that uses a thread pool executor in your spring context and use it to enqueue a work item that will send the email. It will then be dispatched on a thread pool thread asynchronously and therefore your request thread will not block.
在 spring 上下文中设置一个使用线程池执行程序的 Executor bean,并使用它来排队将发送电子邮件的工作项。然后它将在线程池线程上异步调度,因此您的请求线程不会阻塞。
回答by MS Ibrahim
In Spring MVC we have TaskExecutorwhich makes sending asynchronous mails easy.
在 Spring MVC 中,我们有TaskExecutor,它使发送异步邮件变得容易。
<!-- Mail sender bean -->
<bean class="org.springframework.mail.javamail.JavaMailSenderImpl" id="mailSender">
<property name="host"><value>mail.test.com</value></property>
<property name="port"><value>25</value></property>
<property name="protocol"><value>smtp</value></property>
<property name="username"><value>[email protected]</value></property>
<property name="password"><value>pass</value></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<!-- <prop key="mail.smtp.starttls.enable">true</prop> -->
<prop key="mail.smtp.quitwait">false</prop>
</props>
</property>
</bean>
<bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" id="taskExecutor">
<property name="corePoolSize" value="5"></property>
<property name="maxPoolSize" value="10"></property>
<property name="queueCapacity" value="40"></property>
<property name="waitForTasksToCompleteOnShutdown" value="true"></property>
</bean>
Your java class should look like this:
您的 Java 类应如下所示:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.MailParseException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
@Service("mailService")
public class MailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private TaskExecutor taskExecutor;
private static Log log = LogFactory.getLog(MailService.class);
/**
* @param text - message
* @param from - sender email
* @param to - receiver email
* @param subject - subject
* @param filePath - file to attach, could be null if file not required
* @throws Exception
*/
public void sendMail(final String text, final String from, final String to, final String subject, final File file) throws Exception {
taskExecutor.execute( new Runnable() {
public void run() {
try {
sendMailSimple(text, to, subject, file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
log.error("Failed to send email to: " + to + " reason: "+e.getMessage());
}
}
});
}
private void sendMailSimple(String text, String from, String to, String subject, String filePath) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(text);
if(filePath != null){
FileSystemResource file = new FileSystemResource(filePath);
helper.addAttachment(file.getFilename(), file);
}
} catch (MessagingException e) {
throw new MailParseException(e);
}
mailSender.send(message);
if(log.isDebugEnabled()){
log.debug("Mail was sent successfully to: " + to + " with file: "+filePath);
}
}
}
回答by Stephen C
The Google App Engine implementation of Javamail API allows you to send mail asynchronously, but I don't know if it is feasible to embed it in a servlet. Even if it is not feasible to use GAE like this, it proves that it is possible to implement a javamail provider that does asynchronous mail sending.
Javamail API的Google App Engine实现可以让你异步发送邮件,但是不知道嵌入到servlet中是否可行。即使像这样使用GAE是不可行的,但它证明了实现一个做异步邮件发送的javamail provider是可能的。
Another alternative is to set up local mail service to act as a relay for your Java application. If configured correctly, this should allow you to get messages off your hands in milliseconds. It can also take care of issues such as remote mail servers being temporarily down. The downside is that you have another service to maintain, and your Java application don't get any notification of failure to deliver mail to the ultimate recipients.
另一种选择是设置本地邮件服务作为 Java 应用程序的中继。如果配置正确,这应该允许您在几毫秒内获得消息。它还可以处理远程邮件服务器暂时关闭等问题。缺点是您需要维护另一项服务,并且您的 Java 应用程序不会收到任何未能将邮件发送给最终收件人的通知。
回答by Arjan Tijms
If you happen to run on a Java EE 6 server (JBoss AS 6, Glassfish v3, Resin 4), you can add a simple EJB bean, mark a method with @Asynchronous and send the email from there.
如果您碰巧在 Java EE 6 服务器(JBoss AS 6、Glassfish v3、Resin 4)上运行,您可以添加一个简单的 EJB bean,使用 @Asynchronous 标记一个方法并从那里发送电子邮件。
E.g.
例如
@Singleton
public class AsyncMailer {
@Asynchronous
public void sendMail(...) {
// Send mail here
}
}
回答by Umesh K
I think you can use Google App Engineusing Java. It is asynchronous too.
我认为您可以使用Java使用Google App Engine。它也是异步的。