# Mailclient erstellen



## Mabirc (11. Feb 2016)

Hallo Leute,

ich habe ein Problem im Informatikunterricht. Wir müssen einen Mailclient erstellen und kommen nicht mehr vorran.

Wir wären euch sehr dankbar, wenn ihr uns helfen könntet!

So sollte unser MailClient GUI am Ende aussehen:



Spoiler: Mailclient GUI







So ist unser Ansatz, aber es gibt viele Fehler, die wir nicht beseitigt bekommen:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 01.02.2016
  * @author
  */

public class emailsenden extends JFrame {
  // Anfang Attribute
  private TextField textField5 = new TextField();
  private TextField textField6 = new TextField();
  private Label label8 = new Label();
  private Label label9 = new Label();
  private Label label10 = new Label();
  private Label label11 = new Label();
  private Button button3 = new Button();
  private TextField textField1 = new TextField();
  private Label label2 = new Label();
  private TextField textField2 = new TextField();
  private Label label3 = new Label();
  private TextField textField3 = new TextField();
  private Label label4 = new Label();
  private Label label5 = new Label();
  private NumberField numberField2 = new NumberField();
  private Button button2 = new Button();
  private JSeparator jSeparator1 = new JSeparator();
  private TextField textField4 = new TextField();
  // Ende Attribute
  public emailsenden(String title) {
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 580;
    int frameHeight = 647;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
  
    cp.setBackground(new Color(0xB8CFE5));
    textField5.setBounds(150, 200, 390, 20);
    cp.add(textField5);
    textField6.setBounds(150, 240, 390, 20);
    cp.add(textField6);
    label8.setBounds(30, 200, 110, 21);
    label8.setText("Empfaenger");
    label8.setBackground(new Color(0xA3B8CC));
    label8.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label8.setForeground(Color.WHITE);
    cp.add(label8);
    label9.setBounds(30, 240, 110, 21);
    label9.setText("Betreff");
    label9.setBackground(new Color(0xA3B8CC));
    label9.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label9.setForeground(Color.WHITE);
    cp.add(label9);
    label10.setBounds(30, 280, 110, 21);
    label10.setText("Mailinhalt:");
    label10.setBackground(new Color(0xA3B8CC));
    label10.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label10.setForeground(Color.WHITE);
    cp.add(label10);
    label11.setBounds(213, 24, 167, 29);
    label11.setText("Neue E-Mail schreiben");
    label11.setBackground(new Color(0xA3B8CC));
    label11.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 16));
    label11.setForeground(Color.WHITE);
    cp.add(label11);
    button3.setBounds(465, 561, 75, 25);
    button3.setLabel("Senden");
    button3.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button3_ActionPerformed(evt);
      }
    });
    button3.setBackground(new Color(0xA3B8CC));
    button3.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    button3.setForeground(Color.WHITE);
    cp.add(button3);
    textField1.setBounds(152, 280, 390, 260);
    cp.add(textField1);
    label2.setBounds(24, 72, 110, 21);
    label2.setText("Benutzername");
    label2.setBackground(new Color(0xA3B8CC));
    label2.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label2.setForeground(Color.WHITE);
    cp.add(label2);
    textField2.setBounds(152, 72, 150, 20);
    textField2.setText("[EMAIL]LeonW@gsg.de[/EMAIL]");
    cp.add(textField2);
    label3.setBounds(24, 104, 110, 21);
    label3.setText("Passwort");
    label3.setBackground(new Color(0xA3B8CC));
    label3.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label3.setForeground(Color.WHITE);
    cp.add(label3);
    textField3.setBounds(152, 104, 150, 20);
    textField3.setText("geheim");
    cp.add(textField3);
    label4.setBounds(328, 72, 110, 21);
    label4.setText("Server");
    label4.setBackground(new Color(0xA3B8CC));
    label4.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label4.setForeground(Color.WHITE);
    cp.add(label4);
    label5.setBounds(328, 104, 110, 21);
    label5.setText("Port");
    label5.setBackground(new Color(0xA3B8CC));
    label5.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label5.setForeground(Color.WHITE);
    cp.add(label5);
    numberField2.setBounds(456, 104, 83, 20);
    numberField2.setText("2110");
    cp.add(numberField2);
    button2.setBounds(464, 144, 75, 25);
    button2.setLabel("Einloggen");
    button2.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        button2_ActionPerformed(evt);
      }
    });
    button2.setBackground(new Color(0xA3B8CC));
    button2.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    button2.setForeground(Color.WHITE);
    cp.add(button2);
    jSeparator1.setBounds(13, 184, 532, 2);
    cp.add(jSeparator1);
    textField4.setBounds(456, 72, 86, 20);
    textField4.setText("172.16.3.145");
    cp.add(textField4);
    // Ende Komponenten
  
    setVisible(true);
  } // end of public emailsenden
  // Anfang Methoden
  public static void main(String[] args) {
    new emailsenden("emailsenden");
  } // end of main
  public void button2_login(ActionEvent evt) {
    mail.smtp.user=getText.textField2;
    mail.smtp.password=getText.textField3;
    mail.smtp.host=getText.textField4;
    mail.smtp.port=getText.numberField2;
  
    Transport tr = session.getTransport();
    tr.connect(null, password);
    tr.sendMessage(message, message.getRecipients());
  } // end of button2_ActionPerformed
  public void button3_mailsenden(String [] args)
  {   
    String to = getText.textField5;
    String from = getText.textField2;
    String host = getText.numberField2;
    Properties properties = System.getProperties();
    properties.setProperty(getText.textField4, host);
    Session session = Session.getDefaultInstance(properties);
  
    try{
      MimeMessage message = new MimeMessage(session);
      message.setFrom(new InternetAddress(from));
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
      Transport.send(message);
      System.out.println("Nachricht erfolgreich verschickt...");
    }catch (MessagingException mex) {
      mex.printStackTrace();
    }
  }// end of button2_ActionPerformed
  // Ende Methoden
} // end of class emailsenden
```

Schon mal danke im Vorraus!

MfG
Mabirc


----------



## kneitzel (11. Feb 2016)

Was für Fehler gibt es denn genau? Wenn Ihr uns mehr Informationen gebt, dann macht ihr es uns leichter, euch zu helfen.


----------



## Joose (11. Feb 2016)

Mabirc hat gesagt.:


> So sollte unser MailClient GUI am Ende aussehen:



Wie ein Programm am Ende ausschaut sollte keine Priorität haben 
Zuerst sollte es funktionieren, danach kann man über optimales Design reden und anpassen.



Mabirc hat gesagt.:


> So ist unser Ansatz, aber es gibt viele Fehler, die wir nicht beseitigt bekommen:



Du hast uns zwar Code gegeben, aber keiner hat Lust sich zu überlegen welche Fehler du alle meinst.
Wenn ich mir den Code so anschaue sehe ich zwar einige aber es wäre besser von dir zu erfahren wo du Probleme hast 

Zu deinem Code:

```
public class emailsenden extends JFrame {
```
Eine Klasse ist der Bauplan für ein Objekt. Eine Name für eine Klasse sollte als ein Hauptwort sein keine Tätigkeit.
Eine Klasse kann Methoden haben, Methoden beschreiben was getan werden soll (Tätigkeit).
"emailsenden" klingt nach einer Tätigkeit und ist daher als Klassenname ungeeignet. Außerdem sollten Klassennamen in "UpperCamelCase" geschrieben werden, alles andere (außer Konstanten) in "lowerCamelCase".

Auch sollte man nicht von JFrame ableiten. Erklärung findest du hier: java - Why shouldn't you extend JFrame and other components? - Stack Overflow


```
private TextField textField5 = new TextField();
  private TextField textField6 = new TextField();
  private Label label8 = new Label();
  private Label label9 = new Label();
  private Label label10 = new Label();
```

Benenne deine Attribute mit einem sprechenden Namen, damit du anhand des Namen schon erkennen kannst um was es sich handelt. Wenn du dir den Code in mehreren Monaten wieder mal anschauen würdest, sollte es ohne Probleme möglich sein zu erkennen ob "textField5" nun für dem Empfänger oder den Betreff gedacht ist. So wie es aktuell benannt ist muss ich erst im Code suchen wo wird des Textfield verwendet und welches Label steht laut Layout davor.


```
cp.setLayout(null);
```
"null"-Layout sollte man nicht verwenden. Einerseits muss man sich um die Positionierung der UI Komponenten selber kümmern (mehr Schreibarbeit), andererseits kann man die Fenstergröße zwar ändern die UI Komponenten bleiben aber immer gleich.


```
label8.setBackground(new Color(0xA3B8CC));
    label8.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label8.setForeground(Color.WHITE);
.....
    label9.setBackground(new Color(0xA3B8CC));
    label9.setFont(new Font("@Kozuka Gothic Pro B", Font.BOLD, 12));
    label9.setForeground(Color.WHITE);
```
Du wiederholst sehr oft den gleichen Code. Wenn du nun die Schriftart, -größe oder -farbe ändern willst musst du das X mal anpassen.
Doppelten Code sollte man durch Methoden vermeiden, dadurch sollte man nur eine Stelle haben die anzupassen wäre.


```
button3_ActionPerformed(evt);
```
Wie schon oben: Verwende sprechende Namen!
Woher soll jemand auf den 1.Blick wissen was beim Buttonklick gemacht wird?
Wird die E-Mail abgeschickt? Wird das Formular geleert? Soll ein Anhang hinzugefügt werden?
Abgesehen davon sehe ich die Methode "button3_ActionPerformed" in deinen Code gar nicht.


```
public void button2_login(ActionEvent evt) {
    mail.smtp.user=getText.textField2;
    mail.smtp.password=getText.textField3;
    mail.smtp.host=getText.textField4;
    mail.smtp.port=getText.numberField2;
 
    Transport tr = session.getTransport();
    tr.connect(null, password);
    tr.sendMessage(message, message.getRecipients());
  } // end of button2_ActionPerformed
```

Vermeide "_" in Variablen-, Methoden und Klassennamen. Einzig bei Konstanten sollte man sie, wenn überhaupt, verwenden.
Ansonsten ist mir nicht klar was hier passieren soll. 
"getText.textField2" -> so wie der Code da steht heißt es, es sollte eine Variable "getText" geben welche auf ein Objekt verweist. Diese Objekt hat ein Attribut "textField2".
Willst du nicht eher den Text vom "textField2" auslesen? Dann solltest du die Methode "getText" vom textfield2 Objekt aufrufen


----------



## Dompteur (11. Feb 2016)

Eigentlich sollte der Code gar nicht kompiliert.
Beispielsweise verwendest du in der Methode "button2_login" eine nirgends deklarierte Variable namens session.
Dann werden Methoden aufgerufen, die du nirgends implementiert hast, usw.

Deine IDE oder dein Compiler müssten dir da jede Menge Fehler anzeigen.
Die musst du einen nach dem anderen durchgehen und beheben. Wenn du da etwas nicht verstehst, dann komm wieder zurück und zeig uns die entsprechende Meldung.


----------



## RalleYTN (14. Feb 2016)

Damit könnt ihr den Code noch ein bisschen vereinfachen und besser Wartbar machen:


----------

