mail.smtp.password什么时候变得不起作用?

时间:2011-10-18 22:35:51

标签: java javamail

我有以下发送电子邮件的代码:

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

Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("from@example.com"));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress("to@example.com"));
msg.setSubject("HEY " + new Date());
msg.setContent("This is a test message", "text/plain");
msg.setSentDate(new Date());
Transport transport = session.getTransport("smtp");
transport.connect();
transport.sendMessage(msg, msg.getAllRecipients());

网络上的各种网站都指向mail.smtp.password,用于将密码传递给Java Mail的SMTP身份验证。但是,这似乎不适用于JavaMail 1.4.4和上面的代码。

这是否已被弃用?

3 个答案:

答案 0 :(得分:3)

(最新)JavaMail javadoc未提及使用mail.smtp.password指定身份验证所需密码的方法。不确定它是否有效。为此,我总是使用Authenticator

答案 1 :(得分:0)

javax.mail.Service使connect()连接到指定的主机和端口。在那里,它使用javax.mail.Authenticator进行身份验证。

来自javax.mail.Service.connect()方法的代码:

public synchronized void connect(String host, int port,
        String user, String password) throws MessagingException {

    // see if the service is already connected
    if (isConnected())
        throw new IllegalStateException("already connected");

    PasswordAuthentication pw;
    boolean connected = false;
    boolean save = false;
    String protocol = null;
    String file = null;

    // get whatever information we can from the URL
    // XXX - url should always be non-null here, Session
    //       passes it into the constructor
    if (url != null) {
        protocol = url.getProtocol();
        if (host == null)
        host = url.getHost();
        if (port == -1)
        port = url.getPort();

        if (user == null) {
        user = url.getUsername();
        if (password == null)   // get password too if we need it
            password = url.getPassword();
        } else {
        if (password == null && user.equals(url.getUsername()))
            // only get the password if it matches the username
            password = url.getPassword();
        }

        file = url.getFile();
    }

    // try to get protocol-specific default properties
    if (protocol != null) {
        if (host == null)
        host = session.getProperty("mail." + protocol + ".host");
        if (user == null)
        user = session.getProperty("mail." + protocol + ".user");
    }

    // try to get mail-wide default properties
    if (host == null)
        host = session.getProperty("mail.host");

    if (user == null)
        user = session.getProperty("mail.user");

    // try using the system username
    if (user == null) {
        try {
        user = System.getProperty("user.name");
        } catch (SecurityException sex) {
        if (debug)
            sex.printStackTrace(session.getDebugOut());
        }
    }

    // if we don't have a password, look for saved authentication info
    if (password == null && url != null) {
        // canonicalize the URLName
        setURLName(new URLName(protocol, host, port, file, user, null));
        pw = session.getPasswordAuthentication(getURLName());
        if (pw != null) {
        if (user == null) {
            user = pw.getUserName();
            password = pw.getPassword();
        } else if (user.equals(pw.getUserName())) {
            password = pw.getPassword();
        }
        } else
        save = true;
    }

    // try connecting, if the protocol needs some missing
    // information (user, password) it will not connect.
    // if it tries to connect and fails, remember why for later.
    AuthenticationFailedException authEx = null;
    try {
        connected = protocolConnect(host, port, user, password);
    } catch (AuthenticationFailedException ex) {
        authEx = ex;
    }

    // if not connected, ask the user and try again
    if (!connected) {
        InetAddress addr;
        try {
        addr = InetAddress.getByName(host);
        } catch (UnknownHostException e) {
        addr = null;
        }
        pw = session.requestPasswordAuthentication(
                addr, port,
                protocol,
                null, user);
        if (pw != null) {
        user = pw.getUserName();
        password = pw.getPassword();

        // have the service connect again
        connected = protocolConnect(host, port, user, password);
        }
    }

    // if we're not connected by now, we give up
    if (!connected) {
        if (authEx != null)
        throw authEx;
        else if (user == null)
        throw new AuthenticationFailedException(
            "failed to connect, no user name specified?");
        else if (password == null)
        throw new AuthenticationFailedException(
            "failed to connect, no password specified?");
        else
        throw new AuthenticationFailedException("failed to connect");
    }

    setURLName(new URLName(protocol, host, port, file, user, password));

    if (save)
        session.setPasswordAuthentication(getURLName(),
                new PasswordAuthentication(user, password));

    // set our connected state
    setConnected(true);

    // finally, deliver the connection event
    notifyConnectionListeners(ConnectionEvent.OPENED);
    }

答案 2 :(得分:0)

我不知道它有用,我已经使用JavaMail大约十年了。可能是一个都市神话。如果确实有效,那将是一个安全漏洞。使用Authenticator接口。