1

我正在创建一个用于在 java 中发送电子邮件的应用程序,一切都已设置并正常工作。但错误是当我尝试登录 Hotmail 帐户时,它显示我在 catch 块中提供的不正确的电子邮件和密码错误。但是我第一次登录yahoo或者gmail的时候登录hotmail,之后我可以登录hotmail,但是我不能先登录hotmail,为什么?!代码如下

private void cmd_loginActionPerformed(java.awt.event.ActionEvent evt) {                                          
    user = txt_user.getText();
    pass = txt_pass.getText();
    int combo = combo_ac.getSelectedIndex();

    if(combo==0){
try{
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        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 sessin = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(user+"@gmail.com", pass);
                }
            }
        );
    new Gmail().setVisible(true);
}catch(Exception e){
        JOptionPane.showMessageDialog(null, "Incorrect Email or Password!");
 }
    }else if(combo==1){
try{
      Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.live.com");
        props.put("mail.smtp.socketFactory.port", "25");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "25");

        Session sessin = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(user+"@hotmail.com", pass);
                }
            }
        );
     new Hotmail().setVisible(true);
}catch(Exception e){
        JOptionPane.showMessageDialog(null, "Incorrect Email or Password!");
 }
    }else if(combo==2){
try{
       Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.mail.yahoo.com");
        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 sessin = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication(user+"@yahoo.com", pass);
                }
            }
        );
     new Yahoo().setVisible(true);
}catch(Exception e){
        JOptionPane.showMessageDialog(null, "Incorrect Email or Password!");
 }
    }
}                                         
4

1 回答 1

1

这篇文章将解释为什么您可以在登录 gmail 或 yahoo 后登录您的 hotmail 帐户实际上,您登录的是您第一次尝试时使用的同一个帐户。问题是您正在Session#getDefaultInstance()使用Session#getInstance()

该方法在第一次Session.getDefaultInstance被调用时创建一个新的会话,使用传递的属性。后续调用将返回原始会话并忽略您传入的任何属性。如果您想创建具有不同属性的不同会话,请不要这样做。[...]总是使用来避免这个问题。Session.getDefaultInstanceSession.getInstance

但是,它没有解释为什么您无法登录到您的 hotmail 帐户,但您应该发布异常堆栈跟踪,以便我们为您提供帮助。

更新:

基于此堆栈跟踪:

com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first

这意味着您必须根据 Hotmail 要求设置mail.smtp.starttls.enable属性:true

在传出服务器 (SMTP) 下为使用以下类型的加密连接选择TLS,然后单击确定。注意 Outgoing Server (SMTP) 框应设置为端口 25。如果端口 25 在网络中或您的 ISP 被阻止,您可以将 SMTP 端口设置为 587。

注意:从配置 Outlook 中提取以连接到 MSN 电子邮件帐户

尝试登录 Hotmail 帐户时,您应该只在代码中添加以下行:

props.put("mail.smtp.starttls.enable", "true");

也不要忘记我上面建议的替换为Session.getDefaultInstanceSession.getInstance

于 2013-08-22T19:38:43.017 回答