Wie würdet ihr das machen?

Status
Nicht offen für weitere Antworten.

Bodo1981

Mitglied
Habe mir eine graphische Oberfläche (Swing) gebastelt. Sie sieht ungefähr so aus:

screen6si.png


Kurze Erklärung zum Programm: Also das Programm soll beim klicken auf den "E-Mails empfangen"-Button die E-Mails von meinem Server abholen (das funktioniert auch schon soweit). Danach sollen alle empfangenen E-Mails (nur mit dem Titel des Betreffs) in der linken JTextArea angezeigt werden. Dort will ich dann, das man einzelne E-Mails (z.b per JRadioButton....) auswählen kann. Klickt man dann auf hinzuüfgen, so sollen alle ausgewählten E-Mails in der rechten JTextArea angezeigt werden. Wenn man dann auf Start klickt, werden die ausgewählten E-Mails nach InternetLinks durchsucht und im Abstand von 1 Min. sollen die einzelnen Internetseiten im Standardbrowser aufgerufen werden.

So jetzt zu meiner Fragen:

Wie soll ich die linke und rechte JTextArea formatieren (z.b JTable oder so) damit ich alles E-Mails angezeigt bekomme und wie gesagt eben auch einzelne E-Mails auswählen kann?

Mein bisheriger Quellcode:
Code:
import javax.swing.*;
import java.net.*;
import java.util.Properties;
import java.awt.*;
import javax.mail.*;
import javax.activation.*;
import javax.imageio.*;
import java.awt.image.*;
import layout.TableLayout;
import java.awt.event.*;

public class E_Mail extends JFrame{
	
	private JLabel titel, email, testemail;
	private JPanel titelleiste, center, south, west, east;
	private JTextArea westT, eastT;
	private JButton hinzu, entf, empf, aufr;
	
