我们有套接字应用程序发出相当多的电子邮件.所以我们决定向它发送大量的消息,这将触发电子邮件.最终我们看到电子邮件需要几个小时才能到达任何收件箱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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么基于此链接如何有效地使用javax.mail API发送批量邮件?我们可以使用重用经过身份验证的会话来提高速度吗?我们试着改变它如下.但最终得到了邮件异常.我们尝试只构建一个会话并继续重用,以避免邮件传递延迟.我们在顶部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("*********","*******");
}
});
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪如下.
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)
Run Code Online (Sandbox Code Playgroud)