Controller (untested)

This commit is contained in:
Asecave
2022-01-17 09:09:47 +01:00
parent 32bbcb01e1
commit ffbbafde77
2 changed files with 295 additions and 226 deletions

View File

@@ -1,252 +1,285 @@
public class MyMail { public class MyMail {
public static final String POP3_SERVER = "127.0.0.1"; public static final String POP3_SERVER = "127.0.0.1";
public static final int POP3_PORT = 110; public static final int POP3_PORT = 110;
public static final String POP3_USER = "user1"; public static final String POP3_USER = "user1";
public static final String POP3_PASS = "user1"; public static final String POP3_PASS = "user1";
public static void main(String[] args) {
// new MyMail();
new MyMail("pop3.neugebauer.cc", 110, "informatik@neugebauer.cc", "ifq2_user1");
}
public static void main( String[] args ) { private String ip;
new MyMail();
//new MyMail("pop3.neugebauer.cc", 110, "informatik@neugebauer.cc", "ifq2_user1");
}
private String ip; private int port;
private int port; private Connection con;
private Connection con; private MyMailGUI gui;
private MyMailGUI gui; private String user;
private String user; private String password;
private String password; private String lastError;
private String lastError; /**
* Verbindet zu einem lokalen POP3-Server.
*/
public MyMail() {
this(POP3_SERVER, POP3_PORT, POP3_USER, POP3_PASS);
}
/** public MyMail(String pIP, String pUser, String pPassword) {
* Verbindet zu einem lokalen POP3-Server. this(pIP, 110, pUser, pPassword);
*/ }
public MyMail() {
this(POP3_SERVER, POP3_PORT, POP3_USER, POP3_PASS);
}
public MyMail( String pIP, String pUser, String pPassword ) { public MyMail(String pIP, int pPort, String pUser, String pPassword) {
this(pIP, 110, pUser, pPassword); ip = pIP;
} port = pPort;
user = pUser;
password = pPassword;
public MyMail( String pIP, int pPort, String pUser, String pPassword ) { // GUI erstellen und Status setzen.
ip = pIP; gui = new MyMailGUI(this);
port = pPort; gui.setStatus("App gestartet");
user = pUser;
password = pPassword; connectToServer();
login();
}
// GUI erstellen und Status setzen. /**
gui = new MyMailGUI(this); * Stellt die Verbindung zum POP3-Server her.
gui.setStatus("App gestartet"); * <p>
} * Erstellt ein {@link Connection}-Objekt für die Verbindung zum Server mit der
* IP {@link #ip} und dem Port {@link #port}. Laut RFC1939 sendet der
* POP3-Server als Erstes eine Begrüßungsnachricht zur Bestätigung der
* Verbindung:
*
* <blockquote> Once the TCP connection has been opened by a POP3 client, the
* POP3 server issues a one line greeting. This can be any positive response. An
* example might be: S: +OK POP3 server ready </blockquote>
* <p>
* Gibt es beim Verbindungsaufbau einen Fehler, gibt die Methode {@code false}
* zurück und setzt {@link #lastError} auf eine sinnvolle Fehlermeldung.
* <p>
* Das {@code Connection}-Objekt wird in {@link #con} gespeichert.
*
* @return {@code true} oder {@code false}
* @link https://datatracker.ietf.org/doc/html/rfc1939#section-4
*/
private boolean connectToServer() {
// TODO: Connection-Objekt initialisieren
con = new Connection(ip, port);
/** // Begrüssungsnachricht des Servers empfangen und prüfen
* Stellt die Verbindung zum POP3-Server her. String mes = con.receive();
* <p> if (mes == null || mes.startsWith("-ERR")) {
* Erstellt ein {@link Connection}-Objekt für die Verbindung zum Server // Keine "positive response" :-(
* mit der IP {@link #ip} und dem Port {@link #port}. Laut RFC1939 sendet // Setze einen Fehler und gib "false" zurück.
* der POP3-Server als Erstes eine Begrüßungsnachricht zur Bestätigung der lastError = "Der POP3-Server reagiert nicht!";
* Verbindung: return false;
* }
* <blockquote>
* Once the TCP connection has been opened by a POP3 client, the POP3
* server issues a one line greeting. This can be any positive
* response. An example might be:
* S: +OK POP3 server ready
* </blockquote>
* <p>
* Gibt es beim Verbindungsaufbau einen Fehler, gibt die Methode {@code false}
* zurück und setzt {@link #lastError} auf eine sinnvolle Fehlermeldung.
* <p>
* Das {@code Connection}-Objekt wird in {@link #con} gespeichert.
*
* @return {@code true} oder {@code false}
* @link https://datatracker.ietf.org/doc/html/rfc1939#section-4
*/
private boolean connectToServer() {
// TODO: Connection-Objekt initialisieren
con = null;
// Begrüssungsnachricht des Servers empfangen und prüfen // Verbindung erfolgreich
String mes = con.receive(); return true;
if( mes == null || mes.startsWith("-ERR") ) { }
// Keine "positive response" :-(
// Setze einen Fehler und gib "false" zurück.
lastError = "Der POP3-Server reagiert nicht!";
return false;
}
// Verbindung erfolgreich /**
return true; * Authentifiziert den Nutzer beim POP3-Server.
} * <p>
* Die Methode nutzt die {@code USER} / {@code PASS} Befehle zur Anmeldung mit
* dem {@link #user} und {@link #password}. Sie erwartet, dass zuvor erfolgreich
* eine Verbindung mit {@link #connectToServer()} hergestellt wurde.
* <p>
* Hat die Anmeldung Erfolg, wird {@code true} zurückgegeben. Andernfalls
* {@code false} und {@link #lastError} wird auf eine sinnvolle Fehler- meldung
* gesetzt.
*
* @return {@code true} oder {@code false}
* @link https://datatracker.ietf.org/doc/html/rfc1939#page-13
*/
private boolean login() {
String mes = ""; // Speicher für die Antworten des Servers
/** // TODO: Implementieren
* Authentifiziert den Nutzer beim POP3-Server. // USER Kommando senden und Antwort prüfen
* <p> con.send("USER " + user);
* Die Methode nutzt die {@code USER} / {@code PASS} Befehle zur mes = con.receive();
* Anmeldung mit dem {@link #user} und {@link #password}. Sie erwartet, dass if (mes == null || mes.startsWith("-ERR")) {
* zuvor erfolgreich eine Verbindung mit {@link #connectToServer()} lastError = "Ungueltiger Benutzername!";
* hergestellt wurde. return false;
* <p> }
* Hat die Anmeldung Erfolg, wird {@code true} zurückgegeben. Andernfalls // PASS Kommando senden und Antwort prüfen
* {@code false} und {@link #lastError} wird auf eine sinnvolle Fehler- con.send("PASS " + password);
* meldung gesetzt. mes = con.receive();
* if (mes == null || mes.startsWith("-ERR")) {
* @return {@code true} oder {@code false} lastError = "Ungueltiges Passwort!";
* @link https://datatracker.ietf.org/doc/html/rfc1939#page-13 return false;
*/ }
private boolean login() { // Anmeldung war erfolgreich
String mes = ""; // Speicher für die Antworten des Servers return true;
}
// TODO: Implementieren /**
// USER Kommando senden und Antwort prüfen * Ermittelt die Anzahl an Nachrichten auf dem Server.
* <p>
* Die Methode erwartet, dass zuvor erfolgreich eine Verbindung mit
* {@link #connectToServer()} hergestellt wurde und nutzt dann den {@code STAT}
* Befehl, um die Anzahl der Mails zu ermitteln.
*
* @return Die Anzahl an Mails auf dem Server
* @link https://datatracker.ietf.org/doc/html/rfc1939#page-6
*/
public int getMessageCount() {
String mes = "";
// PASS Kommando senden und Antwort prüfen // TODO: Implementieren
// Sende den STAT Befehl
// Prüfe, ob die Antwort ein Fehler ist
// Schneide den Teil zwischen den Leerzeichen aus
// Finde die Leerzeichen mit indexOf(" ")
// Ermittele den Text mit substring(von, bis)
// Wandele mit Integer.parseInt() in eine Zahl um
con.send("STAT");
mes = con.receive();
int space1 = mes.indexOf(" ");
int space2 = mes.lastIndexOf(" ", space1);
return Integer.parseInt(mes.substring(space1, space2));
// Anmeldung war erfolgreich // ---=== Alternativ ===---
return true; // return Integer.parseInt(mes.split(" ")[1]);
} }
/** /**
* Ermittelt die Anzahl an Nachrichten auf dem Server. * Ruft alle vorhandenen Mails vom Server ab und fügt sie der {@link #gui}
* <p> * hinzu.
* Die Methode erwartet, dass zuvor erfolgreich eine Verbindung mit */
* {@link #connectToServer()} hergestellt wurde und nutzt dann den public void getAllMails() {
* {@code STAT} Befehl, um die Anzahl der Mails zu ermitteln. gui.setStatus("Rufe Mails vom Server ab..");
* gui.clearAllMails(); // Gui leeren
* @return Die Anzahl an Mails auf dem Server lastError = null; // Zu Beginn gibt es noch keinen Fehler
* @link https://datatracker.ietf.org/doc/html/rfc1939#page-6
*/
public int getMessageCount() {
String mes = "";
// TODO: Implementieren // Verbindung erstellen und prüfen
// Sende den STAT Befehl boolean connected = connectToServer();
// Prüfe, ob die Antwort ein Fehler ist if (!connected) {
// Schneide den Teil zwischen den Leerzeichen aus // Letzten Fehler anzeigen (wird in connectToServer gesetzt).
// Finde die Leerzeichen mit indexOf(" ") gui.setError(lastError);
// Ermittele den Text mit substring(von, bis) return; // Abbrechen
// Wandele mit Integer.parseInt() in eine Zahl um }
return 0;
}
/** // Anmeldung durchführen und prüfen
* Ruft alle vorhandenen Mails vom Server ab und fügt sie der {@link #gui} // Hinweis: Nutze die login() Methode
* hinzu. boolean loggedIn = login();
*/ if (!loggedIn) {
public void getAllMails() { // Letzten Fehler anzeigen (wird in connectToServer gesetzt).
gui.setStatus("Rufe Mails vom Server ab.."); gui.setError(lastError);
gui.clearAllMails(); // Gui leeren return; // Abbrechen
lastError = null; // Zu Beginn gibt es noch keinen Fehler }
// Verbindung erstellen und prüfen // Anzahl Mails auf dem Server abfragen
boolean connected = connectToServer(); int mailCount = 0;
if( !connected ) {
// Letzten Fehler anzeigen (wird in connectToServer gesetzt).
gui.setError(lastError);
return; // Abbrechen
}
// Anmeldung durchführen und prüfen // Abruf der Mails nach fortlaufender Nummer
// Hinweis: Nutze die login() Methode for (int i = 1; i <= mailCount; i++) {
// Mail abrufen (nutze getMail(int))
// Mail der GUI hinzufügen (nutze gui.addMailToLost(Mail))
gui.addMailToList(getMail(i));
}
// Anzahl Mails auf dem Server abfragen // Verbindung beenden
int mailCount = 0; con.send("QUIT");
con.close();
// Abruf der Mails nach fortlaufender Nummer if (lastError != null) {
for( int i = 1; i <= mailCount; i++ ) { // Es gab einen Fehler
// Mail abrufen (nutze getMail(int)) gui.setError(lastError);
// Mail der GUI hinzufügen (nutze gui.addMailToLost(Mail)) } else {
} // Kein Fehler
gui.setStatus("Liste der Mails erfolgreich geladen.");
}
}
// Verbindung beenden /**
con.send("QUIT"); * Ruft die Mail mit der Nummer <var>pNumber</var> vom Server ab und gibt sie
con.close(); * als {@link Mail}-Objekt zurück.
* <p>
* Die Methode erwartet, dass zuvor erfolgreich eine Verbindung mit
* {@link #connectToServer()} hergestellt wurde.
* <p>
* Tritt ein Fehler auf, gibt die Methode {@code null} zurück und setzt
* {@link #lastError} auf eine sinnvolle Nachricht.
*
* @param pNumber Die Nummer einer E-Mail auf dem Server
* @return Ein Mail-Objekt oder {@code null}.
*/
public Mail getMail(int pNumber) {
String mes = ""; // Speicher für Antworten des Servers
if( lastError != null ) { // Prüfen, ob es eine Mail mit der Nummer pNumber gibt
// Es gab einen Fehler int count = getMessageCount();
gui.setError(lastError); if (pNumber > count) {
} else { lastError = "Es gibt keine Mail " + pNumber + "!";
// Kein Fehler }
gui.setStatus("Liste der Mails erfolgreich geladen.");
}
}
/** // Mail abrufen (RETR)
* Ruft die Mail mit der Nummer <var>pNumber</var> vom Server ab und con.send("RETR " + pNumber);
* gibt sie als {@link Mail}-Objekt zurück. mes = con.receive();
* <p>
* Die Methode erwartet, dass zuvor erfolgreich eine Verbindung mit
* {@link #connectToServer()} hergestellt wurde.
* <p>
* Tritt ein Fehler auf, gibt die Methode {@code null} zurück und setzt
* {@link #lastError} auf eine sinnvolle Nachricht.
*
* @param pNumber Die Nummer einer E-Mail auf dem Server
* @return Ein Mail-Objekt oder {@code null}.
*/
public Mail getMail( int pNumber ) {
String mes = ""; // Speicher für Antworten des Servers
// Prüfen, ob es eine Mail mit der Nummer pNumber gibt while (!mes.equals(".")) {
// Text der Mail parsen
// Verarbeite die Metadaten, vor allem:
// - Nummer der Mail
// - Subject
// - From
// - Date
// Wenn der Textkörper anfängt, speichere alle Zeilen in einen String
//
// Hinweis: Denke daran die Maskierung des Enzeichens "." rückgängig zu
// machen.
// Tipp: Merk dir in einem boolean, ob du im Textkörper oder im Header bist.
mes = con.receive();
System.out.println(mes);
} // end of while
// Mail abrufen (RETR) return null;
}
while( !mes.equals(".") ) { /**
// Text der Mail parsen * Löscht eine Mail vom Server.
// Verarbeite die Metadaten, vor allem: * <p>
// - Nummer der Mail * Die Methode stellt eine Verbindung zum Server her, markiert die übergebene
// - Subject * Mail als gelöscht und beendet die Verbindung.
// - From * <p>
// - Date * Tritt ein Fehler auf, bricht die Methode ab und setzt den Status der GUI auf
// Wenn der Textkörper anfängt, speichere alle Zeilen in einen String * eine sinnvolle Fehlermeldung.
// *
// Hinweis: Denke daran die Maskierung des Enzeichens "." rückgängig zu machen. * <b>Achtung</b>: Es wird die Mail mit derselben Nummer wie <var>pMail</var>
// Tipp: Merk dir in einem boolean, ob du im Textkörper oder im Header bist. * gelöscht. Es wird nicht garantiert, dass dies auch dieselbe Mail ist.
} // end of while *
* @param pMail Das Mailobjekt, das gelöscht werden soll.
* @todo Vor Löschen prüfen, ob die Mail auf dem Server dieselbe wie pMail
* ist.
*/
public void deleteMail(Mail pMail) {
// Verbindung erstellen und prüfen
return null; // Anmeldung durchführen und prüfen
}
/** // Prüfen, ob eine Mail mit der Nummer vorhanden ist
* Löscht eine Mail vom Server. // Hinweis: Die Nummer der Mail ist über pMail.getNumber() abrufbar
* <p>
* Die Methode stellt eine Verbindung zum Server her, markiert die
* übergebene Mail als gelöscht und beendet die Verbindung.
* <p>
* Tritt ein Fehler auf, bricht die Methode ab und setzt
* den Status der GUI auf eine sinnvolle Fehlermeldung.
*
* <b>Achtung</b>: Es wird die Mail mit derselben Nummer wie <var>pMail</var>
* gelöscht. Es wird nicht garantiert, dass dies auch dieselbe Mail ist.
*
* @param pMail Das Mailobjekt, das gelöscht werden soll.
* @todo Vor Löschen prüfen, ob die Mail auf dem Server dieselbe wie pMail ist.
*/
public void deleteMail( Mail pMail ) {
// Verbindung erstellen und prüfen
// Anmeldung durchführen und prüfen // Mail als gelöscht markieren
// Prüfen, ob eine Mail mit der Nummer vorhanden ist // Löschung ausführen und Verbindung beenden.
// Hinweis: Die Nummer der Mail ist über pMail.getNumber() abrufbar
// Mail als gelöscht markieren // Mail aus der GUI entfernen und neu aufbauen.s
gui.removeMailFromList(pMail);
// Löschung ausführen und Verbindung beenden. }
// Mail aus der GUI entfernen und neu aufbauen.s
gui.removeMailFromList(pMail);
}
} }

View File

@@ -1,23 +1,38 @@
#BlueJ package file #BlueJ package file
dependency1.from=MailClient dependency1.from=MyMail
dependency1.to=Connection dependency1.to=Connection
dependency1.type=UsesDependency dependency1.type=UsesDependency
editor.fx.0.height=777 dependency2.from=MyMail
editor.fx.0.width=804 dependency2.to=MyMailGUI
editor.fx.0.x=36 dependency2.type=UsesDependency
editor.fx.0.y=23 dependency3.from=MyMail
objectbench.height=101 dependency3.to=Mail
objectbench.width=776 dependency3.type=UsesDependency
dependency4.from=MyMailGUI
dependency4.to=MyMail
dependency4.type=UsesDependency
dependency5.from=MyMailGUI
dependency5.to=Mail
dependency5.type=UsesDependency
dependency6.from=MyMailGUI
dependency6.to=List
dependency6.type=UsesDependency
editor.fx.0.height=0
editor.fx.0.width=0
editor.fx.0.x=0
editor.fx.0.y=0
objectbench.height=93
objectbench.width=760
package.divider.horizontal=0.6 package.divider.horizontal=0.6
package.divider.vertical=0.8007380073800738 package.divider.vertical=0.8
package.editor.height=427 package.editor.height=393
package.editor.width=662 package.editor.width=649
package.editor.x=40 package.editor.x=40
package.editor.y=172 package.editor.y=172
package.frame.height=600 package.frame.height=600
package.frame.width=800 package.frame.width=800
package.numDependencies=1 package.numDependencies=6
package.numTargets=2 package.numTargets=5
package.showExtends=true package.showExtends=true
package.showUses=true package.showUses=true
project.charset=UTF-8 project.charset=UTF-8
@@ -27,16 +42,37 @@ readme.width=47
readme.x=10 readme.x=10
readme.y=10 readme.y=10
target1.height=50 target1.height=50
target1.name=Connection target1.name=MyMail
target1.showInterface=false target1.showInterface=false
target1.type=ClassTarget target1.type=ClassTarget
target1.width=90 target1.width=80
target1.x=350 target1.x=140
target1.y=40 target1.y=10
target2.height=50 target2.height=50
target2.name=MailClient target2.name=Mail
target2.showInterface=false target2.showInterface=false
target2.type=ClassTarget target2.type=ClassTarget
target2.width=80 target2.width=80
target2.x=110 target2.x=70
target2.y=150 target2.y=70
target3.height=50
target3.name=Connection
target3.showInterface=false
target3.type=ClassTarget
target3.width=100
target3.x=350
target3.y=40
target4.height=50
target4.name=List
target4.showInterface=false
target4.type=ClassTarget
target4.width=150
target4.x=10
target4.y=130
target5.height=50
target5.name=MyMailGUI
target5.showInterface=false
target5.type=ClassTarget
target5.width=90
target5.x=160
target5.y=70