JDBC SQL Server身份验证错误:用户''登录失败

时间:2015-07-16 19:27:31

标签: java sql sql-server jdbc

这是我的应用程序,它使用SQL数据库从中提取电子邮件,然后使用Java应用程序发送这些电子邮件。出于某种原因,我收到了这个错误:

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Login failed for user ''. ClientConnectionId:85cbe035-a937-4f1a-81eb-69f5b7684049
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:215)
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:251)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:81)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:3004)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:2286)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$100(SQLServerConnection.java:43)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:2272)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5846)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1719)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1330)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:995)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:831)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at TestSendEmailD.connect(TestSendEmails.java:72)
    at TestSendEmailD.getTestSendEmails(TestSendEmails.java:76)
    at Main.main(Main.java:6)

这是我的代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

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;

public class TestSendEmails {
    private String emailTo;
    private String emailSubject;
    private String emailBody;
    private String emailAttachments;

    public TestSendEmails(String emailTo, String emailSubject, String emailBody, String emailAttachments){
        super();
        this.emailTo = emailTo;
        this.emailSubject = emailSubject;
        this.emailBody = emailBody;
        this.emailAttachments = emailAttachments;
    }

    public String getEmailTo(){
        return emailTo;
    }

    public void setEmailTo(String emailTo){
        this.emailTo = emailTo;
    }

    public String getEmailSubject(){
        return emailSubject;
    }

    public void setEmailSubject(String emailSubject){
        this.emailSubject = emailSubject;
    }

    public String getEmailBody(){
        return emailBody;
    }

    public void setEmailBody(String emailBody){
        this.emailBody = emailBody;
    }

    public String getEmailAttachments(){
        return emailAttachments;
    }

    public void setEmailAttachments(String emailAttachments){
        this.emailAttachments = emailAttachments;
    }
}

class TestSendEmailD{
    private Connection con;

    private static final String GET_EMAILS = "Select * From Emails";

    private void connect() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException{
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
        con = DriverManager.getConnection("jdbc:sqlserver://100.000.000\\SQLEXPRESS:2233;databaseName=Emails");
    }

    public List<TestSendEmails> getTestSendEmails() throws Exception{
        connect();
        PreparedStatement ps = con.prepareStatement(GET_EMAILS);
        ResultSet rs = ps.executeQuery();
        List<TestSendEmails> result = new ArrayList<TestSendEmails>();
        while(rs.next()){
            result.add(new TestSendEmails(rs.getString("emailTo"), rs.getString("emailSubject"),rs.getString("emailBody"),rs.getString("emailAttachments")));
        }
        disconnect();
        return result;
    }

    private void disconnect() throws SQLException{
        if(con != null){
            con.close();
        }
    }
}

class EmailSender{
    private Session session;

    private void init(){
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "100.00.00.000.0");
        props.put("mail.smtp.port", "666");

        session = Session.getInstance(props,
                  new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("aaaa", "5555");
                    }
                  });
    }

    public void sendEmail(TestSendEmails s) throws MessagingException{
        init();
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("mmmm@gmail.com"));
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(s.getEmailTo()));
        message.setSubject(s.getEmailSubject());
        message.setText(s.getEmailBody());
        Transport.send(message);
    }

    public void sendEmail(List<TestSendEmails> emails) throws MessagingException{
        for(TestSendEmails TestSendEmails:emails ){
            sendEmail(TestSendEmails);
        }
    }
}

这是我的main.java类:

import java.util.List;

public class Main {
    public static void main(String[] args) throws Exception {
        TestSendEmailD dao=new TestSendEmailD();
        List<TestSendEmails> list=dao.getTestSendEmails();
        EmailSender sender=new EmailSender();
        sender.sendEmail(list);
    }
}

我不确定这是否是正确的方法。如果有人知道更好的方式,请告诉我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的错误完全与数据库身份验证相关,与邮件无关。

Login failed for user ''

您的SQL连接字符串不包含任何身份验证信息:

jdbc:sqlserver://100.000.000\\SQLEXPRESS:2233;databaseName=Emails

有关于如何为SQL Server here构建JDBC连接字符串的指南。