javax.mail.NoSuchProviderException:无效的协议:null

我们有套接字应用程序发出相当多的电子邮件。 所以我们决定向它发送大量的消息,这将触发电子邮件。 最终我们看到电子邮件需要几个小时才能到达任何收件箱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(); } } } 

那么基于此链接如何有效地使用javax.mail API发送批量邮件? 我们可以使用重用经过身份validation的会话来提高速度吗? 我们试着改变它如下。 但最终会遇到邮件exception。 我们尝试只构建一个会话并继续重用,以避免邮件传递延迟。 我们在顶部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) 

您至少犯了两个常见的JavaMail错误 。 修复它们,看看是否有帮助。 如果没有,请使用新代码和您获得的exception的详细信息(包括堆栈跟踪)更新您的post。