Hilfe bei Programmierung von einfachem Mailprogramm + GUI

Status
Nicht offen für weitere Antworten.

Shanusch

Mitglied
Hallo,

ich muss morgen ein Programm fertig haben, wobei ich nicht weiterkomme. ICh habe ein Mailprogramm geschrieben und eine gui dazu. Leider bin ich nicht sehr gut in der Programmierung und benötige daher Hilfe.

1) Die GUI funktioniert nicht richtig - implementierung vom senden bzw. empfangen von mails klappt nicht
2) Adressen von Absendern abspeichern können, bzw. verwenden können - kann mir jemand helfen?

ICh würde mich freuen, wenn ihr einem hilfslosen Programmierer helfen könntet - ich komme hier einfach nicht weiter.

Code:
import java.net.*;
import java.io.*;
import java.util.Date;
import java.util.*;
import java.text.*;

public class MailSenden
{
  private DataOutputStream zOutput  = null;
  private BufferedReader   zInput  = null;
  private String           zText = "";
  
 
 

        int lPort = 110;//Standard-Port fuer die POP3-Kommunikation
        String lHost = "pop.gmx.de";//Mailserver-Name
        String lUser = "infolk@gmx.de"; // aW5mb2xrQGdteC5kZQ==
        String lPass = "hammersen";//persoenliches Kennwort beim Provider // aGFtbWVyc2Vu
 
  private final void writeRead( boolean pAnwort,String pAnfangNachricht,String pText )   // private Status!
  throws IOException, Exception
  {
    if( null != pText && 0 < pText.length() )
    {
      zText +=  ("> " + pText);
      zOutput.writeBytes( pText );
    }
    if( pAnwort )
    {
      String read = zInput.readLine() + "\n";
      zText +=  ("<" + read);
      if( null != pAnfangNachricht && 0 < pAnfangNachricht.length() && !read.startsWith( pAnfangNachricht ) )
        throw new Exception( zText );
    }
    
  }
  
  
  //
  /// Public Methode und  darf nur von einem Thread zur Zeit ausgeführt werden kann
   public synchronized final String sendEmail(String sSmtpServer,
                                              String sFromAdr, String sFromRealName,
                                              String sToAdr,   String sToRealName,
                                              String sSubject, String sText )
   
                                              
  throws IOException, Exception
  {
    zText = "";
    if( null == sSmtpServer  || 0 >= sSmtpServer.length() ||
        null == sFromAdr     || 0 >= sFromAdr.length()    ||
        null == sToAdr       || 0 >= sToAdr.length()      ||
        (  (null == sSubject || 0 >= sSubject.length())
        && (null == sText    || 0 >= sText.length())  )   )
      throw new Exception( "Invalid Parameters" );
    if( null == sFromRealName || 0 >= sFromRealName.length() )  sFromRealName = sFromAdr;
    if( null == sToRealName   || 0 >= sToRealName.length() )    sToRealName   = sToAdr;
    Socket lSocket = new Socket( sSmtpServer, 25 );
    zOutput =        new DataOutputStream( lSocket.getOutputStream() );
    zInput =        new BufferedReader(new InputStreamReader( lSocket.getInputStream() ) );
    lSocket.setSoTimeout( 10000 );
    
    // DATUM

    Date dt = new Date();
    // Festlegung des Formats:
    SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd" );
    df.setTimeZone( TimeZone.getDefault() );                  // nicht mehr unbedingt notwendig seit JDK 1.2
    // Formatierung zu String:
    System.out.println( "Date = " + df.format( dt ) );        // z.B. '2001-01-26 19:03:56.731'
//     // Ausgabe für andere Zeitzone:
//     df.setTimeZone( TimeZone.getTimeZone( "Africa/Casablanca" ) );
//     System.out.println( "Casablanca = " + df.format( dt ) );  // z.B. '2001-01-26 18:03:56.731'
//     // Einlesen vom String:
//     dt = df.parse( "2001-02-03 04:05:06.7" );
//     System.out.println( "parse = " + df.format( dt ) );       // z.B. '2001-02-03 04:05:06.7'
    
    writeRead( true, "220", null);
    writeRead( true, "250", "HELO " + sSmtpServer + "\n" );
    writeRead( true, "250", "RSET\n" );
    
    // Authorisierung, 
    writeRead( true, "334", "AUTH LOGIN\n" );
    writeRead( true, "334", "aW5mb2xrQGdteC5kZQ==\n" ); //-- base-64-encoding fuer [email]infolk@gmx.de[/email]
    writeRead( true, "235", "aGFtbWVyc2Vu\n" ); //-- base-64-encoding fuer aGFtbWVyc2Vu
    
    writeRead( true, "250", "MAIL FROM:<" + sFromAdr + ">\n" );
    writeRead( true, "250", "RCPT TO:<" + sToAdr + ">\n" );
    writeRead( true, "354", "DATA\n" );
    writeRead( false, null, "To: " + sToRealName + " <" + sToAdr + ">\n" );
    writeRead( false, null, "From: " + sFromRealName + " <" + sFromAdr + ">\n" );
    writeRead( false, null, "Subject: " + sSubject + "\n" );
//     writeRead( false, null, "Date: " + lDate + "\n" );
    writeRead( false, null, "Mime-Version: 1.0\n" );
    writeRead( false, null, "Content-Type: text/plain; charset=\"iso-8859-1\"\n" );
    writeRead( false, null, "Content-Transfer-Encoding: quoted-printable\n\n" );
    writeRead( false, null, sText + "\n" );
    // .\n schließt authorierung.. ab
    writeRead( true, "250", ".\n" );
    writeRead( true, "221", "QUIT\n" );
    zInput.close();
    zOutput.close();
    lSocket.close();
    zInput = null;
    zOutput = null;
    return zText;
  }
  // HINWEIS für mich selbst! -----------------------------------------------------------------
  //throws IOException, Exception ist nicht besonders sinnvoll, throws Exception hätte auch gereicht,
  //da IOExcepion von Exception abgeleitet ist.
  //Wenn man an einer Methode so einen "throws-clause" angbibt, dann muss man die entsprechenden Exceptions
  //in der Methode nicht selbst abfangen; dafür muss das da passieren, wo diese Methode aufgerufen wird.


  public static void main( String[] args )
  {
    System.out.println("\nSmtpSimple.java. Send simple email.\nUsage:\n" +
                       "  java SmtpSimple SmtpServer FromAdr FromRealName ToAdr ToRealName Subject Text\n" +
                       "Example:\n" +
                       "  java SmtpSimple mail.gmx.net [email]Torsten.Horn@gmx.de[/email] \"Torsten Horn\" x@y.z xyz S T\n" );
    if( null == args || 6 > args.length )
    {
      System.out.println( "Error: parameters missing!" );
      System.exit( 1 );
    }
    try
    {
      MailSenden smtp = new MailSenden();
      System.out.println( smtp.sendEmail( args[0], args[1], args[2], args[3], args[4], args[5],
                                          ( 6 < args.length ) ? args[6] : null ) );
    }
    catch( Exception ex )
    {
      System.out.println( "\n***\nError:\n" + ex + "\n***\n");
      System.exit( 2 );
    }
    System.exit( 0 );
  }
}


Code:
import java.net.*;
import java.io.*;

public class Pop3Client//holt Mails vom Mail-Server ab
{      
    public String holeMails()
    {
        int lPort = 110;//Standard-Port fuer die POP3-Kommunikation
        String lHost = "pop.gmx.de";//Mailserver-Name
        String lUser = "infolk@gmx.de";
        String lPass = "hammersen";//persoenliches Kennwort beim Provider
        String lAntwortzeile;
        String Mail="";
        try
        {
            Socket lMailSocket = new Socket(lHost, lPort);
            DataOutputStream lOutput = new DataOutputStream(lMailSocket.getOutputStream());
            BufferedReader lInput = new BufferedReader(new InputStreamReader(lMailSocket.getInputStream()));
            lOutput.writeBytes("user " + lUser + "\n");
            lOutput.writeBytes("pass " + lPass + "\n");
            lOutput.writeBytes("stat\n");//liefert die Mailanzahl
           
            for(int i=1;i<=3;i++)
             {String zahl =("" + i);
            lOutput.writeBytes("retr"+2+"\n"); //die Zahl nach retr gibt die Nummer der gewünschten Mail an
            //lOutput.writeBytes("retr 2\n");//auch mehrere Aufrufe hintereinander moeglich
            //lOutput.writeBytes("list\n");//gibt eine Mailliste zurueck, es kann auch eine Zahl angegeben werden, wenn lediglich die Info zur n-ten Mail von Interesse ist
            //lOutput.writeBytes("dele x\n");//loescht die x-te Mail im Postfach
             }
            lOutput.writeBytes( "QUIT\n" );//beendet die Verbindung zum Mailserver

            while ((lAntwortzeile = lInput.readLine()) != null)//Server-Antworten zeilenweise lesen ...
            {
                Mail=(Mail + lAntwortzeile + "\n");
            }
            lOutput.close();
            lMailSocket.close();
        }
        catch( Exception e ) { System.err.println( e ); }
        return Mail;
    }
}

