Ошибка проверки подлинности - во время кода массовой отправки почты - PullRequest
0 голосов
/ 07 мая 2010

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

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-сервера.

Ежиль

Ответы [ 2 ]

1 голос
/ 07 мая 2010

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

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

smtpTransport.sendMessage(msg, address); 

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

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

1 голос
/ 07 мая 2010

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

Из Javadoc :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...