JavaMail: не удалось подключиться к SMTP-серверу - PullRequest
0 голосов
/ 27 апреля 2010

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

import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class SendMail
{
  public static void main(String [] args)throws MessagingException
  {
    SendMail sm=new SendMail();
     sm.postMail(new String[]{"abc@yahoo.co.in"},"hi","hello","xyz@gmail.com");
   }

public void postMail( String recipients[ ], String subject, String message , String from) throws MessagingException
{
    boolean debug = false;

     //Set the host smtp address
     Properties props = new Properties();
     props.put("mail.smtp.host", "webmail.emailmyname.com");

    // create some properties and get the default Session
    Session session = Session.getDefaultInstance(props, null);
    session.setDebug(debug);

    // create a message
    Message msg = new MimeMessage(session);

    // set the from and to address
    InternetAddress addressFrom = new InternetAddress(from);
    msg.setFrom(addressFrom);

    InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
    for (int i = 0; i < recipients.length; i++)
    {
        addressTo[i] = new InternetAddress(recipients[i]);
    }
    msg.setRecipients(Message.RecipientType.TO, addressTo);


    // Optional : You can also set your custom headers in the Email if you Want
    msg.addHeader("MyHeaderName", "myHeaderValue");

    // Setting the Subject and Content Type
    msg.setSubject(subject);
    msg.setContent(message, "text/plain");
    Transport.send(msg);
}
}

Exception:
<pre>
com.sun.mail.smtp.SMTPSendFailedException: 450 smtpout04.dca.untd.com Authentication required

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886)
    at javax.mail.Transport.send0(Transport.java:191)
    at javax.mail.Transport.send(Transport.java:120)
    at SendMail.postMail(SendMail.java:52)
    at SendMail.main(SendMail.java:10)

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

«Требуется аутентификация» в сообщении об исключении говорит о том, что целевой SMTP-сервер требует, чтобы вы вошли в систему (возможно, через TLS или SSL). Это не было распространено на SMTP-серверах еще несколько лет назад (это мера защиты от спама), поэтому его легко не заметить.

Для аутентификации с помощью JavaMail :

Чтобы использовать SMTP-аутентификацию, вам нужно установить свойство mail.smtp.auth (см. Ниже) или предоставить SMTP-транспорту имя пользователя и пароль при подключении к SMTP-серверу. Вы можете сделать это, используя один из следующих подходов:

  • Предоставьте объект Authenticator при создании почтового сеанса и укажите имя пользователя и пароль во время обратного вызова Authenticator.

    Обратите внимание, что для свойства mail.smtp.user можно указать имя пользователя по умолчанию для обратного вызова, но пароль все равно необходимо будет указать явно.

    Этот подход позволяет использовать статический метод отправки транспорта для отправки сообщений.

  • Вызвать метод транспортного соединения явно с аргументами имени пользователя и пароля.

Этот подход требует, чтобы вы явно управляли транспортным объектом и использовали метод Transport sendMessage для отправки сообщения. Демонстрационная программа transport.java демонстрирует, как управлять транспортным объектом. Следующий пример примерно эквивалентен статическому методу отправки транспорта, но содержит необходимые имя пользователя и пароль:

Transport tr = session.getTransport ("smtp");

tr.connect (smtphost, имя пользователя, пароль);

msg.saveChanges (); // не забудь это

tr.sendMessage (msg, msg.getAllRecipients ());

tr.close ();

0 голосов
/ 27 апреля 2010

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

Если вы получаете «Требуется аутентификация», вы должны сначала ввести свое имя пользователя и пароль и выполнить хотя бы один запрос, такой как проверка на наличие новой почты. Несмотря на то, что SMTP не требует имени пользователя и пароля для отправки электронной почты, многие SMTP-серверы по-прежнему реализуют это, заставляя вас войти в систему и проверить свою почту через POP или IMAP, прежде чем вы сможете отправлять их.

...