Не удается отправить электронное письмо

#java #smtp

Вопрос:

Когда я перезагружаю сервер, запускаются электронные письма Java, и через несколько дней мое приложение не может отправлять электронные письма.

Ошибки : Отказано в подключении и не удалось подключиться к локальному хосту smtp:465

Я перепробовал все возможные решения, но не смог решить проблему.

 package com.er.mail;  import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties;  import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart;  import com.er.exceptions.SystemException; import com.er.utils.Constants; import com.er.utils.HelperFunctions; import com.er.utils.LogHelper;  public class MailHandler implements Runnable {  private static MailHandler instance = new MailHandler();  private Listlt;Objectgt; mails = null;  private static final long INTERVAL = 60000;  private Properties mailProps = null;  private MailHandler() {  super();  this.mails = new ArrayListlt;Objectgt;(1);  this.mailProps = System.getProperties();  this.mailProps.put(Constants.MAIL_PROP, Constants.MAIL_HOST);  this.mailProps.put("mail.smtp.socketFactory.port", "465");  this.mailProps.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");  this.mailProps.put("mail.smtp.auth", "true");  this.mailProps.put("mail.smtp.port", "465");  this.mailProps.put("mail.smtp.starttls.enable","true");    Thread mailThread = new Thread(this);  mailThread.start();  } //end constructor   public static MailHandler getInstance() {  return instance;  } //end getInstance  public void addMail(MailDetail _mailDetail) {  synchronized (this.mails) {  this.mails.add(_mailDetail);  }  } //end addMail   public void run() {  while (true) {  //create a new list out of the mails list, and empty out mails list  //this is needed to prevent concurrent access modification exceptions.  Listlt;Objectgt; tempList = null;  synchronized (this.mails) {  tempList = new ArrayListlt;Objectgt;(this.mails);  this.mails.clear();  }   //move to the top of the iterator  Iteratorlt;Objectgt; iter = tempList.iterator();  //check the e-mail list, and send mails if present  while (iter.hasNext()) {  boolean mailError = false;  MailDetail mailDetail = (MailDetail) iter.next();  try {  this.sendMail(mailDetail);  }  catch (SystemException se) {  LogHelper.getInstance().errorMessage(this, null, "Error sending e-mail", se);  mailError = true;  }   //if there is no mail error, delete this MailDetail object, so it is not sent again  if (!mailError) {  iter.remove();  }  } //end while   //if there are any elements in tempList, add it back to mails list to be taken care of in the next iteration  if (!tempList.isEmpty()) {  for (int i = 0, size = tempList.size(); i lt; size; i  )  this.addMail((MailDetail) tempList.get(i));  }   try {  Thread.sleep(INTERVAL); //sleep for interval time  }  catch (InterruptedException ie) {  //ignore  }  } //end while  } //end run    private Address getEmailAddress(final String _emailAddr, boolean _from) {  Address address = null;  try {  address = new InternetAddress(_emailAddr);  }  catch (AddressException ae) {  LogHelper.getInstance().errorMessage(this, null, "Error trying to obtain mailing address: "   _emailAddr);   //if this method is called for a "from" address, send the default address  if (_from) {  try {  address = new InternetAddress(Constants.MAIL_DEFAULT_ADDR);  }  catch (AddressException aex) {  //ignore -- should not happen  }  }  }   return address;  } //end getEmailAddress   private void sendMail(MailDetail _mailDetail) throws SystemException {  if ((_mailDetail.getToAddresses() == null) || _mailDetail.getToAddresses().isEmpty())  throw new SystemException("Trying to send mail to an empty address list");    if (HelperFunctions.isEmpty(_mailDetail.getFromAddress(), true)) {  LogHelper.getInstance().warningMessage(this, null, "Trying to send mail with an empty 'to' address");  _mailDetail.setFromAddress(Constants.MAIL_DEFAULT_ADDR);  }    Session session = Session.getInstance(this.mailProps, new SMTPAuthenticator());   MimeMessage message = new MimeMessage(session);   Address fromAddr = this.getEmailAddress(_mailDetail.getFromAddress(), true);  //fromAddr should never be null, as it will contain at least the default address  try {  message.setFrom(fromAddr);  }  catch (MessagingException me) {  throw new SystemException("Invalid 'from' Address: "   _mailDetail.getFromAddress(), me, false);  }   //set the 'to' addresses  for (int i = 0, size = _mailDetail.getToAddresses().size(); i lt; size; i  ) {  Address toAddr = this.getEmailAddress((String) _mailDetail.getToAddresses().get(i), false);  if (toAddr != null)  try {  message.addRecipient(Message.RecipientType.TO, toAddr);  }  catch (MessagingException me) {  throw new SystemException("Invalid 'to' address: "   _mailDetail.getToAddresses().get(i), me, false);  }  } //end for   //set the 'cc' addresses, if present  if (_mailDetail.getCcAddresses() != null)  for (int i = 0, size = _mailDetail.getCcAddresses().size(); i lt; size; i  ) {  Address ccAddr = this.getEmailAddress((String) _mailDetail.getCcAddresses().get(i), false);  if (ccAddr != null)  try {  message.addRecipient(Message.RecipientType.CC, ccAddr);  }  catch (MessagingException me) {  throw new SystemException("Invalid 'cc' address: "   _mailDetail.getCcAddresses().get(i), me, false);  }  } //end for   //set the 'bcc' addresses  if (_mailDetail.getBccAddresses() != null)  for (int i = 0, size = _mailDetail.getBccAddresses().size(); i lt; size; i  ) {  Address bccAddr = this.getEmailAddress((String) _mailDetail.getBccAddresses().get(i), false);  if (bccAddr != null)  try {  message.addRecipient(Message.RecipientType.BCC, bccAddr);  }  catch (MessagingException me) {  throw new SystemException("Invalid 'bcc' address: "   _mailDetail.getBccAddresses().get(i), me, false);  }  } //end for   //set the subject  try {  if (_mailDetail.getSubject() != null)  message.setSubject(_mailDetail.getSubject());  }  catch (MessagingException me) {  throw new SystemException("Error setting subject: "   _mailDetail.getSubject(), me, false);  }    try {  Multipart mp = new MimeMultipart();   //add text  MimeBodyPart textPart = new MimeBodyPart();  if (_mailDetail.getText() != null)  textPart.setContent(_mailDetail.getText(), _mailDetail.getMailType());  else  textPart.setContent("", MailDetail.TEXT_MAIL);  mp.addBodyPart(textPart);   //add attachments  if (_mailDetail.getAttachments() != null amp;amp; !_mailDetail.getAttachments().isEmpty())  for (int i = 0, size = _mailDetail.getAttachments().size(); i lt; size; i  ) {  MimeBodyPart attachFilePart = new MimeBodyPart();  FileDataSource fds = new FileDataSource((String) _mailDetail.getAttachments().get(i));  attachFilePart.setDataHandler(new DataHandler(fds));  attachFilePart.setFileName(fds.getName());  mp.addBodyPart(attachFilePart);  }   message.setContent(mp);  }  catch (MessagingException me) {  throw new SystemException("Error setting text: "   _mailDetail.getText(), me, false);  }   //send message  try {  Transport.send(message);  }  catch (MessagingException me) {  throw new SystemException("Error sending e-mail message.", me, false);  }  } //end sendMail   private class SMTPAuthenticator extends javax.mail.Authenticator  {  public PasswordAuthentication getPasswordAuthentication()  {  return new PasswordAuthentication("abc", "abc123");  }  }  }  

Комментарии:

1. этого не должно быть localhost . Ты можешь попробовать smtp.google,com ?

2. this.mailProps.put(Константы. MAIL_PROP, Константы. MAIL_HOST); Я поставил константы. ПОЧТОВЫЙ АДРЕС как smtp.gmail.com