Code:
import java.io.*;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.ListModel;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class Mailer {
private MailSenden smtp;
private Pop3Client pop3;

  class Mail {
    private String from;
    private String to;
    private String subject;
    private String text;

    public Mail( String from, String to, String subject, String text) {
      this.from = from;
      this.to = to;
      this.subject = subject;
      this.text = text;
    }
  }

  class MainWnd extends JFrame implements ActionListener, ListSelectionListener {

    Mailer mailer;
    JButton btnSend;
    JButton btnReceive;
    JList lstIn;
    JList lstOut;
    JLabel laStatus;

    JLabel laFrom;
    JLabel laTo;
    JLabel laSubj;
    JTextArea laText;

    public MainWnd( Mailer mailer) {

      super( "Mailer");

      this.mailer = mailer;

      JPanel p0 = new JPanel();
      p0.setLayout( new BorderLayout());

      JPanel p1 = new JPanel();
      p1.setLayout( new GridLayout( 1, 2));


      JPanel p2 = new JPanel();
      p2.setLayout( new BorderLayout());

      JPanel p21 = new JPanel();
      p21.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED));
      p21.setLayout( new GridLayout( 2, 1));

      JPanel p211 = new JPanel();
      p211.setLayout( new BorderLayout());
      lstIn = new JList( createListModel( inbox));
      lstIn.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED));
      lstIn.addListSelectionListener( this);
      p211.add( new JLabel( "Inbox"), BorderLayout.NORTH);
      p211.add( lstIn, BorderLayout.CENTER);
      p21.add( p211);

      JPanel p221 = new JPanel();
      p221.setLayout( new BorderLayout());
      lstOut = new JList( createListModel( outbox));
      lstOut.setBorder( BorderFactory.createBevelBorder( BevelBorder.LOWERED));
      lstOut.addListSelectionListener( this);
      p221.add( new JLabel( "Outbox"), BorderLayout.NORTH);
      p221.add( lstOut);
      p21.add( p221);

      p2.add( p21, BorderLayout.CENTER);

      JPanel p22 = new JPanel();
      p22.setLayout( new FlowLayout());
      btnSend = new JButton( "Send Mail");
      btnSend.addActionListener( this);
      p22.add( btnSend);

      btnReceive = new JButton( "Receive Mails");
      btnReceive.addActionListener( this);
      p22.add( btnReceive);
      p2.add( p22, BorderLayout.SOUTH);

      p1.add( p2);

      JPanel p3 = new JPanel();
      p3.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED));
      p3.setLayout(new BorderLayout());

      JPanel p31 = new JPanel();
      p31.setLayout( new BorderLayout());

      JPanel p311 = new JPanel();
      p311.setLayout( new GridLayout( 3, 1));
      p311.add( new JLabel( "From:"));
      p311.add( new JLabel( "To:"));
      p311.add( new JLabel( "Subj:"));
      p31.add( p311, BorderLayout.NORTH);
      p31.add( new JLabel( "Text"), BorderLayout.CENTER);

      JPanel p32 = new JPanel();
      p32.setLayout( new BorderLayout());

      JPanel p321 = new JPanel();
      p321.setLayout(new GridLayout( 3, 1));
      laFrom = new JLabel( "<From>");
      p321.add( laFrom);
      laTo = new JLabel( "<To");
      p321.add( laTo);
      laSubj = new JLabel( "<Subj>");
      p321.add( laSubj);
      p32.add( p321, BorderLayout.NORTH);
      laText = new JTextArea( "<Text>");
      laText.setEditable( false);
      laText.setBackground( getBackground());
      laText.setLineWrap( true);
      laText.setWrapStyleWord( true);
      p32.add( laText, BorderLayout.CENTER);

      p3.add( p31, BorderLayout.WEST);
      p3.add( p32, BorderLayout.CENTER);

      p1.add( p3);

      p0.add( p1, BorderLayout.CENTER);


      laStatus = new JLabel( "<status>");
      laStatus.setBorder( BorderFactory.createBevelBorder( BevelBorder.RAISED));
      p0.add( laStatus, BorderLayout.SOUTH);

      add( p0);
      setSize( 600, 500);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setVisible(true);
    }

    public void valueChanged( ListSelectionEvent e) {
      if ( e.getSource() == lstIn) {
        int idx = lstIn.getSelectedIndex();
        if ( idx >= 0) {
          select( inbox.get( idx));
          lstOut.clearSelection();
        }
      } else if ( e.getSource() == lstOut) {
        int idx = lstOut.getSelectedIndex();
        if ( idx >= 0) {
          select( outbox.get( idx));
          lstIn.clearSelection();
        }
      }

    }

    private void select( Mail m) {
      laFrom.setText( m.from);
      laTo.setText(   m.to);
      laSubj.setText( m.subject);
      laText.setText( m.text);
    }

    public void setStatus( String txt) {
      laStatus.setText( txt);
    }

    public void actionPerformed( ActionEvent e) {

      if ( e.getSource() == btnSend) {

        String from = "infolk@web.de";
        String to = JOptionPane.showInputDialog( this, "To:", "Empfänger-Adresse", 3);
        if ( to == null) return; //--- abbruch

        String subject = JOptionPane.showInputDialog( this, "Subject:", "Betreff eingeben", 3);
        if ( subject == null) return; //--- abbruch

        String text = JOptionPane.showInputDialog( this, "Text:", "Geben Sie Ihren Text ein", 3);
        if ( text == null) return; //--- abbruch

        Mail m = new Mail( from, to, subject, text);

        smtp = new MailSenden();
        try {
    smtp.sendEmail("mail.gmx.de", m.from, "Sebastian Hanusch",m.to,"Herr Mustermann",m.subject, m.text);
} catch (IOException e1) {
  e1.printStackTrace();
} catch (Exception e2) {
  e2.printStackTrace();}




        addOut( m);



      } else if ( e.getSource() == btnReceive) {

        List<Mail> newMails = null;

        pop3 = new Pop3Client();
        String Mails = pop3.holeMails();

        while (Mails != null)
        {

        }

        //nochn testdummy - klappt also noch nicht gaaanz!
        newMails = new ArrayList();
        newMails.add( new Mail( "Abesender@mail.com", "Sebastian Hanusch", "Text", "Teeeext"));



        for ( int i=0; i<newMails.size(); i++) {
          addIn( newMails.get( i));
        }
      }

    }

    public void addIn( Mail m) {
      inbox.add( m);
      lstIn.setModel( createListModel( inbox));
      lstIn.setSelectedIndex( inbox.size()-1);
    }

    public void addOut( Mail m) {
      outbox.add( m);
      lstOut.setModel( createListModel( outbox));
      lstOut.setSelectedIndex( outbox.size()-1);
    }
  }

  private MainWnd mainWnd;
  private List<Mail> inbox = new ArrayList<Mail>();
  private List<Mail> outbox = new ArrayList<Mail>();

  public Mailer() {
    mainWnd = new MainWnd( this);

    //--- dummies  Hier wird dann alles der GUI hinzugefügt!
    inbox.add( new Mail( "sender1@somewhere.de", "me@somewhere.de", "xyz", "Das ist das Haus vom Nikolaus"));
    inbox.add( new Mail( "sender2@somewhere.de", "me@somewhere.de", "abc", "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores"));
    inbox.add( new Mail( "sender3@somewhere.de", "me@somewhere.de", "RE: abc", "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi."));
    inbox.add( new Mail( "sender4@somewhere.de", "me@somewhere.de", "AW: RE: abc", "Das ist das Haus vom Nikolaus"));

    outbox.add( new Mail( "me@somewhere.de", "receiver1@somewhere.de", "Oxyz", "Das ist das Haus vom Nikolaus"));
    outbox.add( new Mail( "me@somewhere.de", "receiver2@somewhere.de", "abc", "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores"));
    outbox.add( new Mail( "me@somewhere.de", "receiver3@somewhere.de", "RE: abc", "Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi."));
    outbox.add( new Mail( "me@somewhere.de", "receiver4@somewhere.de", "AW: RE: abc", "Das ist das Haus vom Nikolaus"));

    mainWnd.setStatus( "");

  }
  public static void main(String[] args) {
    new Mailer();

  }

  private static ListModel createListModel( final List<Mail> lst) {

    return new ListModel() {

      public int getSize() {
        return lst.size();
      }

      public Object getElementAt(int index) {
        if (index < 0) return null;
        return ((Mail)(lst.get( index))).subject;
      }

      public void addListDataListener(ListDataListener l) {
      }

      public void removeListDataListener(ListDataListener l) {
      }

    };

  }

}

