JAVA邮件客户端错误

时间:2017-04-28 04:19:26

标签: java sockets smtp base64 email-client

我正在使用JAVA套接字连接作为学校项目在端口25上为google邮件服务器“smtp.gmail.com”构建一个简单的邮件客户端。启动和连接到服务器很好。但是在发出“STARTTLS”命令后进行身份验证时,我得到一个奇怪的回复,有时没有来自服务器的回复。 以下是我的代码中负责此错误的部分:

public class Client {

public static void main(String[] args) throws IOException {

    System.out.println("Connecting to server...");
    Socket cs = new Socket("smtp.gmail.com", 25);
    System.out.println("Connected to server! via port: " + cs.getLocalPort());

    OutputStreamWriter osw = new OutputStreamWriter(cs.getOutputStream());
    InputStreamReader isr = new InputStreamReader(cs.getInputStream());

    BufferedWriter bw = new BufferedWriter(osw);

    char[] inputBuffer = new char[1024];

    int len = isr.read(inputBuffer);
    String s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + s);

    System.out.println("C: HELO localhost");
    bw.write("HELO localhost");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + s);

    System.out.println("C: STARTTLS");
    bw.write("STARTTLS");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + s);

    System.out.println("C: EHLO localhost");
    bw.write("EHLO localhost");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + s);

    System.out.println("C: AUTH LOGIN");
    bw.write("AUTH LOGIN");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + s);
    // extra code goes here, no need to show
    }
}

以下是输出:

  

连接服务器......

     

连接到服务器!通过港口:39167

     

S:220 smtp.gmail.com ESMTP v52sm3768873wrc.53 - gsmtp

     

C:HELO localhost

     

S:250 smtp.gmail.com为您服务

     

C:STARTTLS

     

S:220 2.0.0准备启动TLS

     

C:EHLO localhost

     

S:F

     

C:AUTH LOGIN

     

S:

正如您所看到的,“STARTTLS”之后对“EHLO localhost”的回复是不明确的,然后没有回复“AUTH LOGIN”。我首先想到应该是服务器正在发送Base64文本,所以我尝试按如下方式解码响应:

    System.out.println("C: EHLO localhost");
    bw.write("EHLO localhost");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + new String(Base64.getDecoder().decode(s)));

    System.out.println("C: AUTH LOGIN");
    bw.write("AUTH LOGIN");
    bw.newLine();
    bw.flush();
    len = isr.read(inputBuffer);
    s = "";
    for(int i = 0; i < len; ++i){
        s += inputBuffer[i];
    }
    System.out.println("S: " + new String(Base64.getDecoder().decode(s)));

但是获得了以下错误:

  

连接服务器......

     

连接到服务器!通过港口:39199

     

S:220 smtp.gmail.com ESMTP l27sm4475707wrb.65 - gsmtp

     

C:HELO localhost

     

S:250 smtp.gmail.com为您服务

     

C:STARTTLS

     

S:220 2.0.0准备启动TLS

     

C:EHLO localhost

     

线程“main”中的异常java.lang.IllegalArgumentException:Illegal base64 character 15

      at java.util.Base64$Decoder.decode0(Unknown Source)

      at java.util.Base64$Decoder.decode(Unknown Source)

      at java.util.Base64$Decoder.decode(Unknown Source)

      at khaldoun.kassam.servertest.Client.main(Client.java:64)

我想也许我应该使用SSLSockets,但从我看到的是,有些人能够使用正常的套接字并且它适用于它们。我没有任何结果地搜索了这个问题。我不知道发送到服务器的命令中是否缺少某些内容。我真的需要帮助。 提前感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您是否打开了“允许安全性较低的应用”并检查此链接中缺少的内容,我猜您无法使用端口25与SMTP

Google mail setup