我们有套接字应用程序,可以发送大量电子邮件。因此,我们决定向其中发送大量消息,这将触发电子邮件。最终,我们看到电子邮件要经过几个小时才能到达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)
参考方案
您至少已经制作了两个common JavaMail mistakes。修复它们,看看是否有帮助。如果不是,请使用新代码和要获取的异常的详细信息(包括堆栈跟踪)更新您的帖子。
如何使用与PHP mail()中相同的机制在Java中发送邮件 - java我无法从应用程序发送邮件。我不能在应用程序上使用简单的SMTP服务器。而且不知道如何处理JAVA中的邮件发送。我应该使用与PHP的mail()使用相同/相似的机制。不幸的是我不知道该怎么做。 java大神给出的解决方案 您需要检出JavaMail API,并且按照PHP的mail()的要求,它将需要SMTP服务器来发送该电子邮件。如果您需要SMTP服务器,建…
java:继承 - java有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…
怎么把JPEG图像转换成TIFF图像? - java我正在开发一个用于图像处理的应用程序,因为我需要将JPEG文件转换为TIFF文件。我已经尝试了下面的代码片段进行转换。但是,它正在生成损坏的tiff文件。这是代码:package javaapplication2; import java.awt.Color; import java.awt.image.BufferedImage; import java.…
Java:BigInteger,如何通过OutputStream编写它 - java我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…
Java-如何将此字符串转换为日期? - java我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…