【问题标题】:javax.mail.NoSuchProviderException: Invalid protocol :nulljavax.mail.NoSuchProviderException:无效协议:null
【发布时间】:2013-07-09 13:41:34
【问题描述】:

我们有发送大量电子邮件的套接字应用程序。所以我们决定向其中发送大量消息,这将触发电子邮件。最终,我们看到电子邮件需要几个小时才能到达任何收件箱,无论是 gmail、hotmail 还是 yahoo 等。我们一开始就有这个代码。

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("@EmL@");
                    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 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("@EmL@");
                        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)  

【问题讨论】:

  • prop.put("mail.smtp.gmail", 主机); prop.put("mail.smtp.starttls.enable", "true"); prop.put("mail.smtp.host", 主机); prop.put("mail.smtp.user", from); prop.put("mail.smtp.password", pass); prop.put("mail.smtp.port", "587"); prop.put("mail.smtp.auth", "true");
  • @sureshmandabut 我没有得到 gmail 设置是因为我们有自己的电子邮件服务器。谢谢。

标签: java jakarta-mail


【解决方案1】:

您至少制作了其中两个common JavaMail mistakes。修复它们,看看是否有帮助。如果没有,请使用新代码和您遇到的异常的详细信息(包括堆栈跟踪)更新您的帖子。

【讨论】:

  • 我已经添加了堆栈跟踪并完成了更改 1) session = Session.getInstance(props,new javax.mail.Authenticator() 2) Transport t = session.getTransport(); t.connect(); t.sendMessage(emailMessage, emailMessage.getAllRecipients());但是同样的错误没有区别我还应该改变什么?
  • 通常,JavaMail 通过读取 JavaMail jar 文件中的配置文件来确定默认传输使用的协议。如果您已从 JavaMail jar 文件中提取类文件并将它们包含在您的应用程序 jar 文件中,则会导致此问题。或者,如果您在类加载器无法正常工作的环境中运行,则会导致此问题。尝试使用 session.getTransport("smtp")。
  • 定义“慢”。你测量了什么?你看到this FAQ entry了吗? (最好为您的新问题发布一个新主题。)
  • 每秒 30 到 50 条消息?每分钟?每小时? SMTP 服务器限制您并限制您可以发送的邮件数量的情况并不少见。检查您的服务器配置或咨询您的服务器供应商。如果您正在运行自己的服务器,则应该能够关闭任何限制。如果您与其他人签订了该服务的合同,您可能需要为更高级别的服务付费。
  • JavaMail 没有限制。将连接调用放在哪里都无关紧要。您是否将连接用于一条消息或多条消息确实。如果您有很多消息要发送,则使用一个连接发送它们会更有效。如果服务器开始限制您,它可能有助于断开连接并创建一个新连接,具体取决于服务器的智能程度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多