web-dev-qa-db-ja.com

javax.mail.AuthenticationFailedException:接続に失敗しました、パスワードが指定されていませんか?

このプログラムは電子メールを送信しようとしますが、実行時例外をスローします。

javax.mail.AuthenticationFailedException: failed to connect, no password specified?

認証に正しいユーザー名とパスワードを指定したのに、なぜこの例外が発生するのですか?

送信者と受信者の両方がg-mailアカウントを持っています。送信者と受信者の両方にg-mailアカウントがあります。送信者の2段階認証プロセスが無効になっています。

これはコードです:

import javax.mail.*;
import javax.mail.internet.*;
import Java.util.*;

class tester {
    public static void main(String args[]) {
        Properties props = new Properties();
        props.put("mail.smtp.Host" , "smtp.gmail.com");
        props.put("mail.stmp.user" , "username");

        //To use TLS
        props.put("mail.smtp.auth", "true"); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.password", "password");
        //To use SSL
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", 
            "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");


        Session session  = Session.getDefaultInstance( props , null);
        String to = "[email protected]";
        String from = "[email protected]";
        String subject = "Testing...";
        Message msg = new MimeMessage(session);
        try {
            msg.setFrom(new InternetAddress(from));
            msg.setRecipient(Message.RecipientType.TO, 
                new InternetAddress(to));
            msg.setSubject(subject);
            msg.setText("Working fine..!");
            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com" , 465 , "username", "password");
            transport.send(msg);
            System.out.println("fine!!");
        }
        catch(Exception exc) {
            System.out.println(exc);
        }
    }
}

パスワードを指定した後でも、例外が発生します。なぜ認証されないのですか?

12
Suhail Gupta

Javax.mail.Authenticatorオブジェクトを作成し、プロパティオブジェクトとともにSessionオブジェクトに送信します。

認証子 編集:

これを変更して、ユーザー名とパスワードを受け入れ、そこに保存することも、どこにでも保存することもできます。

public class SmtpAuthenticator extends Authenticator {
public SmtpAuthenticator() {

    super();
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
 String username = "user";
 String password = "password";
    if ((username != null) && (username.length() > 0) && (password != null) 
      && (password.length   () > 0)) {

        return new PasswordAuthentication(username, password);
    }

    return null;
}

メールを送信するクラスで:

SmtpAuthenticator authentication = new SmtpAuthenticator();
javax.mail.Message msg = new MimeMessage(Session
                    .getDefaultInstance(emailProperties, authenticator));
9
RMT

セッションにパラメータとしてオブジェクト認証を追加する必要があります。といった

Session session = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                "[email protected]", "XXXXX");// Specify the Username and the PassWord
        }
});

今、あなたはこの種の例外を取得しません。..

javax.mail.AuthenticationFailedException: failed to connect, no password specified?
12
Sowmya Vallam

以下のように、メールセッションに認証インスタンスを提供する必要があります

Session session = Session.getDefaultInstance(props,
    new Authenticator() {
        protected PasswordAuthentication  getPasswordAuthentication() {
        return new PasswordAuthentication(
                    "[email protected]", "password");
                }
    });

完全な例はこちら http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/

3
Bharat Sharma

RMTの答えに加えて。また、コードを少し変更する必要がありました。

  1. Transport.sendは静的にアクセスする必要があります
  2. そのため、transport.connectは何もしませんでした。最初のPropertiesオブジェクトで接続情報を設定するだけでした。

サンプルのsend()メソッドを次に示します。構成オブジェクトは単なるデータコンテナーです。

public boolean send(String to, String from, String subject, String text) {
    return send(new String[] {to}, from, subject, text);
}

public boolean send(String[] to, String from, String subject, String text) {

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.Host", config.Host);
    props.put("mail.smtp.user", config.username);
    props.put("mail.smtp.port", config.port);
    props.put("mail.smtp.password", config.password);

    Session session = Session.getInstance(props, new SmtpAuthenticator(config));

    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] addressTo = new InternetAddress[to.length];
        for (int i = 0; i < to.length; i++) {
            addressTo[i] = new InternetAddress(to[i]);
        }
        message.setRecipients(Message.RecipientType.TO, addressTo);
        message.setSubject(subject);
        message.setText(text);
        Transport.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}
2
Kenny Cason

この問題を解決しましたユーザーとパスワードの追加 in _Transport.send_呼び出し:

_Transport.send(msg, "user", "password");
_

Javax.mailの send function のこの署名によると(from version 1.5):

public static void send(Message msg, String user, String password)

また、この署名を使用する場合、Authenticatorを設定したり、Propertiesにユーザーとパスワードを設定したりする必要はありません(ホストのみが必要です)。したがって、コードは次のようになります。

_private void sendMail(){
  try{
      Properties prop = System.getProperties();
      prop.put("mail.smtp.Host", "yourHost");
      Session session = Session.getInstance(prop);
      Message msg = #createYourMsg(session, from, to, subject, mailer, yatta yatta...)#;
      Transport.send(msg, "user", "password");
  }catch(Exception exc) {
      // Deal with it! :)
  }
}
_
2
T30

何度かログインに失敗したためにGmailアカウントがロックアウトされていないことを確認する価値があるかもしれません。パスワードをリセットする必要があるかもしれません。私はあなたと同じ問題を抱えていましたが、これが解決策であることがわかりました。

1
Andrew Calder

私にもこの問題があるので心配しないでください。外部認証の問題が原因で、メールサーバー側から送信されます。メールを開くと、メールサーバーからアクセシビリティを有効にするように指示するメールが届きます。完了したら、プログラムを再試行します。

1
user4083502

Authenticatorを使用する場合でも、mail.smtp.authプロパティをtrueに設定する必要がありました。これが実際の例です:

final Properties props = new Properties();
props.put("mail.smtp.Host", config.getSmtpHost());
props.setProperty("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication(config.getSmtpUser(), config.getSmtpPassword());
  }
});
0
alecswan

このエラーはパスワード文字に関するものである可能性があります。パスワードに特殊文字が含まれていて、パスワードをTransportクラスメソッドに追加する場合;

例えば

Transport transport = session.getTransport("smtp");
transport.connect("user","passw@rd");

または

Transport.send(msg, "user", "passw%rd");

そのエラーが表示される場合があります。 Transportクラスのメソッドは特殊文字を処理できない可能性があるためです。 javax.mail.PasswordAuthenticationクラスを使用してメッセージにユーザー名とパスワードを追加する場合、そのエラーを回避することを望みます。

例えば

...
Session session = Session.getInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication("user", "pas$w@r|d");
  }
});

Message message = new MimeMessage(session);
...
Transport.send(message);
0
oguzhan

Gmailアカウントのセキュリティ設定で「安全性の低いアプリへのアクセス」をオンにします。(メールから)、参照については以下のリンクを参照してください

http://www.ghacks.net/2014/07/21/gmail-starts-block-less-secure-apps-enable-access/

0
Prabha
import Java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class RegisterAction {


    public String execute() {


         RegisterAction mailBean = new RegisterAction();

           String subject="Your username & password ";

           String message="Hi," + username;
          message+="\n \n Your username is " + email;
          message+="\n \n Your password is " + password;
          message+="\n \n Please login to the web site with your username and password.";
          message+="\n \n Thanks";
          message+="\n \n \n Regards";

           //Getting  FROM_MAIL

           String[] recipients = new String[1];
            recipients[0] = new String();
            recipients[0] = customer.getEmail();

           try{
          mailBean.sendMail(recipients,subject,message);

          return "success";
          }catch(Exception e){
           System.out.println("Error in sending mail:"+e);
          }

        return "failure";
    }

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

                 //Set the Host smtp address

                 Properties props = new Properties();
                 props.put("mail.smtp.Host", "smtp.gmail.com");
                 props.put("mail.smtp.starttls.enable", true);
                 props.put("mail.smtp.auth", true);

                // create some properties and get the default Session

                Session session = Session.getDefaultInstance(props, new Authenticator() {

                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(
                                "[email protected]", "5373273437543");// Specify the Username and the PassWord
                    }

                });
                session.setDebug(debug);


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


                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");

                //send message
                Transport.send(msg);

                System.out.println("Message Sent Successfully");
              }

}
0
Vishal Nawale

コードの9行を参照してください。エラーの可能性があります。そのはず:

mail.smtp.user 

じゃない

mail.stmp.user;
0
bymysidel