# Emailprogramm in Java



## JackTheRipper (26. Jun 2006)

Hallo ihr Lieben,
ich hoffe ihr könnt mir helfen. Wir haben als Schulprojekt die Aufgabe bekommen einen Emailclient zu schreiben. Dieser soll SMTP und POP beherschen. Die Java Klassen für eMails sollen wir dabei nicht verwenden.

Hier nun das Problem.


```
pop3_get.readLine();
```

Dies sorgt scheinbar für eine Endlosschleife beim Auslesen der Email, wobei pop3_get ein BufferedReader ist:



```
pop3_get = new BufferedReader(new InputStreamReader(s.getInputStream()));
```


Ich komme einfach nicht weiter! Nichteinmal mein Lehrer weiß warum (was bei dem nicht viel heißt  )

Würde mich sehr über kreative Antworten freuen!


Gruß,
Jack


----------



## DP (26. Jun 2006)

mach mal


```
String line = br.readLine();
      while (line != null){
        System.out.println(line);
        line = br.readLine(); //und nächste zeile
      }
```


----------



## JackTheRipper (26. Jun 2006)

was meinst du mit 



> //und nächste zeile




Jack


----------



## Leroy42 (26. Jun 2006)

JackTheRipper hat gesagt.:
			
		

> was meinst du mit
> 
> 
> > //und nächste zeile
> ...



Das ist einfach nur ein Kommentar, daß der vorstehende Java-Code
die nächste Zeile liest.


----------



## DP (26. Jun 2006)

dass der sich da die nächste zeile aus dem stream holt.


```
readLine
public String readLine()
                throws IOExceptionRead a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed. 

Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached 
Throws: 
IOException - If an I/O error occurs
```


----------



## JackTheRipper (26. Jun 2006)

So sieht meine Methode momentan aus:


```
try{
       String t = pop3_get.readLine();
        while(t != null){
           return t;
           t = pop3_get.readLine();
        }


      } catch(IOException e){
        tm.stext("Error");
      }
      
    return null;
```



Er sagt er könne mit 
	
	
	
	





