2013-02-18 91 views
0

你好我工作在這個代碼弄清楚如何SMTP工程與Java程序,我真的很遠,但我不斷收到這個錯誤,我不知道最新的錯誤。這一切都是我看到的其他類似計劃所做的,但他們的工作似乎有效。 它得到一路下跌到FROM行,然後打印出此錯誤SMTP和Java電子郵件錯誤

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: [email protected]:\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: [email protected]):\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")); 

    } 
    } 

回答

1

要嘗試連接到郵件服務器要求您建立安全連接(TLS)以使用郵件服務。那就是你得到的錯誤。

就解決方案而言,我強烈建議使用JavaMail library,因爲它提供了許多此功能,並且已經在「野外」進行了穩健測試。

+0

我看到了,我的目標是試圖弄清楚smtp和TCP如何與語言細節進行深入研究。 – MNM 2013-02-18 21:20:26

+0

沒問題,我們都去過那裏。我建議使用不需要TLS或SSL的郵件服務器,因爲安全握手增加了很多複雜性。隨着您對協議更加熟悉,您可以轉到更高級的方面。 – Perception 2013-02-18 21:26:05

+0

你能夠建議一個不需要TLS或SSL的郵件服務器嗎,這樣我就可以感受到它的工作原理了嗎? – MNM 2013-02-19 14:15:40