关于 Java 多线程发Email, 454 Throttling failure: Maximum sending rate exceeded.
异常信息:
com.sun.mail.smtp.SMTPSendFailedException: 454 Throttling failure: Maximum sending rate exceeded.
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)
at com.sun.mail.smtp.SMTPTransport.finishData(SMTPTransport.java:1215)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:586)
at com.amazon.ses.SendMessageRunnable.startSendEmail(SendMessageRunnable.java:122)
at com.amazon.ses.SendMessageRunnable.run(SendMessageRunnable.java:58)
at java.lang.Thread.run(Thread.java:722)
代码:
transport = session.getTransport("smtp");
transport.connect("email-smtp.us-east-1.amazonaws.com", UserInformation.emailUser, UserInformation.emailPassword);
for (SObject contact : result.getContacts()) { //可能会有1000 条或3000条.
if (contact.getField("Email") != null) {
if (!transport.isConnected()) {
transport.connect("email-smtp.us-east-1.amazonaws.com", UserInformation.emailUser, UserInformation.emailPassword);
}
Thread thread = new Thread(new SendMessageRunnable(tasks,
transport, sender, emailTemplate,
contact, attachments, documents));
flag = true;
thread.start();
listThread.add(thread);
}
}
请大家帮忙看下。。 --------------------编程问答-------------------- 你用的服务器主机可能对 SMTP 发送邮件的最高频率做了限制:
http://www.emailaddressmanager.com/tips/server-smtp-limit.html --------------------编程问答--------------------
你用的好像是 Amazon Simple Email Service?
这里教你怎么看你的 sending limits:
http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/ManagingActivity.SendingLimits.html
--------------------编程问答--------------------
+1 --------------------编程问答-------------------- 就是被限制了。 发送失败。
其他的就看自己去慢慢找了 --------------------编程问答-------------------- 多谢各位。
下面是各种附件的类型。可是我想传一个zip or rar 文件,再类型表中没有发现。不可能不能传吧?
http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/MIMETypes.html
下面是代码:
--------------------编程问答-------------------- 是不是属于这个Content Type multipart/*? 试试看能不能成功发送
// Adds Attachments to the email.
private void addAttachments(Multipart mulp) throws MessagingException, IOException {
log.info("Starting the attachments add to email.");
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
MimeBodyPart mimeBodyPart = null;
for (SObject attachment : attachments) {
mimeBodyPart = new MimeBodyPart();
mimeBodyPart.setDescription(Part.ATTACHMENT);
if(attachment.getField("Body") != null) {
if(attachment.getField("ContentType").toString().contains("text/")) {
mimeBodyPart.setContent(new String(BASE64DeCoderUtils.decode(attachment.getField("Body").toString())), attachment.getField("ContentType").toString());
} else {
mimeBodyPart.setContent(decoder.decodeBuffer(attachment.getField("Body").toString()), attachment.getField("ContentType").toString());
}
}
mimeBodyPart.setFileName(attachment.getField("Name").toString());
mulp.addBodyPart(mimeBodyPart);
}
log.info("Completed the attachments add to email.");
}
--------------------编程问答-------------------- 错了,multipart是组合使用的意思
按下面的先试试能不能行(至少RAR的content type是存在的)
ZIP的MIME类型用application/x-zip-compressed
RAR的MIME类型用application/octet-stream
--------------------编程问答--------------------
Thanks, I will check it. --------------------编程问答-------------------- Hi dracularking,
下面这些是我测试的结果。
com.sun.mail.smtp.SMTPSendFailedException: 554 Transaction failed: Illegal filename 'test rar.rar'.
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1275)
at com.sun.mail.smtp.SMTPTransport.finishData(SMTPTransport.java:1149)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:527)
at com.amazon.ses.SendMessageRunnable.startSendEmail(SendMessageRunnable.java:119)
at com.amazon.ses.SendMessageRunnable.run(SendMessageRunnable.java:56)
com.sun.mail.smtp.SMTPSendFailedException: 554 Transaction failed: Illegal content type 'application/x-zip-compressed; name="test zip.zip"; charset=GB2312'.
--------------------编程问答--------------------
为什么文件名还是test rar.rar中间带空格的呢? --------------------编程问答--------------------
我已经试过了,去掉空格还是报这个错误。。 --------------------编程问答--------------------
对这个ASES真不太了解,不支持zip/rar怎么也说不过去,要多了解ASES才行。 --------------------编程问答-------------------- 我看普通的java mail发送rar附件,是无须指定mime type的
MimeBodyPart rarAttachment = new MimeBodyPart();
FileDataSource rarFile = new FileDataSource("C:/my-file.rar"); rarAttachment.setDataHandler(new DataHandler(rarFile)); rarAttachment.setFileName(rarFile.getName());
multiPart.addBodyPart(rarAttachment);
直接将文件指定为附件就行,理论上也就应该这样,因为所有信息都已经包含在文件中了,不知道对ASES是不是也是这样。
--------------------编程问答--------------------
有道理。 就是这个文件,
1. 我先试试用本地的文件看能不能上传。
2. 我再试试把读过来的流存到本地再用你这种方法看行不行。
Thanks. --------------------编程问答--------------------
我试了试,本地读也不可以。
com.sun.mail.smtp.SMTPSendFailedException: 554 Transaction failed: Illegal filename 'Hello World.zip'.
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1275)
at com.sun.mail.smtp.SMTPTransport.finishData(SMTPTransport.java:1149)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:527)
at com.amazon.ses.SendMessageRunnable.startSendEmail(SendMessageRunnable.java:123)
at com.amazon.ses.SendMessageRunnable.run(SendMessageRunnable.java:59)
at java.lang.Thread.run(Thread.java:680)
即使file name 没有空格还是会出错。
我没有写FileName是可以发送过去的。可是接受到的附件不可能没有文件名和扩展名吗?
求解? --------------------编程问答--------------------
sorry,前两天没看到。
那意思就是比如把这个zip文件改名成比如123.txt是可以成功发送出去的?
如果是这样的话,说明它只是对文件扩展名单纯进行检查了。
--------------------编程问答--------------------
补充:Java , Java SE