```
t = pop3_get.readLine();
```
 nichts anfangen (unreachable statement) :-(


----------



## Leroy42 (26. Jun 2006)

JackTheRipper hat gesagt.:
			
		

> So sieht meine Methode momentan aus:
> 
> ```
> try{
> ...



Java gehört nicht zu den Sprachen, die Activation-Frames verwalten können.
Sobald also die while-Schleife betreten wird, wird der gelesene String
via return zurückgegeben *und* die umgebende Methode endgültig
beendet. Java bietet das Konzept des Wiedereintritts nicht an.

Anstatt also bei jedem gelesenen String die Methode zu verlassen, mußt
du deine Struktur so umstellen, daß entweder an der Stelle, durch Aufruf
einer anderen Methode, der String weiterverarbeitet wird. Oder du spendierst
eine eigene Leseklasse, die _von außen_ aufgerufen wird und jeweils eine
neue Zeile liefert.


----------



## JackTheRipper (26. Jun 2006)

Hier macht er bei readine auch nicht weiter:


```
public String datenEmpfangen(){
    tm.stext("Lesen");
    String t = "";
    try{

           t = pop3_get.readLine();


      } catch(Exception e){
        tm.stext("Error");
      }
      tm.stext("gelesen?");
    return t;
  }
```



Verstehe nicht warum!!!  :bahnhof:


----------



## DP (26. Jun 2006)

da musst du schon mehr code posten. wo kommt dein pop3.. her etc.


----------



## JackTheRipper (26. Jun 2006)

Die gui braucht man ja nicht dazu...hier der code...unwichtiges is gekürzt:


```
import java.net.*;
import java.io.*;


public class POP3 {

  // Anfang Variablen

  private String Server="ke";
  private int Port= 110;
  private String User="ert";
  private String PW="ertrtfgh";
  private BufferedReader pop3_get;
  private PrintWriter pop3_send;
  Tmail tm;
  Socket s;



  // Ende Variablen

  // Anfang Ereignisprozeduren

  public POP3(Tmail blubb){
    tm = blubb;
  }

  public boolean verbinden_pop() {

      boolean status = false;

       try{

         s = new Socket(Server,Port);

       } catch (Exception e) {
          e.printStackTrace();

       }

       if(s!=null){

        try
        {
            //Objekt zum Versenden von Nachrichten ?ber den Socket erzeugen
            pop3_send = new PrintWriter(s.getOutputStream());
            //Objekt zum Empfangen von Nachrichten ?ber das Socketobjekt erzeugen
            pop3_get = new BufferedReader(new InputStreamReader(s.getInputStream()));


        } catch (Exception e) {
            e.printStackTrace();
        }

        if(s.isConnected()){
          status=true;
        } else {
          status=false;
        }
       }


    return status;
  }

  public boolean login_pop() {
    boolean status = false;
   if(s!=null && s.isConnected()){

       try{
         pop3_send.print("user "+User+"\n");

         pop3_send.print("pass "+PW+"\n");

         //tm.stext(datenEmpfangen());

         if(datenEmpfangen().substring(0,3).equals("+OK")){
           status = true;
           tm.stext("Login fertig");
           //pop3_send.flush();
         }
       } catch(Exception e){
           tm.stext("Login Fehler");
       }

   } else {
     tm.stext("Verbindungsfehler (Socket verbunden?)");
   }

   return status;
  }

  public String ungeleseneMail_pop() {
   boolean status = true;
    if(/*s == null || !s.isConnected()*/ status == false){
      tm.stext("FEHLER - Verbindung getrennt");
    } else if(/*s!=null && s.isConnected()*/ status == true){

      tm.stext("1");
      String nachricht = "";
       try{
         //tm.stext("2");

        pop3_send.println("stat");
        nachricht = datenEmpfangen();
        //tm.stext(datenEmpfangen());
        //tm.stext("3");


        //tm.stext("4");
        //tm.stext(nachricht);
        if(nachricht.substring(0,3).equals("+OK")){
          int anfang = nachricht.indexOf(" ");
          int ende = nachricht.indexOf(" ",anfang+1);
          tm.stext("Nachricht2 OK");

          String zahl = nachricht.substring(anfang+1,ende);
          tm.stext(zahl);
          tm.stext("Nachricht3 OK");
          int anzahl = Integer.parseInt(zahl);
          tm.stext("ParseInt OK");
          tm.stext("Lade "+anzahl+" neue Emails");
          StringBuffer send = new StringBuffer();
          for(int i=0;i<=anzahl;i++){
            this.pop3_send.println("retr "+i+"\n");
            nachricht = "";
            while(!nachricht.equals(".") && nachricht != null){
              nachricht = datenEmpfangen();
              send.append(nachricht);
            }
            tm.textSchreiben(send.toString());
          }

        } else {
          tm.stext("Keine neuen Emails");
        }

       } catch (Exception e){
         tm.stext("Exception");
       }

    } else {
      tm.stext("Fehler!?");
    }
    return null;
  }

  /*public String mailsLoeschen_pop() {
    return true;
  }   */

  public boolean verbindungTrennen_pop() {

    if(s!=null && s.isConnected()){
      try{
         s.close();
      } catch(Exception e){
         System.out.println(e);
      }
    }

    return true;
  }

 

  public String datenEmpfangen(){
    tm.stext("Lesen");
    String t = "";
    try{
           System.out.println(t = pop3_get.readLine());
           //t = (pop3_get.readLine() + "\n");


      } catch(Exception e){
        tm.stext("Error");
      }
      tm.stext("gelesen?");
      
    return t;
  }


  public static void main(String[]args){
    POP3 pop = new POP3(new Tmail("Tmail"));
    pop.verbinden_pop();
    pop.login_pop();
    pop.ungeleseneMail_pop();
    //pop.verbindungTrennen_pop();
  }
  // Ende Ereignisprozeduren
}
```

Ich hoffe es hilft euch mir zu helfen 


Jack


----------



## Leroy42 (27. Jun 2006)

Vielleicht bedienst du das POP3-Protokoll nicht korrekt
und "er" wartet auf weitere, zu sendende, Daten bevor
"er" eine Zeile schickt. Allerdings kenne ich das Protokoll
auch nicht auswendig.

Vorschlag:

Probier das ganze doch mal _zu Fuß_ in einer
telnet-Sitzung aus, um zu sehen, wann was geschickt
werden muß!


----------



## samatthias (27. Jun 2006)

Hallo Zusammen


Sorry, wieso krüpelt ihr euch so ab? Nimm doch einfach die Java Mail API und gut ist. Auf der Sun Seite gibt es sogar gute Howtos dazu. Wenn natürlich die Aufgabe so gestellt ist das die Mail API nicht benutzt werden darf, dann ignoriert einfach das Posting.

[EDIT]Ok sorry, Anfangsposting nicht gelesen. In dem Fall einfach ignorieren.[/EDIT]

Liebe Grüsse
Matthias


----------



## Leroy42 (27. Jun 2006)

JackTheRipper hat gesagt.:
			
		

> Wir haben als Schulprojekt die Aufgabe bekommen einen Emailclient zu schreiben. Dieser soll SMTP und POP beherschen. Die Java Klassen für eMails sollen wir dabei nicht verwenden.



Meine Güte! Was heutzutage alles in einem Schulprojekt gefordert wird.  :shock: 

Da waren _meinerzeitige_ Schulprojekte (Einlesen von Daten einer Skisprung-
Meisterschaft, bewerten und sortieren nach Sprungweiten, ausgeben der Rangfolge)
ja noch Baby-Krams


----------



## AlArenal (27. Jun 2006)

Ich hab damals mit Pascal und ASCII-Zeichen nen Panzer animiert.. aber nur aus Langeweile, weil ich schon lange fertig war mit dem Schulstoff. Weil ich keinen eigenen Rechner hatte, hatte ich den Code daheim aufgeschrieben... Damals..


----------



## JackTheRipper (28. Jun 2006)

Danke für eure Antworten, aber ich habe die Lösung selber gefunden!

PrintWriter scheint die bereits gesendeten Befehle zu speichern. Daher muss man diesen Speicher mit flush() zuor löschen!

Vielen Dank nochmal!

Jack

Ps.: In den Regeln steht, dass man den Beitag "abharken" soll...wo finde ich diese Funktion?


----------



## bummerland (28. Jun 2006)




----------



## Leroy42 (28. Jun 2006)

Hier, nimm die solange.






 :bae:


----------



## DP (3. Jul 2006)

JackTheRipper hat gesagt.:
			
		

> Ps.: In den Regeln steht...



ist ja sehr löblich dass die regeln überhaupt gelesen werden :lol:


----------



## lin (4. Jul 2006)

was? in den Regeln steht, dass man nen Thread abha*r*ken soll :shock: :wink:


----------



## Leroy42 (4. Jul 2006)

lin hat gesagt.:
			
		

> was? in den Regeln steht, dass man nen Thread abha*r*ken soll :shock: :wink:


Nein eben nicht! Die Admin's haben einfach nur das *r* vergessen.

Genauso wie sie das *w* in Namen des Unterforumtitels.

Für Ver*w*irrte (JavaScript-Fragen)

vergessen haben.

Aber das kann doch mal passieren; Admin's sind auch nur Menschen...
 :bae:


----------

