Java Mail - Multipart anzeigen

GUI-Programmer

Top Contributor
Hallo

Ich habe vor einiger Zeit ein Programm geschrieben, das ich als "Google Mail Desktop Application" bezeichne. Dieses Programm ermöglicht es Googlemail Nutzern ihr Mails auserhalb eines Browsers zu checken, zu schreiben und zu löschen.
Das funktioniert auch alles ohne Weiteres, bis darauf, dass es mir nicht gelingt, manche Nachrichten zu lesen, deren ContentType vom Typ multipart ist, und deren BodyPart Typ wieder vom Typ mulitpart ist.

Hier mal die wichtigste Klasse:
Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.ContentType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;

/**
 * Klasse MailTool
 * 
 * @author GUI-Programmer
 * @version 07.12.2011
 */
public class MailTool {
	// Attribute
	private String username, password;
	private Session session1;
	private Transport transport;
	private Store store;
	private Message[] message;
	private ArrayList<DataHandler> datahandlers;
	private ArrayList<Integer> bodyPartSizes;
	private Folder folder;
	private boolean showDialog;
	private int mailNumber;
	private String userhome;
	private String separator;
	
	// Konstruktor
	public MailTool() {
		username = null;
		password = null;
		session1 = null;
		transport = null;
		store = null;
		datahandlers = new ArrayList<DataHandler>();
		bodyPartSizes = new ArrayList<Integer>();
		showDialog = false;
		mailNumber = -1;
		userhome = System.getProperty("user.home");
		separator = System.getProperty("file.separator");
	}
	
	// Methoden
	/**
	 * Es wird versucht eine Verbindung zu Googlemail aufzubauen und sich
	 * dort mit den Benutzernamen und den Passwort einzuloggen.
	 * @param username
	 * @param password
	 * @throws Exception
	 */
	public void login(final String username, final String password) throws Exception {
		MailTool.this.username = username;
		MailTool.this.password = password;
		
		Properties props1=new Properties();
		props1.put("mail.smtp.port", "587");
        props1.put("mail.smtp.auth", "true");
        props1.put("mail.smtp.starttls.enable", "true");
        session1 = Session.getInstance(props1);
        transport = session1.getTransport("smtp");
		transport.connect("smtp.googlemail.com", username, password);
		
		Properties props2 = System.getProperties();
		props2.setProperty("mail.store.protocol", "imaps");
		props2.setProperty("mail.imaps.partialfetch", "false");
    	props2.setProperty("mail.imap.host", "imap.gmail.com");
    	props2.setProperty("mail.imap.port", "993");
    	props2.setProperty("mail.imap.connectiontimeout", "5000");
    	props2.setProperty("mail.imap.timeout", "5000");
    	Session session2 = Session.getDefaultInstance(props2, null);
    	store = session2.getStore("imaps");
    	store.connect("imap.gmail.com", username, password);
    	folder = store.getFolder("INBOX");
    	folder.open(Folder.READ_WRITE);
	}
	
	/**
	 * Versucht eine E-Mail an die angegebene Addresse/-n zu senden.
	 * @param recipientAddresses
	 * @param subject
	 * @param mailText
	 * @throws Exception
	 */
	public void sendMail(String recipientAddresses, String subject, String mailText, ArrayList<File> filelist) throws Exception {
		login(username, password);
    	Address[] addresses = InternetAddress.parse(recipientAddresses);
		Message message = new MimeMessage(session1);
        message.setFrom(new InternetAddress(username));
        message.setRecipients(Message.RecipientType.TO, addresses);
        message.setSubject(subject);
        // create the message part 
        Multipart multipart = new MimeMultipart();
        MimeBodyPart textBodyPart = new MimeBodyPart();
        textBodyPart.setText(mailText);
        multipart.addBodyPart(textBodyPart);
        for(int i=0; i<filelist.size(); i++) {
        	MimeBodyPart attachementBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(filelist.get(i));
            attachementBodyPart.setDataHandler(new DataHandler(source));
            attachementBodyPart.setFileName(filelist.get(i).getName());
            multipart.addBodyPart(attachementBodyPart);
        }
        message.setContent(multipart);
        
        transport.sendMessage(message, addresses);
        transport.close();
	}
	
