java - Java 上 Gmail 的 SMTP 客户端使用套接字身份验证问题

标签 java sockets email gmail

我发现了一个套接字 SMTP 客户端示例,稍加修改即可使用 SSLsockets 连接到 gmail,但现在我不知道如何授权我发送的帐户。 (我不使用JAVAMAIL,因为这是作业)

 public class SMTP {

  public static void main(String args[]) throws IOException,
      UnknownHostException {
    String msgFile = "file.txt";
    String from = "from@gmail.com";
    String to = "to@gmail.com";
    String mailHost = "smtp.gmail.com";
    SMTP mail = new SMTP(mailHost);
    if (mail != null) {
      if (mail.send(new FileReader(msgFile), from, to)) {
        System.out.println("Mail sent.");
      } else {
        System.out.println("Connect to SMTP server failed!");
      }
    }
    System.out.println("Done.");
  }

  static class SMTP {
    private final static int SMTP_PORT = 25;

    InetAddress mailHost;

    InetAddress localhost;

    BufferedReader in;

    PrintWriter out;

    public SMTP(String host) throws UnknownHostException {
      mailHost = InetAddress.getByName(host);
      localhost = InetAddress.getLocalHost();
      System.out.println("mailhost = " + mailHost);
      System.out.println("localhost= " + localhost);
      System.out.println("SMTP constructor done\n");
    }

    public boolean send(FileReader msgFileReader, String from, String to)
        throws IOException {
      SSLSocket smtpPipe;
      InputStream inn;
      OutputStream outt;
      BufferedReader msg;
      msg = new BufferedReader(msgFileReader);
      smtpPipe = (SSLSocket) ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(InetAddress.getByName("smtp.gmail.com"), 465);
      if (smtpPipe == null) {
        return false;
      }
      inn = smtpPipe.getInputStream();
      outt = smtpPipe.getOutputStream();
      in = new BufferedReader(new InputStreamReader(inn));
      out = new PrintWriter(new OutputStreamWriter(outt), true);
      if (inn == null || outt == null) {
        System.out.println("Failed to open streams to socket.");
        return false;
      }
      String initialID = in.readLine();
      System.out.println(initialID);
      System.out.println("HELO " + localhost.getHostName());
      out.println("HELO " + localhost.getHostName());
      String welcome = in.readLine();
      System.out.println(welcome);
      System.out.println("MAIL From:<" + from + ">");
      out.println("MAIL From:<" + from + ">");
      String senderOK = in.readLine();
      System.out.println(senderOK);
      System.out.println("RCPT TO:<" + to + ">");
      out.println("RCPT TO:<" + to + ">");
      String recipientOK = in.readLine();
      System.out.println(recipientOK);
      System.out.println("DATA");
      out.println("DATA");
      String line;
      while ((line = msg.readLine()) != null) {
        out.println(line);
      }
      System.out.println(".");
      out.println(".");
      String acceptedOK = in.readLine();
      System.out.println(acceptedOK);
      System.out.println("QUIT");
      out.println("QUIT");
      return true;
    }
  }
}

最佳答案

重写了代码。这工作得很好。

public class TotalTemp
{
     private static DataOutputStream dos;

     public static void main(String[] args) throws Exception
     {
          int delay = 1000;
          String user = "xxxxx@gmail.com";
          String pass = "xxxxxxxx11";
          String username = Base64.encodeBase64String(user.getBytes(StandardCharsets.UTF_8));
          String password = Base64.encodeBase64String(pass.getBytes(StandardCharsets.UTF_8));    

          SSLSocket sock = (SSLSocket)((SSLSocketFactory)SSLSocketFactory.getDefault()).createSocket("smtp.gmail.com", 465);
//          Socket sock = new Socket("smtp.gmail.com", 587);
          final BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
          (new Thread(new Runnable()
          {
               public void run()
               {
                    try
                    {
                         String line;
                         while((line = br.readLine()) != null)
                              System.out.println("SERVER: "+line);
                    }
                    catch (IOException e)
                    {
                         e.printStackTrace();
                    }
               }
          })).start();
          dos = new DataOutputStream(sock.getOutputStream());

          send("EHLO smtp.gmail.com\r\n");
          Thread.sleep(delay);
          send("AUTH LOGIN\r\n");
          Thread.sleep(delay);
          send(username + "\r\n");
          Thread.sleep(delay);
          send(password + "\r\n");
          Thread.sleep(delay);
          send("MAIL FROM:<XXXXXXXX@gmail.com>\r\n");
          //send("\r\n");
          Thread.sleep(delay);
          send("RCPT TO:<YYYYYYYY@gmail.com>\r\n");
          Thread.sleep(delay);
          send("DATA\r\n");
          Thread.sleep(delay);
          send("Subject: Email test\r\n");
          Thread.sleep(delay);
          send("Test 1 2 3\r\n");
          Thread.sleep(delay);
          send(".\r\n");
          Thread.sleep(delay);
          send("QUIT\r\n");
     }

     private static void send(String s) throws Exception
     {
          dos.writeBytes(s);
          System.out.println("CLIENT: "+s);
     }
}

关于java - Java 上 Gmail 的 SMTP 客户端使用套接字身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846256/

相关文章:

java - 如何使用自定义布局创建对话框弹出窗口?

c - 线程 C 客户端-服务器聊天应用程序中 SIGSEGV 的未知原因

php - Mail-Tester.com : Freemail in Reply-To, 但不是来自

c# - Mailbridge 非 SSL 到 SSL 服务器

Java JFrame_JPanel

java - Spring Boot : How to Disable JNDI lookup and use spring. 数据源代替测试?

java - 如何要求用户在单击 android 中的通知操作时解锁设备?

c - 读取套接字缓冲区未读取

c - 我如何使用此客户端程序访问 tomcat 资源?

php mail() 给我一个 "no disk"错误