0

您好,我研究了这段代码来弄清楚 SMTP 如何与 java 程序一起工作,我已经走了很远,但我一直收到这个错误,我不知道它有什么问题。这一切似乎都是我看过的其他类似程序所做的,但他们的似乎有效。它一直到 FROM 行,然后打印出这个错误

 530 5.7.0 Must issue a STARTTLS command first. n1sm21348109bkv.14 - gsmtp
 Exception in thread "main" java.lang.Exception: 250 reply not received from server.

 at emailagent.EmailAgent.main(EmailAgent.java:73)

对此的任何帮助将不胜感激谢谢

import java.io.*;
import java.net.*;
import java.util.*;

public class EmailAgent
{
 public static void main(String[] args) throws Exception
{

    // Establish a TCP connection with the mail server.
    System.out.println("Enter the mail server you wish to connect to (example:  pop.gmail.com):\n");  
    String hostName = new String();  
    Scanner emailScanner = new Scanner(System.in);  
    hostName = emailScanner.next();  
    Socket socket = new Socket(hostName, 25); 

    // Create a BufferedReader to read a line at a time.
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    // Read greeting from the server.
    String response = br.readLine();
    System.out.println(response);
    if (!response.startsWith("220"))
    {
        throw new Exception("220 reply not received from server.");
    }

    // Get a reference to the socket's output stream.
    OutputStream os = socket.getOutputStream();

    // Send HELO command and get server response.
    String command = "HELO alice\r\n";
    System.out.print(command);
    os.write(command.getBytes("US-ASCII"));
    response = br.readLine();
    System.out.println(response);

    if (!response.startsWith("250")) 
    {
        throw new Exception("250 reply not received from server.");
    }


   // Send HELO command and get server response.   
    System.out.println("Enter the name of your mail domain (example:  hotmail.com):");  
    String heloDomain = emailScanner.next();  
    String fullHeloCommand =  "HELO " + heloDomain + "\r\n";  
    System.out.print(fullHeloCommand);   
    os.write(fullHeloCommand.getBytes("US-ASCII"));   
    response = br.readLine();   
    System.out.println(response);

    if (!response.startsWith("250")) 
    {   
        throw new Exception("250 reply not received from server.\n");   
    }  

    // Send MAIL FROM command.  
    System.out.println("Please enter your e-mail address (example: me@myexample.com:\n");  
    String sourceAddress = emailScanner.next();  
    String mailFromCommand = "MAIL FROM:  <" + sourceAddress + ">\r\n";  
    System.out.println(mailFromCommand);  
    os.write(mailFromCommand.getBytes("US-ASCII"));  
    response = br.readLine();  
    System.out.println(response);

    if (!response.startsWith("250")) 
    {
        throw new Exception("250 reply not received from server.\n");  
    }

    // Send RCPT TO command.  
    System.out.println("Please type the destination e-mail address (example:  example@nova.edu):\n");  
    String destEmailAddress = new String();  
    destEmailAddress = emailScanner.next();  
    String fullAddress = new String();  
    fullAddress = "RCPT TO:  <" + destEmailAddress + ">\r\n";  
    System.out.println(fullAddress);  
    os.write(fullAddress.getBytes("US-ASCII"));  
    response = br.readLine();  
    System.out.println(response);

    if(!response.startsWith("250"))  
    {  
        throw new Exception("250 reply not received from server.\n");  
    }  

    // Send DATA command.    
    String dataString = new String();  
    dataString = "DATA";  
    System.out.println(dataString);  
    os.write(dataString.getBytes("US-ASCII"));  
    response = br.readLine();  

    if(!response.startsWith("354"))
    {
        throw new Exception("354 reply not received from server.\n");  
    }

    System.out.println(response); 


    // Send message data.   
    System.out.println("Enter your message, enter '.' on a separate line to end message data entry:\n");  
    String input = new String();  
    while(input.charAt(0) != '.')  
    {  
        input = emailScanner.next();  
        os.write(input.getBytes("US-ASCII"));  
    }  
        //End with line with a single period.  
    os.write(input.getBytes("US-ASCII"));  
    response = br.readLine();  
    System.out.println(response);

    if(!response.startsWith("250")) 
    {
        throw new Exception("250 reply not received from server\n");  
    }


    // Send QUIT command.  
    String quitCommand = new String();  
    quitCommand = "QUIT";  
    os.write(quitCommand.getBytes("US-ASCII"));  

    }   
  }  
4

1 回答 1

1

您尝试连接的邮件服务器需要您建立安全连接 (TLS) 才能使用邮件服务。这就是你得到的错误。

至于解决方案,我强烈推荐使用JavaMail 库,因为它提供了很多开箱即用的功能,并且已经在“野外”进行了可靠的测试。

于 2013-02-18T20:04:06.247 回答