Vielen lieben Dank für die Hilfe!
 
hi, ich hab mir nicht alles durchgelesen.

aber sowas gehört in ein anderes forum.

und bitte kürz den text so, dass man nicht immer scrollen muss, um ne antwort zu erstellen.

das schreckt tierisch ungemein und ungewollt (davon geh ich mal aus) ab.
 
bräuchte die Hilfe aber wirklich dringend leute.

folgender Compiler-Fehler tritt auf aber warum das?
Code:
Compiliere F:\Schule\Info\Projekte\Mailprogramm\Mailer.java mit Java-Compiler
Mailer.java:220:15: cannot find symbol
symbol  : variable Mail
location: class Mailer.MainWnd
        while(Mail == Null)       // Hier jetzt Zeilenweise auslesen(Absender, Empfänger, Betreff, Text)
              ^
Mailer.java:220:23: cannot find symbol
symbol  : variable Null
location: class Mailer.MainWnd
        while(Mail == Null)       // Hier jetzt Zeilenweise auslesen(Absender, Empfänger, Betreff, Text)
                      ^
2 errors
[/code]
 
Code:
String Mails = pop3.holeMails(); 
        
        while(Mail == Null)       // Hier jetzt Zeilenweise auslesen(Absender, Empfänger, Betreff, Text) 
                                  // aber wie? 
        { 

        }

Nun ja, du hast in dem Codestück ja auch nur einen String Mails,
die weiter oben deklarierte Variable Mail ist nur lokal in einem
Block definiert.

Außerdem muß es heißen :
Code:
while (Mail != null)
null kleingeschrieben...
 
Hallo Leroy,

danke, habe den Fehler behoben, nun aber weiterer Fehler:
Code:
Compiliere F:\Schule\Info\Projekte\Mailprogramm\Mailer.java mit Java-Compiler
Mailer.java:205:23: unreported exception java.io.IOException; must be caught or declared to be thrown
        smtp.sendEmail("mail.gmx.de", m.from, "Sebastian Hanusch",m.to,"Herr Mustermann",m.subject, m.text);
                      ^
Note: Mailer.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
 
smtp.sendEmail() kann eine IOException werfen, also:

Code:
try {
    smtp.sendEmail(...);  
    ...
} catch (IOException e) {
    System.err.println(e);
}
 
Code:
Mailer.java:207:21: cannot find symbol
symbol  : class IOException
location: class Mailer.MainWnd
           } catch (IOException d)

musste variable auf d setzen, da e schon im actionperformed benutzt wird.[/quote]
 
Ich dösel, wie konnte ich das nur vergessen?

Code:
Compiliere F:\Schule\Info\Projekte\Mailprogramm\Mailer.java mit Java-Compiler
Mailer.java:209:23: unreported exception java.lang.Exception; must be caught or declared to be thrown
smtp.sendEmail("mail.gmx.de", m.from, "Sebastian Hanusch",m.to,"Herr Mustermann",m.subject, m.text);
                      ^
Note: Mailer.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

Hm?
 
Mach noch ein catch zu dem schon vorhandenen (IOException) dazu.
Code:
try { 
    smtp.sendEmail("mail.gmx.de", m.from, "Sebastian Hanusch",m.to,"Herr Mustermann",m.subject, m.text);
} catch (IOException e) { 
  e.printStackTrace();
} catch (Exception e2) { 
  e2.printStackTrace();
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben