Javamail: Mails abholen und speichern

magic_halli

Erfahrenes Mitglied
Hi,

ich befasse mich gerade mit Javamail und dem Thema senden/empfangen von Mails. Das Senden zu meinem web.de-Account habe ich hinbekommen. Jetzt lese ich mich gerade ins Abholen von Mails ein. Dazu lese ich im Buch "Java ist auch ein Insel" (7.Auflage).

Mir ist leider eines unklar bzw. steht im Buch und Netz nicht beschrieben:
Wenn ich Mails bspw. von web.de abhole - wo werden diese dann auf dem PC hier gespeichert? Ich möchte die Mails gern abrufen, aber bei web.de nicht löschen, und dann als einzelne Dateien in einem bestimmten Ordner auf Platte speichern.

Habe dazu leider nichts gefunden.
Geht das überhaupt wie ich mir das vorstelle? Gibts dafür ein HowTo o.ä.?

Danke und Gruß

PS: Habe mittlerweile etwas gefunden, aber es kommt keinerlei Ausgabe/Mail/Fehlermeldung etc. Die Funktion wird ausgeführt doch nichts passiert - was ist falsch? Ich will mir eigentlich erstmal nur die Mails meines web.de-Accounts anzeigen lassen:
Java:
private static void getMail(){
		String popHost = "pop3.web.de";
		String username = "Username";
		String password = "Passwort";
		
		try{
			Session session = Session.getInstance(new Properties());
			Store store = session.getStore("pop3");
			store.connect(popHost, username, password);
			Folder folder = store.getFolder("INBOX");
			folder.open(Folder.READ_ONLY);
			Message[] recentMessage = folder.search(new FlagTerm(new Flags(Flags.Flag.RECENT), true));
			
			for (Message message : recentMessage) {
				System.out.println(message.getFrom()[0] + " -> " + message.getSubject());
			}
			
			store.close();
			
		}catch(Exception err){
			System.out.println(err);
		}
	}
 
Zuletzt bearbeitet:

shampoogy

Grünschnabel
Hey hey,

ich befülle das Properties-Objekt mit den Zugangsdaten und übergeb dieses dann dem Session-Objekt. Is ähnlich komfortabel.


Properties props = null;
if (!sPopHost.equalsIgnoreCase(""))
{
props = System.getProperties();
props.put("mail.pop3.host", sPopHost);
props.put("mail.pop3.port", sPopPort);
}
else if (!sImapHost.equalsIgnoreCase(""))
{
props = System.getProperties();
props.put("mail.imap.host", sImapHost);
props.put("mail.imap.port", imapPort);
}

// Setup authentication, get session
Session session = null;
if (sAuthentify.equalsIgnoreCase("false"))
{
session = Session.getDefaultInstance(props);
}
else
{
Authenticator auth = new CMailAuthenticator(sUser, sPwd);
// authenticateViaPop3();
session = Session.getDefaultInstance(props, auth);
}

// Get the store
Store store = null;
if (!sPopHost.equalsIgnoreCase(""))
{
store = session.getStore("pop3");
}
else if (!sImapHost.equalsIgnoreCase(""))
{
store = session.getStore("imap");
}
store.connect();
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] message = folder.getMessages();

Btw: Wie bekomm ich Java-Code in dieses supertolle Fensterchen?

Gruß
 

magic_halli

Erfahrenes Mitglied
So, mit dieser Version hier kann ich die Mails abrufen und anzeigen lassen:
Java:
public static void getMail(){
      String imapHost = "10.0.0.1";
      String username = "User1";
      String password = "geheim";

      try{
         //Get system properties
         Properties props = System.getProperties();
         //Mail-Server properties: Session verlangt die Informationen über Host, User, Passwd etc.
         props.put("mail.imap.host", imapHost);
         props.put("mail.imap.auth", "true");

         //Initialisierung der Auth-Klasse zur Mail-Account-Authentisierung; in Session benutzt
         MailAuthenticator auth = new MailAuthenticator(username, password);
         
         //Session: steht für die Verbindung mit dem Mail-Server      
         Session session = Session.getDefaultInstance(props, auth);
         //Gibt in der Console Debug-Meldungen zum Verlauf aus
         session.setDebug(false);
         
         //Store: dient dem zum Ablegen der Nachrichten
         Store store = session.getStore("imap");
         store.connect();
         
         //Folder: ist ein Ordner-Object für Mails
         Folder folder = store.getFolder("INBOX");
         folder.open(Folder.READ_ONLY);
         
         Message message[] = folder.getMessages();
         
         for(int i=0;i<message.length;i++){
            Message m = message[i];
            
            System.out.println( "-----------------------\nNachricht: " + i );
            System.out.println( "Von: " + Arrays.toString(m.getFrom()) );
            System.out.println( "Betreff: " + m.getSubject() );
            System.out.println( "Gesendet am: " + m.getSentDate() );
            System.out.println( "ContentType: " + new ContentType(m.getContentType()) );
            System.out.println( "Content: " + m.getContent() );
            
            //Nachricht ist eine einfache Text- bzw. HTML-Nachricht
            if( m.isMimeType("text/plain") ){
               System.out.println( m.getContent() );
            }
            
            //Nachricht ist eine Multipart-Nachricht (besteht aus mehreren Teilen)
            if( m.isMimeType("multipart/*") ){
               Multipart mp = (Multipart) m.getContent();
               
               for( int j=0;j<mp.getCount();j++ ){
                  Part part = mp.getBodyPart(j);
                  String disposition = part.getDisposition();
                  
                  if( disposition == null ){
                     MimeBodyPart mimePart = (MimeBodyPart) part;
                     
                     if( mimePart.isMimeType("text/plain") ){
                        BufferedReader in = new BufferedReader( new InputStreamReader(mimePart.getInputStream()) );
                        
                        for( String line; (line=in.readLine()) != null; ){
                           System.out.println( line );
                        }
                     }
                  }
               }
            }//if Multipart
            
         }
         
         folder.close( false );
         store.close();
         
      }catch(Exception err){
         System.out.println(err);
      }
   }
Kann ich die einzelnen Mails aber irgendwie als separate Files auf Platte abspeichern? So werden sie ja nur angezeigt.

Hintergrund ist der, dass später einmal ein Postfach abgefragt werden soll, die Mails bzw. alle neuen Mails in XML konvertiert und mittels dieser XML-Files in ein CRM-System importiert werden sollen.
Um Mailinfos (bspw. Sender, Betreff, Content usw.) in ein XML-File zu konvertieren muss ich die Mail doch erstmal physisch speichern, oder geht das auch quasi "on the fly"?
Hat jemand sowas schonmal gemacht bzw. kennt Quellen, die das erläutern?

Danke.


PS: @shampoogy
Den Code musst du in JAVA-Tags, statt CODE-Tags hier schreiben... dann wirds auch so schön bunt dargestellt. ;)
 

fm it

Mitglied
Der Code klappt ja sehr schön und alles aber wie rufe ich nur die letzten 20 oder letzten 10 ab und wie lösche ich die Emails die abgerufen würden ? Link reicht auch :) Ich finde einfach beim googeln nix passendes zu dem abrufen einer beschränkten anzahl
 

Javagirl91

Grünschnabel
Bei mir funktioniert werden das versenden noch das empfangen von emails. Auch nicht mit einem Code der bei anderen funktioniert. Was nutzt ihr für JavaVersionen? Führt ihr das Programm dann lokal in Java aus oder über einen Server wenn ja welchen nutzt ihr da? Was muss ich beachten? mail.jar ist in das projekt eingebunden aber ich kriege immer eine exeption und am Code kann es ja nicht liegen wenn ein uns derselbe bei anderen funktioniert
 

Cromon

Erfahrenes Mitglied
Kann es sein, dass es genau daran liegt? Die Authentifizierung schlug fehl? Also Server, Username und Passwort passen nicht zusammen?

Grüsse
Cromon
 

Javagirl91

Grünschnabel
ich hab aller mehrmals überprüft die Daten passen eigentlich deswegen weiß ich auch nicht was schief läuft und bin überfragt...
Wenn bei anderen derselber code funktioniert muss ich ja nur meine Daten anpassen...deswegen hatte ich ja die vermutung das es an was anderem liegt aber an was
 
Zuletzt bearbeitet: