# SMTP Client - readline problem



## 0din (21. Sep 2009)

Guten Morgen,

ich bin z.Z. an einem SMTP client zugange (auch dem Server)
nun wollt ich mein prog mal eben warten lassen un lauschen was der server mir so zurück gibt. problem dabei is, die readline methode wird einmal ausgeführt und mein prog läuft irgendwo weiter ohne das ich wüsste wo...

mal eben den code:

```
package IN22;

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

public class SmtpClient
{

	private static BufferedReader is;
	private static DataOutputStream os;
	private static Socket smtpSocket;
	private static ArrayList<String> commands;

	public static void main(String[] args)
	{
		Thread t1 = new Thread(new SmtpServer());
		t1.start();

		commands = new ArrayList<String>();
		commands.add("EHLO");
		commands.add("MAIL From: [email]no.mam@gmail.com[/email]");
		commands.add("RCPT To: [email]no.mam@gmail.com[/email]");
		commands.add("DATA");
		commands.add("From: [email]no.mam@gmail.com[/email]");
		commands.add("Hello Google!");
		commands.add("\n.");
		commands.add("QUIT");

		smtpSocket = null;
		os = null;
		is = null;
		// Port 25 is voor SMTP
		try
		{
			smtpSocket = new Socket("localhost", 25);
			os = new DataOutputStream(smtpSocket.getOutputStream());
			is = new BufferedReader(new InputStreamReader(smtpSocket.getInputStream()));
		}
		catch (UnknownHostException e)
		{
			System.err.println("Don't know about host: hostname");
		}
		catch (IOException e)
		{
			System.err.println("Couldn't get I/O for the connection to: hostname");
		}
		// Als alles goed zit sturen we een bericht
		if (smtpSocket != null && os != null && is != null)
		{
			try
			{
				//iedere bericht in de arraylist wordt verstuurd
				for (String st : commands)
				{
					os.writeBytes("" + st + "\n");
					while (!waitForResponse())
					{
						try
						{
							Thread.sleep(1000);
							os.writeBytes("" + st + "\n");
						}
						catch (InterruptedException e)
						{
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}

				// en nu sluiten we alle verbindingen
				os.close();
				is.close();
				smtpSocket.close();
			}
			catch (UnknownHostException e)
			{
				System.err.println("Onbekende Host" + e);
			}
			catch (IOException e)
			{
				System.err.println("IOException: " + e);
			}
		}
	}

	@SuppressWarnings("deprecation")
	public static boolean waitForResponse() throws IOException
	{
		boolean ret = false;

		String input = null;

		while (input == null)
		{
			input = is.readLine(); //hier Gibts probleme !!!!!!!!!!!!!!!!!!!!
		}
		System.out.println(input);
		int code = Integer.parseInt(input);

		switch (code)
		{
		case 250:
		{
			ret = true;
			break;
		}
		case 354:
		{
			ret = true;
			break;
		}
		case 221:
		{
			ret = true;
			break;
		}
		default:
		{
			ret = false;
			break;
		}
		}

		return ret;
	}
}
```
da des auf NL is hab ich mal eben nen deutschn kommentar mit einigen ausrufezeichen dazu gemacht, wo ich den fehler vermute bzw wo er auftritt

schonmal danke für die hilfe


----------



## Geeeee (21. Sep 2009)

Hatte auch das Problem bei dem naiven Versuch das Telnet-Verhalten nachzubauen. Gleiche stelle und keine Ahnung, wie man es umgehen kann. Irgendwie scheint der Server die Antwort nicht richtig zu beenden / schließen.
Bin nun wieder bei JavaMail und da hast du auch keine Probleme. Spricht etwas dagegen, es zu verwenden?


----------



## 0din (21. Sep 2009)

ich habs nu do no aufgelöst, war dümmer als erwartet...

der bufferedReader nimmt das ende der line nur wahr, wenn es mit \n geschlossen wurde.
der server hatte aber das \n nich mit geschickt also wartete der BR die ganze zeit auf das zeilenende.


----------



## Geeeee (21. Sep 2009)

Rein interessehalber: Wie hast du das Ende der Zeilen nun gefunden? Du hast ja wahrscheinlich bzw. hoffentlich nicht den End-Text jedes Befehls ausgelesen. Bei mir war das Problem, dass auch bei einem read() auf -1 überprüfen nix gebracht hat, weil es nie zutraf.


----------



## 0din (21. Sep 2009)

naja, ich musste den client schreiben, dazu braucht ich aber auch n primitiven server...
der server hat bei seinen rückmeldungen aber nie das \n mit geschickt...

das is mir rein zufällig aufgefallen als ich ne weitere meldung rein geschrieben hab, vorher hab ichs übersehn.


----------