	public void deleteMail(int number) throws Exception {
		message = folder.getMessages();
		int index = message.length - number-1;
		message[index].setFlag(Flags.Flag.DELETED, true);
		folder.close(true);
		folder.open(Folder.READ_WRITE);
	}
	
	/**
	 * Die Anhänge der ausgewählten E-Mail werden ermittelt und als Strings zurückgegeben.
	 * @param number
	 * @return
	 * @throws Exception
	 */
	public ArrayList<String> getAttachments(int number) throws Exception {
		final ArrayList<String> attachments = new ArrayList<String>();
		datahandlers.removeAll(datahandlers);
		bodyPartSizes.removeAll(bodyPartSizes);
		
		login(username, password);
		message = folder.getMessages();
		int index = message.length - number;
		
		if(message[index].getContentType().toString().startsWith("multipart")) {
			Multipart content = (Multipart) message[index].getContent();
			for(int i=0; i<content.getCount(); i++) {
				BodyPart part = (BodyPart) content.getBodyPart(i);
				String fileName = part.getFileName();
				if(isAttachement(part.getContentType(), fileName)) {
					fileName = encordeAttachement(fileName);
					attachments.add(fileName);
					
					datahandlers.add(part.getDataHandler());
					bodyPartSizes.add(part.getSize());
				}
			}
		}
		return attachments;
	}
	
	private boolean isAttachement(String contentType, String fileName) {
		boolean isAttachement = false;
		if(!contentType.startsWith("text/html")
		&& !contentType.startsWith("text/rtf")
		&& !contentType.startsWith("text/plain")
		&& fileName != null) {
			isAttachement = true;
		}
		return isAttachement;
	}
	
	private String encordeAttachement(String s) throws UnsupportedEncodingException {
		String temp = MimeUtility.decodeText(s);
		String decoded = Normalizer.normalize(temp, Normalizer.Form.NFC);
		return decoded;
	}
	
	/**
	 * Der Text der ausgewählten E-Mail wird ermittelt und als String zurückgegeben.
	 * @param number
	 * @return
	 * @throws Exception
	 */
	public String readMail(int number) throws Exception {
		mailNumber = number;
		String text = null;
		
		message = folder.getMessages();
		int index = message.length - number;
		ContentType contentType = new ContentType(message[index].getContentType());
		String type = contentType.getPrimaryType()+"/"+contentType.getSubType();
		if(type.equals("TEXT/PLAIN")) {
			System.out.println("TEXT/PLAIN");
			text = message[index].getContent().toString();
		} else if(type.equals("TEXT/HTML")) {
			System.out.println("TEXT/HTML");
			text = HTML2Text.convert(message[index].getContent().toString());
		} else if(contentType.toString().startsWith("multipart")) {
			System.out.println("multipart");
			text = getMultiPartText(message[index]);
		}
		
		return text;
	}
	
	/**
	 * Behandelt den Inhalt einer E-Mail als multipart-Typ und versucht
	 * ihn als String zu konvertieren.
	 * @param m
	 * @return
	 * @throws Exception
	 */
	private String getMultiPartText(Message m) throws Exception {
		String text = null;
		StringBuffer buffer = new StringBuffer();
		MimeMultipart content = (MimeMultipart) m.getContent();
	     for(int i=0; i<content.getCount(); i++) {
	      BodyPart part = content.getBodyPart( i );
	      ContentType ct = new ContentType(part.getContentType());
	      String type = ct.getPrimaryType()+"/"+ct.getSubType();
	      if(type.equals("TEXT/PLAIN")) {
	    	  buffer.append(part.getContent().toString());
	      } else if(type.equals("TEXT/HTML")) {
	    	  buffer.append(HTML2Text.convert(part.getContent().toString()));
	      } else if(type.startsWith("multipart")) {
	    	  // Wie komme ich an die Nachricht ???
	      }
	      text = buffer.toString();
	     }
		return text;
	}
	
	/**
	 * Gibt den Benutzernamen das Nutzers zurück.
	 * @return
	 */
	public String getUsername() {
		String user;
		if(username.endsWith("@googlemail.com")) {
			user = username.replaceAll("@googlemail.com", "");
		} else {
			user = username;
		}
		return user;
	}
	
	/**
	 * Liefert 2 String-Arrays. Das 1. enthält die Namen aller Absender
	 * der E-Mails, das 2. die dazugehörigen Betreffe.
	 * @return
	 */
	public String[][] getMails(final JProgressBar progress) {
		progress.setValue(0);
		String[][] mails = null;
		try {
			message = folder.getMessages();
			mails = new String[message.length][message.length];
			final String[] from = new String[message.length];
			final String[] subject = new String[message.length];
			progress.setMaximum(message.length);
			
			for (int i=message.length-1; i>0; i--) {
				try {
					int temp = message.length-i;
					Address[] froms = message[i].getFrom();
					String email = froms == null ? null : ((InternetAddress) froms[0]).getAddress();
					from[temp] = email;
					subject[temp] = message[i].getSubject();
					if(subject[temp] == null) subject[temp] = "<Kein Betreff>";
					progress.setValue(temp);
				} catch(Exception ignore) { }
			}
			progress.setValue(progress.getMaximum());
			
			mails = new String[][] {from, subject};
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		return mails;
	}
	
	public void downloadFile(final String filename, final int attachmentNumber, final Downloads dialogDownloads, final File directory) {
		dialogDownloads.setTitle("Aktiver Download");
		dialogDownloads.setVisible(true);
		dialogDownloads.lblFileName.setText(filename+" wird heruntergeladen...");
		dialogDownloads.prgrsbr.setValue(0);
		
		final SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
			@Override
			protected Void doInBackground() throws Exception {
				showDialog = true;
				
				Thread.sleep(200);
				dialogDownloads.prgrsbr.setIndeterminate(true);
				
				File file = new File(directory.getAbsolutePath()+separator+filename);
				if(!file.exists()) file.createNewFile();
				
				FileOutputStream fos = new FileOutputStream(file);
				datahandlers.get(attachmentNumber).writeTo(fos);
				fos.close();
				return null;
			}
			
			@Override
			public void done() {
				showDialog = false;
				dialogDownloads.prgrsbr.setIndeterminate(false);
				dialogDownloads.prgrsbr.setValue(100);
				dialogDownloads.setTitle("Download abgeschlossen");
				
				Thread t = new Thread() {
					boolean run = true;
					public void run() {
						while(run) {
							try {
								sleep(3000);
							}
							catch(InterruptedException ex) {
								ex.printStackTrace();
							}
							run = false;
							dialogDownloads.setVisible(showDialog);
						}
					}
				};
				t.start();
			}
		};
		worker.execute();
	}
	
	public void downloadAllFiles(final Downloads dialogDownloads, final File directory) {
		System.out.println(directory.getAbsolutePath());
		dialogDownloads.setTitle("Aktiver Download");
		dialogDownloads.prgrsbr.setValue(0);
		dialogDownloads.setVisible(true);
		SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
			private ArrayList<String> fileList = null;
			@Override
			protected Void doInBackground() throws Exception {
				Thread.sleep(200);
				dialogDownloads.prgrsbr.setIndeterminate(true);
				
				Thread t1 = new Thread(new Runnable() {
					public void run() {
						try { fileList = getAttachments(mailNumber); }
						catch(Exception ex) { ex.printStackTrace(); }
					}
				}); t1.start(); t1.join();
				
				for(int i=0; i<fileList.size(); i++) {
					dialogDownloads.lblFileName.setText(fileList.get(i)+" wird heruntergeladen...");
					final int k = i;
					Thread t2 = new Thread(new Runnable() {
						public void run() {
							try {
								File file = new File(directory.getAbsolutePath()+separator+fileList.get(k));
								if(!file.exists()) file.createNewFile();
								
								FileOutputStream fos = new FileOutputStream(file);
								datahandlers.get(k).writeTo(fos);
								fos.close();
							}
							catch(Exception ex) { ex.printStackTrace(); }
						}
					}); t2.start(); t2.join();
					dialogDownloads.prgrsbr.setIndeterminate(false);
					dialogDownloads.prgrsbr.setValue(100);
					Thread.sleep(100);
				}
				return null;
			}
			
			@Override
			protected void done() {
				dialogDownloads.setTitle("Downloads abgeschlossen");
				Thread t3 = new Thread(new Runnable() {
					public void run() {
						try {
							Thread.sleep(3000);
							dialogDownloads.setVisible(false);
						}
						catch(InterruptedException ex) { ex.printStackTrace(); }
					}
				}); t3.start();
			}
		};
		worker.execute();
	}
	
	public boolean logout() {
		boolean logout = false;
		Thread t = new Thread(new Runnable() {
			public void run() {
				try {
					store.close();
				}
				catch(MessagingException ex) {
					ex.printStackTrace();
				}
			}
		});
		t.start();
		try {
			t.join();
			logout = true;
		} catch(InterruptedException ex) {
			ex.printStackTrace();
		}
		return logout;
	}
	
	
}
Um das Programm auszuführen, muss sich der resources Ordner im selben Verzeichnis befinden wie die executable jar bzw. die class Dateien.

P.S. Später hab ich auch mal vor den Text in der JEditorPane mit Formatierung anzuzeigen, d.h. bie Html ist dies ja leicht, allerdings, was wenn nur Teile der Nachricht aus Html bestehen?
 

AlexSpritze

Bekanntes Mitglied
Wo ist jetzt genau das Problem?

So wie ich das bisher gesehen hatte, kannst du eine schöne, baumartige Struktur in deiner MimeMessage haben:

Code:
multipart/mixed
--multipart/related
----multipart/alternative
------text/plain << body der nachricht ohne HTML
------text/html << body der Nachricht mit HTML
----image/jpeg << eine Inline-Grafik, die in dem HTML referenziert wird
--application/whatever << irgendein Anhang

Das heißt, du musst dich da irgendwie durchhangeln.
 

AlexSpritze

Bekanntes Mitglied
Java:
Multipart part = (Multipart)mehl.getContent(); // davon ausgehend, dass getContent() ein Multipart liefert
for (int i = 0 ; i < part.getCount(); i++){
  BodyPart bodyPart = part.getBodyPart(i);
  Object content = bodyPart.getContent();
  if(content instanceof Multipart) {
    // hier dann wieder oben anfangen
  }
}
 

GUI-Programmer

Top Contributor
Super hat geklappt! Nun wird der gesamte Text einer Nachricht angezeigt.

Doch in manchen fällen funktioniert irgendwie die Umwandlung des HTML-Textes zu Plain-Text nicht. Die Klasse die dies macht, habe ich mir (ich glaube sogar hier) aus irgendnen Forum kopiert und sie etwas angepasst.

Jedoch ist mein Plan folgender:
Irgendwie den HTML Text richtig in der JEditorPane darstellen. Ich weis zwar, dass ich den ContentType der JEditorPane auf "text/html" umstellen kann. Dann allerdings wird der gesamte Text ohne Zeiilenumbrüche dargestellt. Ist es denn möglich dies zu verhindern, sodass, wenn der 'Bodypartcontenttype' "text/html", dieser auch so richtig dargestellt wird?
 

AlexSpritze

Bekanntes Mitglied
Zeilenumbrüche werden bei der Anzeige von HTML ja ignoriert, stehen in dem HTML denn wenigstens
Code:
<br/>
?
 

GUI-Programmer

Top Contributor
Zeilenumbrüche werden bei der Anzeige von HTML ja ignoriert, stehen in dem HTML denn wenigstens
Code:
<br/>
?

Das Problem bei einer multipart message ist ja, dass eben nicht nur html sondern auch text/plain mit darin vorkommt. D.h. wenn ich die JEditorPane auf html einstelle, kann ich die html teile zwar schön (mit unterschiedlichen textgrößen, untrerstreichung, farben, etc.) darstellen lassen, die normalen text teile jedoch müsste ich anders behandeln. Evtl. hilft es ja die \n bei bei einem "text/plain" String zu <br/> zu machen???
 

GUI-Programmer

Top Contributor
Das Austauschen von "\n" zu "<br/>" hat perfekt geklappt. So wird zum Beispiel eine Webung von Amazon nun perfekt (wie in Googlemail selbst) darsgestellt. Allerdings werden manche Nachrichten garnicht dargestellt, was aber mit den Tausch nichts zu tun hat. Bei den Lesevorgang ertönt dass bekannte Windows-Ping und es wird garnichts in der JEditorPane angezeigt.
Meine Vermutung ist, dass irgendwelche Sicherheitsverstöße vorliegen, wenn zum Beispiel ein Bild von einer Website benutzt werden soll oder sowas ähnliches. Wie kann ich das Problem umgehen? Bzw. liegt es daran?

Hier ist der HTML Nachrichtentext bei dem der Fehler/Block mit Ping Geräusch entsteht:
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6002.18457" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hallo NameXY,</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>habe Info über MATSE unter</FONT></DIV>
<DIV><FONT face=Arial size=2><A 
href="http://www.kischuni.de/ausbildung/Wie-werde-ich-Mathematisch-technischer-Softwareentwickler-33.html">http://www.kischuni.de/ausbildung/Wie-werde-ich-Mathematisch-technischer-Softwareentwickler-33.html</A></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Infos über diesen und ähnliche Berufe unter 
</FONT></DIV>
<DIV><FONT face=Arial size=2><A 
href="http://berufenet.arbeitsagentur.de/berufe/start?dest=profession&amp;prof-id=51029">http://berufenet.arbeitsagentur.de/berufe/start?dest=profession&amp;prof-id=51029</A></FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;</DIV>
<DIV>Ausbildungsplatz 2012 Fresenius</DIV>
<DIV><A 
href="http://azubi-bei-fmc.de/ausbildung/systeminformatikerin.html">http://azubi-bei-fmc.de/ausbildung/systeminformatikerin.html</A></DIV>
<DIV><BR style="CLEAR: both" xmlns="http://www.w3.org/1999/xhtml" 
xmlns:xalan="http://xml.apache.org/xalan"></FONT><FONT face=Arial size=2>Viele 
Grüße Name2XY</FONT></DIV></BODY></HTML>
 
Zuletzt bearbeitet:

AlexSpritze

Bekanntes Mitglied
Das Problem bei einer multipart message ist ja, dass eben nicht nur html sondern auch text/plain mit darin vorkommt. D.h. wenn ich die JEditorPane auf html einstelle, kann ich die html teile zwar schön darstellen lassen, die normalen text teile jedoch müsste ich anders behandeln. Evtl. hilft es ja die \n bei bei einem "text/plain" String zu <br/> zu machen???

Das ist eigentlich kein Problem. Du kannst aus der Multipart-Message genau die Teile rausziehen, die dich interessieren. Wie oben in dem Schema angedeutet, kann eine solche Nachricht ihre Body in HTML und Plain-Text enthalten. Dabei ist davon auszugehen, dass Plain-Text dem HTML gleicht, nur eben ohne die ganzen Auszeichnungen. Das heißt, du kannst aktiv schauen, ob einen HTML-Nachrichtentext anzeigen kannst, oder ob du nur Plain-Text zur Verfügung hast.

Wenn dir ein Multipart per
Code:
getContentType()
mitteilt, dass es "multipart/alternative" ist, kannst du davon ausgehen, dass darin zwei Bodyparts sind: einer für HTML und einer für "text/plain", welcher welcher ist, bekommst du auch wieder mit
Code:
getContentType()
raus.
 

GUI-Programmer

Top Contributor
Weiß jemand woher der Fehler/Block mit dem Windows Ping Sound kommt? Schließlich könnte man ja selbst so eine HTML Datei irgenwo gespeichert haben, dann sollte doch eigentlich auch sowas nicht geschehen.
 

GUI-Programmer

Top Contributor
Habe etwas seltsames festgestellt:
Hab diesen HTML Text in einer .html Datei abgespeichert und diese dann per setPage() Methode in die EditorPane geladen, und siehe da, es funktioniert!

Daraus komme ich zur Schlussfolgerung, dass es nicht möglich ist in einer EditorPane mehrer HTML Texte, also mit mehreren <HTML> </HTML> Tags, sowie den <!DOCTYPE HTML PUBLIC " Zeug darzustellen. Das ist die Fehlermeldung.


Deswegen meine nächste Frage:
Kann man irgendwie mehrere HTML-Texte zu einem zusammenfügen, also dass nur einmal <!DOCTYPE HTML PUBLIC "... und <HTML> </HTML> in den Text drin vorkommt, oder ist das unmöglich?
Wenn ja, dann frag ich mich aber, wie es die ganzen Mail - Programme machen!!!
 

GUI-Programmer

Top Contributor
Oder kann man vielleicht die Htmls zu einer Rtf machen, und die dann anzeigen lassen?

Oder muss man tatsächlich jeden HTML-Part in einer seperaten JEditorPane anzeigen lassen, denn das würde nämlich funktionieren. Allerdings wäre dabei dann der Aufwand wieder sehr hoch, da man dann ein JPanel braucht mit nen ganz bestimmten LayoutManager, bei dem JEditorPanes hinzugfügen kann nach Bedarf. Dann müsste man zusätzlich noch das Copy & Past für mehrere JEditorPanes irgendwie auf die Reihe bekommen.

Das wäre ne menge Arbeit, die ich mir gerne ersparen möchte, bzw. vielleicht werde, falls es nicht anders geht.

Nochmals vielen Dank für die Beiträge!!!!



P.S. Wenn das dann alles mal klappen sollte gibts selbstverständlich noch mal das ganze Projekt mir Sources!!!
 
Zuletzt bearbeitet:

AlexSpritze

Bekanntes Mitglied
Also du hast jetzt mehrere HTML-Bodyparts in deiner Mail oder wie? Eine davon wird der Nachrichtentext sein, sozusagen der Body der E-Mail. Und etwaige andere sind Anhänge.

Das sind alles Mails, die von googlemail.com generiert worden sind? Die sollten eigentlich schon vernünftig zusammengebaut sein.
 

GUI-Programmer

Top Contributor
Also du hast jetzt mehrere HTML-Bodyparts in deiner Mail oder wie? Eine davon wird der Nachrichtentext sein, sozusagen der Body der E-Mail. Und etwaige andere sind Anhänge.

Das sind alles Mails, die von googlemail.com generiert worden sind? Die sollten eigentlich schon vernünftig zusammengebaut sein.

Nicht immer...
Meist liegt es wirklich daran, dass es sich um Anhänge handelt, manchmal aber auch nicht, da diese Beispiel HTML Nachricht keinen Anhang enthält!
 

AlexSpritze

Bekanntes Mitglied
Um mal wirklich die ultimative Debugging Anzeige deiner Mails zu realisieren, solltest du dich mit einem IMAP-Client, vorzugsweise Thunderbird, auf googlemail.com verbinden und dir den Quelltext der Nachrichten anschauen. Da siehst du dann sofort was wirklich drin ist ;) So hab ich das auch gemacht, und es wurde vieles klarer, als immer nur mit Multipart und BodyPart zu hantieren.
 

GUI-Programmer

Top Contributor
Bedeutet dass, dass ich Thunderbird 8.0 (z.B. von Chip) runterladen soll? Kann ich damit dann auch meine Mails auf dem Server lassen und mit Thunderbird von dort löschen? Denn das war nämlich erstmal der Hauptgrund warum ich mir überhaupt ein Mail Programm geschrieben habe. Denn bei Outlook ist mir auch nach langer Internet Recherche nicht gelungen Mails mit dem Programm selbst zu löschen.

Wann das Thunderbird kann, bräuchte ich eigentlich mein derzeititges Mail Programm nicht mehr weiterzuschreiben, wobei ich dass dann vermutlich aus Interesse und des Lernens wegen wohl doch machen werde.
 

GUI-Programmer

Top Contributor
@AlexSpritze: Noch mal Danke!!! Thunderbird ist echt super!!!

1. Die Mails werden richtig dargestellt (Was mir ja nicht so gelungen ist!)
2. Ganz wichtig: Man kann Mails mit nur einen Klick sofort direkt vom Server löschen!
3. Thunderbird (8.0 Final) löscht nicht ohne weiteres die Mails vom Server nachdem sie runtergeladen wurden.
4. Man kann alles "mit dem Server handhaben" (Papierkorb vom Server benutzten, Postausgang vom Server, etc.)

==> Im Vergleich zu Outlook siegt Thunderbird für mich so ziemlich in jeden Bereich und ist zudem im Gegensatz zu diesen auch noch kostenlos!


P.S. Thema lass ich vorerst mal noch offen, da ich wie bereits erwähnt vielleicht doch noch etwas weiterprogrammieren will.
 

AlexSpritze

Bekanntes Mitglied
Ja Thunderbird ist wirklich top für die Zwecke. Es ist auch quellenoffen, allerdings nicht mit Java programmiert.

Da gibt es aber auch noch Unterschiede, ob du dich per POP3 mit einem Mailkonto verbindest, oder mit IMAP. Letzteres wird von den wenigstens kostenlosen Mailanbietern angeboten. POP3 dagegen fast immer, es ist aber auch weniger komfortabel (keine Ordnerstruktur möglich, prinzipiell werden Mails vom Server runtergeladen und dort dann gelöscht, etc.)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
imawake Java Paket-Tracking Programm 📦 AWT, Swing, JavaFX & SWT 7
izoards *.doc Seitenränder per Java setzen... AWT, Swing, JavaFX & SWT 14
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J Key-Listener in Java AWT, Swing, JavaFX & SWT 37
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J Java FX NullPointerException, ObservableList wird in View nicht angezeigt.. AWT, Swing, JavaFX & SWT 34
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
J Spiel mit Java AWT, Swing, JavaFX & SWT 9
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
N FXMLLoader.load java.lang.RuntimeException: Gradle AWT, Swing, JavaFX & SWT 2
T Java GUI - Würfel Programm AWT, Swing, JavaFX & SWT 6
JojoSand Java Programm wird nicht gestartet - keinen Fehlerhinweis AWT, Swing, JavaFX & SWT 9
dtr84 JavaFX/OpenJFX mittels Apache Ivy einbinden (Java 11) AWT, Swing, JavaFX & SWT 18
M Jogl und Java 3d AWT, Swing, JavaFX & SWT 0
S0PEX JavaFX Java 8 auf 15 migrieren OpenJFX mit Gradle eingebunden, jedoch nicht gefunden !? AWT, Swing, JavaFX & SWT 4
I Gui in bestehendes Java-Programm AWT, Swing, JavaFX & SWT 11
V Java-Zeichenfeld mit AWT AWT, Swing, JavaFX & SWT 3
N java Gui friert scheinbar zufällig ein AWT, Swing, JavaFX & SWT 5
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
P Java Fx einrichten AWT, Swing, JavaFX & SWT 2
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Trèfle Ausklappbare Diagramme in Java AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
K JAVA FX Constraints AWT, Swing, JavaFX & SWT 2
F Java FX und webcam AWT, Swing, JavaFX & SWT 1
T Wie kann man in java aufwendige grafiken programmieren AWT, Swing, JavaFX & SWT 1
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
J Java SWT Tabelleninhalt formattieren AWT, Swing, JavaFX & SWT 10
Blender3D Falsche Werte mit Java Toolkit Screensize AWT, Swing, JavaFX & SWT 4
K Swing AWT-EventQueue-1 java.lang.NoClassDefFoundError bei setVisible(true) AWT, Swing, JavaFX & SWT 3
A Java Programm gestalten AWT, Swing, JavaFX & SWT 4
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
I Java Bildfarbe ändern wie bei Photoshop AWT, Swing, JavaFX & SWT 9
R JavaFX Java FXML Vererbung in Klassen AWT, Swing, JavaFX & SWT 9
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
J Parallele Aktionen in Java FX richtig durchführen. AWT, Swing, JavaFX & SWT 5
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
M JavaFX java.lang.IllegalStateException: Location is not set. AWT, Swing, JavaFX & SWT 9
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
M Java zeichnet nicht pixelgenau AWT, Swing, JavaFX & SWT 40
B Swing Eclipse is running under 0, but this Java project has a 1.6 Java compliance level, so WindowBuilder AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
S Java Gui AWT, Swing, JavaFX & SWT 5
R Sierpinski Dreieck mit Java FX AWT, Swing, JavaFX & SWT 4
Flynn java.lang.UnsupportedOperationException: Not supported yet AWT, Swing, JavaFX & SWT 7
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
N Aktualisierung des Fensters AWT Java ohne Ruckeln AWT, Swing, JavaFX & SWT 3
MiMa Java, Maven Projekte nach JavaFX? AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L java.lang.NullPointerException - Fehlermeldung AWT, Swing, JavaFX & SWT 2
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
MiMa Java Projekt nach JavaFX convertieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben