Как отправить электронную почту в Java с использованием асинхронного API - PullRequest
3 голосов
/ 13 марта 2011

Я пытался отправить электронное письмо простым способом, и это было очень медленно.а некоторые говорили мне отправлять электронную почту через асинхронный API.

Это был мой старый вопрос Код электронной почты замедляет код в java spring MVC

Может кто-нибудь по этому поводу чтои как это ускорит отправку электронной почты

Ответы [ 5 ]

5 голосов
/ 13 марта 2011

Установите компонент Executor, который использует исполнителя пула потоков в контексте Spring, и используйте его для постановки в очередь рабочего элемента, который будет отправлять электронное письмо.Затем он будет асинхронно отправлен в поток пула потоков, и, следовательно, ваш поток запросов не будет блокироваться.

4 голосов
/ 16 ноября 2015

В 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>no-reply@test.com</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>

Ваш класс 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);
  }
  }
}
2 голосов
/ 13 марта 2011

Реализация Java App API в Google App Engine позволяет отправлять почту асинхронно, но я не знаю, возможно ли встраивать ее в сервлет. Даже если невозможно использовать GAE подобным образом, это доказывает, что возможно реализовать провайдера javamail, который выполняет асинхронную отправку почты.

Другой альтернативой является настройка локальной почтовой службы, которая будет действовать как ретранслятор для вашего Java-приложения. Если настроено правильно, это должно позволить вам получать сообщения из ваших рук в миллисекундах. Он также может позаботиться о таких проблемах, как временное отключение удаленных почтовых серверов. Недостатком является то, что у вас есть другой сервис для обслуживания, и ваше Java-приложение не получает никаких уведомлений о невозможности доставки почты конечным получателям.

0 голосов
/ 13 марта 2011

Если вы работаете на сервере Java EE 6 (JBoss AS 6, Glassfish v3, Resin 4), вы можете добавить простой EJB-компонент, пометить метод @Asynchronous и отправить оттуда электронное письмо.

* 1003 Е.Г. *

@Singleton
public class AsyncMailer {

   @Asynchronous
   public void sendMail(...) {

      // Send mail here
   }   

}
0 голосов
/ 13 марта 2011

Я думаю, вы можете использовать Google App Engine , используя Java.Это тоже асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...