2013-07-11 2 views
2

У нас есть приложение сокета, которое отправляет довольно много сообщений электронной почты. Поэтому мы решили отправить в него огромное количество сообщений, которые будут вызывать электронные письма. В конце концов мы видим, что электронное письмо занимает несколько часов, прежде чем оно достигнет любого из входящих почтовых ящиков: gmail, hotmail или yahoo и т. Д. У нас есть эти коды в начале.javax.mail.NoSuchProviderException: Неверный протокол: null

public class commuSe { 
    BoneCP connectionPool = null; 
    class ConnectionHandler implements Runnable { 

    private Socket receivedSocketConn1; 
    ConnectionHandler(Socket receivedSocketConn1) { 
     this.receivedSocketConn1=receivedSocketConn1; 
    } 
    public void run() { 
    ..... 
    } 
    void sendClientEmail(String emailMessageString) 
    { 
     try 
     { 
      Properties props = new Properties();  
      props.put("mail.smtp.host", "**********");   
      props.put("mail.smtp.socketFactory.port", "******");  
      //props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");   
      props.put("mail.smtp.auth", "true");  
      props.put("mail.smtp.port", "*****");   
      Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() 
      {    
      protected PasswordAuthentication getPasswordAuthentication() 
      {     
      return new PasswordAuthentication("*********","*******");    
      }  
      }); 
      int count=0; 
      System.out.println("\n\nClient Email queue took ready :"+emailMessageString); 
       try 
       { 
        String[] eMArray = null; 
        eMArray = emailMessageString.split("@[email protected]"); 
        Message emailMessage = new MimeMessage(session);    
        emailMessage.setFrom(new InternetAddress("****************")); 
        if(eMArray.length>1) 
        { 
        for(int iEmail=1; iEmail<eMArray.length ; iEmail++) 
        { 
         String cc1 = eMArray[iEmail]; 
         emailMessage.addRecipient(Message.RecipientType.TO,new InternetAddress(cc1)); 
        }       
        emailMessage.setRecipients(Message.RecipientType.BCC,InternetAddress.parse("**************")); 
        } 
        else 
        { 
        emailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse("*************")); 
        } 
        emailMessage.setSubject("Alerts"); 
        emailMessage.setText(eMArray[0]); 
        Transport.send(emailMessage); 
       } 
       catch (Exception e) 
       { 
       System.out.println("Transport Problem"); 
       e.printStackTrace(); 
       } 
     } 
     catch (Exception e) 
     { 
     System.out.println("Main email try got problem"); 
     e.printStackTrace(); 
     }  
    } 
} 

Так на основе этой ссылки How to Send bulk mails using javax.mail API efficiently? & Can we use reuse authenticated sessions to improve speed? мы пытались изменить его следующим образом. Но в конечном итоге с исключением почты. Мы попытались построить только один сеанс и продолжать повторное использование, чтобы избежать задержки доставки почты. Мы объявляем это в начале сессии session = null; сохранить сеанс?

public class commuSe { 
     BoneCP connectionPool = null; 
     Session session = null; 
     class ConnectionHandler implements Runnable { 

     private Socket receivedSocketConn1; 
     ConnectionHandler(Socket receivedSocketConn1) { 
      this.receivedSocketConn1=receivedSocketConn1; 
     } 
     public void run() { 
     ..... 
     } 
     void sendClientEmail(String emailMessageString) 
     { 
      try 
      { 
           int count=0; 
       System.out.println("\n\nClient Email queue took ready :"+emailMessageString); 
        try 
        { 
         String[] eMArray = null; 
         eMArray = emailMessageString.split("@[email protected]"); 
         Message emailMessage = new MimeMessage(session);    
         emailMessage.setFrom(new InternetAddress("****************")); 
         if(eMArray.length>1) 
         { 
         for(int iEmail=1; iEmail<eMArray.length ; iEmail++) 
         { 
          String cc1 = eMArray[iEmail]; 
          emailMessage.addRecipient(Message.RecipientType.TO,new InternetAddress(cc1)); 
         }       
         emailMessage.setRecipients(Message.RecipientType.BCC,InternetAddress.parse("**************")); 
         } 
         else 
         { 
         emailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse("*************")); 
         } 
         emailMessage.setSubject("Alerts"); 
         emailMessage.setText(eMArray[0]); 
         Transport t = session.getTransport(); 
         t.connect(); 
         t.sendMessage(emailMessage, emailMessage.getAllRecipients());      } 
        catch (Exception e) 
        { 
        System.out.println("Transport Problem"); 
        e.printStackTrace(); 
        } 
      } 
      catch (Exception e) 
      { 
      System.out.println("Main email try got problem"); 
      e.printStackTrace(); 
      }  
     } 
    } 
    public static void main(String[] args) { 
    new commuSe(); 
    } 
    commuSe() { 
    Properties props = new Properties();  
       props.put("mail.smtp.host", "**********");   
       props.put("mail.smtp.socketFactory.port", "******");  
       //props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");   
       props.put("mail.smtp.auth", "true");  
       props.put("mail.smtp.port", "*****");   
       session = Session.getInstance(props,new javax.mail.Authenticator() 
       {    
       protected PasswordAuthentication getPasswordAuthentication() 
       {     
       return new PasswordAuthentication("*********","*******");    
       }  
       }); 

    } 

След стека как показано ниже.

javax.mail.NoSuchProviderException: Invalid protocol: null 
at javax.mail.Session.getProvider(Session.java:440) 
at javax.mail.Session.getTransport(Session.java:659) 
at javax.mail.Session.getTransport(Session.java:640) 
at javax.mail.Session.getTransport(Session.java:626) 
at commuSe $ConnectionHandler.sendEmail(commuSe .java:26028) 
at commuSe $ConnectionHandler.run(commuSe .java:4734) 
at java.lang.Thread.run(Thread.java:722) 
+0

prop.put ("mail.smtp.gmail", хост); \t \t \t prop.put ("mail.smtp.starttls.enable", "true"); \t \t \t prop.put ("mail.smtp.host", host); \t \t \t prop.put ("mail.smtp.user", from); \t \t \t prop.put ("mail.smtp.password", pass); \t \t \t prop.put ("mail.smtp.port", "587"); \t \t \t prop.put ("mail.smtp.auth", "true"); –

+0

@sureshmandabut Я не получаю настройки gmail, потому что у нас есть собственный почтовый сервер. Спасибо. – new14

ответ

6

Вы сделали как минимум два из этих common JavaMail mistakes. Исправьте их и посмотрите, поможет ли это. Если это не так, обновите сообщение с новым кодом и сведениями об исключении, которое вы получаете, включая трассировку стека.

+0

Я добавил трассировку стека и сделал изменение 1) session = Session.getInstance (реквизит, новый javax.mail.Authenticator() 2) Транспорт t = session.getTransport(); t.connect(); t.sendMessage (emailMessage, emailMessage.getAllRecipients()); но все же одна и та же ошибка не отличается, что еще я должен изменить? – new14

+1

Обычно JavaMail определяет, какой протокол использовать для транспорта по умолчанию, считывая файлы конфигурации в файле jar JavaMail. Если вы извлекли файлы классов из jar-файла JavaMail и включили их в файл jar приложения, это вызовет эту проблему. Или, если вы работаете в среде, где загрузчик классов работает неправильно, это вызовет эту проблему. Попробуйте использовать session.getTransport («smtp»). –

+0

Я изменил дальнейшие коды, где на самом верху я установил это сейчас Session mailSession = null; статический транспортный транспорт; String emailUsername = "********"; String emailPassword = "******"; и в стороне функция, которую я вызываю сейчас \t transport = mailSession.getTransport («smtp»); transport.connect (emailUsername, emailPassword); transport.sendMessage (emailMessage, emailMessage.getAllRecipients()); , Теперь смену smtp работает. Я никогда не извлекал файл класса из JavaMail. Я просто поместил файл .jar в папку /usr/java/jdk1.7.0_03/jre/lib/ext. – new14

Смежные вопросы