2010-05-07 5 views
0

У нас есть программа потоков, которая отправляет массовую почту. Информация какАутентификация Исключенное исключение - В середине кода отправки массовой почты

1. To 
2. Subject 
Etc. 

извлекаются из базы данных, почта сочинял и толкнул на сервер SMTP. Один из наших клиентов отправил массовую почту с электронной почтой 2390. После отправки 40 писем, вдруг следующее исключение произошло

EXCEPTION 
javax.mail.AuthenticationFailedException 

STACKTRACE 
javax.mail.Service.connect(Service.java:306) 
javax.mail.Service.connect(Service.java:156) 
javax.mail.Service.connect(Service.java:105) 
............... 
java.lang.Thread.run(Thread.java:619) 

, а остальные 2350 сообщения электронной почты не удалось.

Почему это происходит?

Спасибо за предложения и помощь

Эзхил

=============================== ===============

Мой код:

Session session = Session.getInstance(properties, new SMTPAuthenticator(smtpAuthenticationBean.getUserName(), smtpAuthenticationBean.getPassword()))) : (Session.getInstance(properties, null)) 
for each email id 
{ 

    InternetAddress iAddress = new InternetAddress(getFromHeader(jobListBean.getFromDisplayName(), jobListBean.getFromEmail())); 
    Multipart multipart   = new MimeMultipart(); // By default, Content Type is "mixed" 


    msg.setSubject(jobListBean.getSubject()); 
    msg.setSentDate(new Date()); 

    // Set Internet Headers 
    msg.setHeader("Importance", priorityType); 

    msg.setHeader("Disposition-Notification-To", jobListBean.getFromEmail()); 

    FileDataSource fds = new FileDataSource(tempAbsoluteFileName); 
    MimeBodyPart htmlBodyPart = new MimeBodyPart(); 

    String fileContent = org.objectstyle.woproject.util.FileStringScanner.stringFromFile(new File(tempAbsoluteFileName)); 
    htmlBodyPart.setText(fileContent); 
    multipart.addBodyPart(htmlBodyPart); 

    msg.setContent(multipart); 

    InternetAddress address[] = InternetAddress.parse(emailList.toString(), true); 

    Transport smtpTransport = session.getTransport(); 
    smtpTransport.addTransportListener(this); 

    smtpTransport.connect(); 

    smtpTransport.sendMessage(msg, address); 

    smtpTransport.close(); 

    File file = new File(tempAbsoluteFileName); 
    file.delete(); 
} 

===================== ===============

Да, есть вероятность, что smtp-сервер получит отключил или не ответил , так как программа потока, я могу сказать, что в максимальном случае более 1000 писем может быть сразу же подключен к серверу smtp.

В любой бросок, будет Smtp сервер броска

EXCEPTION 
javax.mail.AuthenticationFailedException 

STACKTRACE 
javax.mail.Service.connect(Service.java:306) 
javax.mail.Service.connect(Service.java:156) 
javax.mail.Service.connect(Service.java:105) 
............... 
java.lang.Thread.run(Thread.java:619) 

, если он не в состоянии обслуживать наш запрос

=============

Еще Мне нужно зайти в журнал SMTP-сервера.

Эзхил

+0

Можете ли вы выслать код для отправки? Может ли SMTP-сервер отключать вас после определенного количества сообщений? – JoseK

+0

Проверьте журналы вашего SMTP-сервера, это может привести к фактической причине проблемы. – mindas

+0

Я обновил свой вопрос – Ezhil

ответ

1

AuthenticationFailedException не имеет ничего общего с вашим кодом, она возникает, когда сервер SMTP возвращает сбой аутентификации.

От javadoc:

Это исключение, когда метод подключения на магазине или объекта транспорта не удается из-за отказа аутентификации (например, плохое имя пользователя или пароль).

Поэтому вам нужно будет исследовать ваш почтовый сервер, чтобы узнать, почему он принимает почту, но не другие. Одна вещь, о которой я могу думать, - это какой-то механизм ограничения скорости.

+0

у меня мало знаний о скорости ограничивающем, даже есть ли ситуация «Ошибка аутентификации Исключение» происходит из-за фактора лимитирующего – Ezhil

+0

Почтовый сервер не бросает исключение, его просто возвращает ошибку (для всего, что вы знаете, внутренняя ошибка может быть чем-то вроде «мы опасаемся, что вы отправляете слишком много сообщений и можете иметь вирус, поговорите со своим системным администратором», но JavaMail интерпретирует это как ошибку аутентификации, которая почему вы получаете это исключение) –

+0

Спасибо adam, мы поговорили с поставщиками сервера smtp. Они сказали: «Дросселирование продолжается, даже в выделенной серверной среде, в этом случае это защита сервера от перегруженности». мы запросили протокол SMTP-сервера у поставщиков, чтобы подтвердить его. – Ezhil

1

Это сообщение отправляется снова и снова на почтовый сервер?

Вместо того, чтобы делать цикл for для каждого адреса электронной почты, вы должны отправить все электронные письма одним вызовом с помощью sendMessage.(Что, кажется, что ваш код будет делать)

smtpTransport.sendMessage(msg, address); 

Почтовый сервер будет принимать одну копию сообщения и отправить его по нескольким адресам.

Может быть, это предотвратит порог скорости.

+0

В таких типах почтовых отправлений. Клиент будет запрашивать индивидуальную идентификацию. Например, в поле «Кому» должно быть только одно электронное письмо. Это означает, что он лично обращается. Нам нужно составлять почту для каждого отдельно. Существует различие в содержании для каждой почты. Пример. Это можно сказать ... Дорогой Алка в одной почте и Дорогой Раджу в другой почте. Так что только мы сделали так. – Ezhil

+0

Тогда вы, возможно, разделились на несколько потоков с 1000 почтой на поток – JoseK

+0

Спасибо josek, Да, мы должны в какой-то мере ограничить нить потоков, достигающих SMTP-сервера, в то же время, чтобы этого избежать. Поскольку сервер smtp должен балансировать наш запрос. – Ezhil

Смежные вопросы