	/** Konstruktor */
	public E_Mail(String name){
		super(name);

		this.setIconImage(loadImage("images/email.gif"));		// erstellt ein Icon für das Fenster
		this.setSize(900, 600);							      // definiert die Größe des Fensters
		this.setLayout(new BorderLayout(10, 10));			    // defienert das Layout des JFRames
		
		// Gestaltung des NORTH-FELDES
		titelleiste = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
		titel = new JLabel("AUTOMATISCHES ABRUFEN VON INTERNETSEITEN!!!");
		titel.setFont(new Font("Arial", Font.BOLD, 20));
		titelleiste.add(titel);
		
		// Gestaltung des WEST-FELDES
		double[][] sizeW = {{10, TableLayout.FILL}, {20, 10, TableLayout.FILL}};
		west = new JPanel(new TableLayout(sizeW));
		email = new JLabel("Empfangene E-Mails");
		westT = new JTextArea(40, 30);
		west.add(westT, "1, 2, C, C");
		west.add(email, "1, 0, C, C");
		
		// Gestaltung des CENTER-FELDES
		double[][] size = {{TableLayout.FILL}, { TableLayout.FILL, 30, TableLayout.FILL}};
		center = new JPanel(new TableLayout(size));
		hinzu = new JButton ("Hinzufügen -->");
		hinzu.addActionListener(new Action());
		entf = new JButton (" <--  Entfernen ");
		entf.addActionListener(new Action());
		center.add(hinzu, "0, 0, C, B");
		center.add(entf, "0, 2, C, T");
		
		// Gestaltung des EAST-FELDES
		double[][] sizeE = {{TableLayout.FILL, 10}, {20, 10, TableLayout.FILL}};
		east = new JPanel(new TableLayout(sizeE));
		testemail = new JLabel("Zu überprüfende E-Mails");
		eastT = new JTextArea(40, 30);
		east.add(eastT, "0, 2, C, C");
		east.add(testemail, "0, 0, C, C");
		
		// Gestaltung des SOUTH-FELDES
		south = new JPanel(new FlowLayout(FlowLayout.CENTER, 80, 10));
		empf = new JButton("E-Mails empfangen");
		empf.addActionListener(new Action());
		aufr = new JButton ("           Start           ");
		south.add(empf);
		south.add(aufr);
		
		// In aktuellen JFrame einbinden
		this.add(center, BorderLayout.CENTER);
		this.add(titelleiste, BorderLayout.NORTH);
		this.add(west, BorderLayout.WEST);
		this.add(east, BorderLayout.EAST);
		this.add(south, BorderLayout.SOUTH);
		
		// Beenden
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	// Methode um Bilder einlesen zu können
	public BufferedImage loadImage(String name){
		URL url = null;
		try{
			url = getClass().getClassLoader().getResource(name);
			return ImageIO.read(url);
		} catch (Exception e){
			System.out.println ("Kann die Datei " + url + " nicht öffnen");
			System.exit(0);
		}
		return null;
	}
	
	// Methode um E-Mails zu empfangen
	public void getMails() throws Exception{
		String host = ...;
		String username = ...;
		String password = ...;

		// Create empty properties
		Properties props = new Properties();

		// Get session
		Session session = Session.getDefaultInstance(props, null);

		// Get the store
		Store store = session.getStore("pop3");
		store.connect(host, username, password);

		// Get folder
		Folder folder = store.getFolder("INBOX");
		folder.open(Folder.READ_ONLY);

		// Get directory
		Message message[] = folder.getMessages();

		for (int i=0, n=message.length; i<n; i++) {
			westT.setText((i + ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject()));
		}

		// Verbindung beenden 
		folder.close(false);
		store.close();
		}
	
	public static void main(String[] args){
		E_Mail email = new E_Mail("Automatische E-Mail Beantwortung");
		
		email.setVisible(true);
	}
	
	class Action implements ActionListener{
		public void actionPerformed(ActionEvent e){
			actions(e);
		}
		
		public void actions(ActionEvent e){
			if (e.getActionCommand() == hinzu.getText()){
				eastT.setText(westT.getText());
			}
			if (e.getActionCommand() == entf.getText()){
				eastT.setText("");
			}
			if (e.getActionCommand() == empf.getText()){
				try{
					getMails();
				} catch (Exception a){
					System.out.println(a.getCause());
				}
			}
		}
	}
}

PS: Bin auch sonst über jede Verbesserung und Vorschläge für das Programm dankbar!!

MFG Christian
 
Bodo1981 hat gesagt.:
...Wie soll ich die linke und rechte JTextArea formatieren (z.b JTable oder so)
damit ich alles E-Mails angezeigt bekomme und wie gesagt eben auch einzelne E-Mails auswählen kann?...
JList mit JScrollPane und MULTIPLE_INTERVAL_SELECTION:
Code:
...
        jList1 = new JList();
        jScrollPane1 = new JScrollPane();
        jList1.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        DefaultListModel listModel = new DefaultListModel();
        for (int i = 0; i < betreffListe.length; i++) {
            listModel.addElement(betreffListe[i]);
        }
        jList1.setModel(listModel);
        jScrollPane1.setViewportView(jList1);
...
        Object[] values = jList1.getSelectedValues();
        for (int i = 0; i < values.length; i++) {
            String betreff = values[i].toString();
            //TODO: betreff zu der 2. JList hinzufügen
        }
...
    private JList jList1;
    private JScrollPane jScrollPane1;
 
Danke dir für die schnelle Hilfe. Hat alles soweit ganz gut geklappt. Nun hab ich aber noch ein Problem.
Die E-Mails werden alle perfekt aufgelistet und wenn ich ein paar auswähle, dann erscheinen sie auch im rechten Feld.

Kann mir jetzt noch bitte einer sagen, wie ich aus dem Text einer E-Mail alle "INTERNETLINKS" (sprich alle http://.....) herausfinden kann? Das Programm soll nämlich alle Internetlinks aus den E-Mails herauslesen und dann mit dem Standardbrowser aufrufen? Gibt es da einen speziellen Befehl in der Mail-API damit ich die Links auslesen kann? Wäre euch super dankbar, wenn ihr mir da weiterhelfen könnt.

MFG Christian
 
Hi,

hole den Body mit der getBody() Methoden. Aus diesem Body dann mit split() und einem regulären Ausdrucj die Links extrahieren.

[EDIT]Es gibt auch die Scanner-Klasse, die hat eine next() Mehtoden. Es könnten ja auch mehrere Links in einer Mail sein und damit wirds einfacher.[/EDIT]

Hoffe es hilft,

Caffè Latte
 
Danke dir, könntest du mir bitte ein Code-Beispiel geben? Ich weis nämlich ehrlich gesagt nicht genau was du mit dem regilärem Ausrduck meinst. Wär echt super!
 
also, es gibt ja zwei Typen von Emails:

in html und als Text

Im text bleibt dir nix anderes uebrig als nacht http oder www zu suchen.

in html suchst du einfach nach dem entsprechendem Tag (href ist das glaub ich...).

Noch etwas:

Ich waere vorsichtig wenn du einfach wahrlos links oeffnest, bei Newslettern ist naemlich auch oft was drin, was diesen abbestellt, im generellen ist nur der erste Link wichtig. Auch bei Forenbenachrichtigungen ist das so.

Wenn es fertig ist, bestelle ich schonmal eine Testversion bitte, das Programm hoert sich praktisch an;-)
 
Hi,

erstmal zu den regulären Ausdrücken: wenn du Englisch kannst, dann lies das mal: http://java.sun.com/docs/books/tutorial//extra/regex/index.html
Bei regulären Ausdrücken handelt es sich um Suchmuster, die du z.B. auf Strings anwenden kannst, um zu prüfen, ob beispielsweise eine eingegebene Mailadresse formal gültig ist. Ebenfalls kann man damit Textteile aus einem größeren Text extrahieren.

Bevor ich mal was zusammencode: du suchst im Mailbody nach was genau? Weblinks oder auch FTP- und Maillinks? Sind das richtige URLs oder irgendwas, was der Absender da reingeschrieben hatte (z.B. "guggst du hier: foo.com/bar.html")?

Caffè Latte
 
Ich suche nach richtigen Internetlinks, die folgendermaßen aussehen:

z.B.
http://www.mazuge.de/erhalten.php?u=3756&m=2911
http://www.cdjfhdsjfh.de/.dewd2762781
http://irgendwas.dekfdewkhrdiwe/ewhrfiuwe

Die E-Mail Bodys sollen nach solchen Links durchsucht werden und die gefundenen Links
sollen dann in einem extra JFrame angezeigt werden. Dort befindet sich dann ein Button, wenn
man diesen drückt, dann sollen die Links mit dem Standardbrowser aufgerufen werden, wobei
jede Minute ein neuer Link im gleichen Browserfenster aufgerufen werden soll.

Danke dir schonmal voraus für die Mühe die du dir machst.
 
Hi,

ich hab mal schnell was zusammengeschustert, allerdings ist der regex alles andere als perfekt (es wird das ausgwertet zwischen http(s) bzw ftp bis zum ersten darauffolgenden Leerzeichen. Zu mehr habe ich jetzt keine Lust mehr 😉

Code:
import java.util.Vector;
import java.util.regex.*;

public class LinkExtract {
    
    public static final String REGEX = "(http[s]?|ftp)://.+? )";
    
    public static Vector<String> getLinks(String input) {
        Pattern p = Pattern.compile(REGEX, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(input);
        Vector<String> items = new Vector<String>();
        while (m.find()) {
            items.addElement(m.group());
        }
        return items;
    }
    
    public static void main(String[] argv) {
        String mail = "Hallo!" +
                "Du erhältst diese E-Mail, weil du über Antworten im Thema " +
                "\"java-forum.sprüche\" auf java-forum.org benachrichtigt " +
                "werden wolltest. Dieses Thema hat Antworten seit deinem " +
                "letzten Besuch bekommen. Du kannst den folgenden Link " +
                "benutzen, um direkt zum Thema zu gelanden:" +
                "http://www.java-forum.org/de/viewtopic.php?p=174833#174833" +
                "Bis du den Link besucht hast, werden keine weiteren " +
                "Benachrichtigungen über dieses Topic an dich gesendet. " +
                "Wenn du gar nicht mehr über Antworten in diesem Thema " +
                "benachrichtigt werden möchtest, dann klick den folgenden Link " +
                "an:" +
                "http://www.java-forum.org/de/viewtopic.php?t=28930&unwatch=topic" +
                "-- " +
                "______________________" +
                "http://www.java-forum.org ";
        
        Vector<String> links = new Vector<String>(getLinks(mail));
        for (int i = 0; i < links.size(); i++) {
            System.out.println(links.elementAt(i));
        }
    }
}

Der Rückabewert ist, wie du siehts ein Vector. Statt der Konsolenausgabe musst du eben deine Swingkomponente füllen.

Hoffe es hilft,

Caffè Latte
 
Hat alles super funktioniert. jetzt hab ich mein REGEX soweit hinbekommen, das der den Link perfekt ausliest, nur am Ende wird immer noch ein " zuviel angezeigt:

Code:
http://www.jsnfdsafbh.de/jfkewnf/index.php"

kannst du mir vielleicht noch sagen, wie ich den REGEX verändern muss, damit ich die Anführungszeichen am Ende wegbekomme?

Mein REGEX:
Code:
REGEX = "(http[s]?|ftp)://.+?[ \"><]";

Deine REGEX
Code:
REGEX = "(http[s]?|ftp)://.+? ";
ich versuchs mal zu erklären, wenn was falsch ist bitte korrigier mich:

also entweder HTTP, oder HTTPS oder FTP, dann muss folgen :// danach können alle möglichen Sachen ein oder mehrmal vorkommen.

So jetzt komm ich nicht weiter, warum läßt du dahinter ein LEERZEICHEN?
 
Hi,

also meinen Regex hatte ich wirklich nur zusammengeschustert. Ich wolle iegenlich erst mal nur zeigen, wie es IMHO grundsätzlich machbar ist. Den Regex zu bauen verbraucht wohl am meisten Hirnschmalz. 😉

Die Links beginnen vorne mit "http(s)" oder "ftp"; soweit ist ja alles klar. Danach kommt irgendwas. Allerdings endet die URL ja auch irgendwann. Bei normalen Fließtext trennt ein Leerzeichen sie vom restlichen Text. Es kann allerdings auch ein Satzzeichen sein, eine Zeilenschaltung, ein x-beliebiges anderes Whitespace oder einfach auch das Ende des Textes. Bei HTML-Mails wäre das Ende aber ein doppeltes Hochkomma (Anführungszeichen). Würdest du dieses Ende nicht berücksichtigen, wäre ab dem ersten "https(s)|ftp" alles bis zum Ende des Textes im Matcher enthalten. Außerdem muss man das "non greedy" Verhalten erzwingen: normalerweise würde der Matcher alles enthalten, vom ersten Aufreten des Beginns des Pattern bis zum letztmöglichen Ende (in meinem Beispiel das letzte Leerzeichen im Text). Das nennt sich dann "greedy". Deshalb kommt vor dem Endezeichen (im Bsp. das Leerzeichen) das "?", um eben das erste Endezeichen nach dem Anfangspattern zu erfassen.

Was also zu tun ist:

- das Ende des Regex bestimmen
- doppelte Links vermeiden (insbesondere bei HTML-Mails kann der Link zweimal vorkommen; einmal als "A HREF" und dann noch mal als Text. Viele Mailclients schicken bei HTML-Mails auch noch den Body als Plaintext, dann hast du den Link u.U. dreimal. 😀 Statt mit dem Vector kann man dann z.B. mit einer Set Collection arbeiten.

Hoffe es hilft,

Caffè Latte
 
Ja soweit hab ich alles verstanden. Also ich mach mich jetzt mal über das Tutorial her, das du mir geschickt hast, vielleicht komm ich dann drauf, wie ich am besten das Ende des REGEX bestimme. Falls du Lust und Zeit hast kannst es ja auch mal probieren :wink: Das wird mich jetzt sicher den ganzen Nachmittag kosten, aber das ist es mir wert. Falls du noch weitere Verbesserungsvorschläge hast, kannst du sie mir gerne sagen. Probier jetzt mal ein bißchen rum und poste dann später mal meinen bisherigen Code.

Danke dir schonmal für deine Hilfe.
 
Hi,

nach denken und googeln versuch es mal mit folgendem Regex:

Code:
"(http[s]?|ftp)://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?"

Wenn keine Anmeldung in der URL steht (also user😛assword@host) müsste es gehen. Die Endezeichen sind dann auch weg im Matcher.

Ich hab das jetzt so gut es geht getestet mit allen mögliche URL (auch aus Mails). Garantieren kann ich aber für nix. 😀

Caffè Latte
 
Muss schon sage allen Respekt für deine tolle Arbeit. Hab es zwar auch weitestgehenst so hinbekommen, aber deine Lösung ist natürlich perfekt. Danke dir für all die Mühe die du dir gemacht hast. Falls du mal meine Hilfe auf irgendeinem anderen Gebiet brauchst, dann meld dich einfach. Oder willst du vielleicht mein fertiges Programm mal haben.
 
Hi,

danke für die Komplimente. Ich denke mal zum Helfen ist das Forum ja da. Und das fertige Programm würde ich schon gerne haben - vor allem mit den Sourcen. 😀

Caffè Latte
 
Jetzt hab ich noch eine Frage und zwar:

In der linken Spalte werden die Absender aller E-Mails angezeigt. Dann kann ich einzelne oder mehrere E-Mails auswählen. Die ausgewählten E-Mails werden dann in der rechten Spalte angezeigt, sobald ich auc hinzufügen klicke. So jetzt soll der jede E-Mail in der rechten Spalte auf Internetlinks überprüft werden. Da die Reihenfolge jetzt aber anders ist als die E-Mails auf dem Server liegen hab ich ein Problem, das die AUSGEWÄHLTEN E-Mails überprüft werden. Welchen Index könnte ich da übergeben, damit die richtigen E-Mails überprüft werden?
 
Hi,

holst du die Mails nochmal um sie nach Links zu durchsuchen? Spricht was dagegen alle Mails im Speicher zu halten?

Falls ja musst du eben noch die "Stelle im Postfach" mit übergeben. Speicherst du Mails in einem Array? Dann mach ein zweidimensionales draus.

Und ich dachte schon du postest jetzt, dass dein Programm fertig ist ... 😛

Caffè Latte
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben