Avatar billede hepou Nybegynder
17. juli 2003 - 13:10 Der er 14 kommentarer og
3 løsninger

Hente fra mailserver??

Kan det lade sig at hente mail fra en mailserver (POP3) ned med Java. Ligesom et mailprogram (ex outlook) gør det? Og hvis man kan, hvordan skal det så lige gøres??

:)
Avatar billede mjohansen Nybegynder
17. juli 2003 - 13:12 #1
Ja, det kan du da. Der findes muligvis allerede klasser på nettet til det. Men ellers skal du blot kode op mod POP3 protokollen som er beskrevet her:
http://www.ietf.org/rfc/rfc1939.txt

Det er faktisk ikke så svært.
Avatar billede =maddog= Nybegynder
17. juli 2003 - 13:13 #2
du skal bruge JavaMail pakken og sikkert også JavaBean Activation pakken
http://java.sun.com/products/javabeans/glasgow/javadocs/index.html
http://java.sun.com/products/javamail/1.2/docs/javadocs/index.html
har ikke tid til at hjælpe yderligere pt.
Avatar billede =maddog= Nybegynder
17. juli 2003 - 13:14 #3
Avatar billede r9 Nybegynder
17. juli 2003 - 13:16 #4
søg på eksperten:
http://www.eksperten.dk/kat/9/?searchtype=txt&words=java+mail&method=and&sort=score&catid=9

Eks:
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendMail
{
    String recipient="";
    String sender= "";
        String body="";
        String subject="";
       
    public void setRecipient( String recipient )
    {
            this.recipient = recipient;
    }
   
    public void setSender( String sender)
    {
            this.sender = sender;
    }
   
        public void setBody(String body)
        {
            this.body=body;
        }
       
        public void setSubject(String subject)
        {
            this.subject=subject;
        }

        public boolean sendMail()
    {
        boolean sendMail = true;
        try
        {
            Properties props = new Properties();
            props.put("mail.smtp.host", "lambe.pair.com");
           
            Session mailsession = Session.getDefaultInstance(props, null);
           
            Message msg = new MimeMessage(mailsession);
            msg.setFrom(new InternetAddress(sender));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            msg.setSubject(subject);
            msg.setText(body);
           
            Transport.send(msg);
/*
                        System.out.println("modtager = "+recipient);
                        System.out.println("afsender = "+sender);
                        System.out.println("subject  = "+subject);
                        System.out.println("tekst    = "+body);
*/                       
                        return true;
        }
        catch( AddressException e )
        {
            return false;
        }
        catch( MessagingException e )
        {
            return false;
        }
    }
}
Avatar billede r9 Nybegynder
17. juli 2003 - 13:17 #5
Avatar billede arne_v Ekspert
17. juli 2003 - 14:07 #6
r9>

Det eksempel er på at sende email - ikke på at læse email.
Avatar billede r9 Nybegynder
17. juli 2003 - 14:08 #7
ups. sorry
min fejl
Avatar billede sago Nybegynder
18. juli 2003 - 00:59 #8
Jeg skal også til at rode med det, og fandt ikke noget på Eksperten.

Men jeg fandt et af de link der er blevet postet, og dette: http://www.javaworld.com/javaworld/jw-10-2001/jw-1026-javamail-p2.html
Avatar billede arne_v Ekspert
18. juli 2003 - 19:04 #9
Her er så et eksempel både med list og get (VIGTIGT: get sletter
emailen som POP jo normalt gør !!!!).

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class PopTest {
    public static void main(String[] args) {
        String server = args[0];
        String username = args[1];
        String password = args[2];
        list(server, username, password);
        get(server, username, password, 1);
    }
    public static void list(String server, String username, String password) {
        try {
            Properties props = System.getProperties();
            Session session = Session.getDefaultInstance(props, null);
            Store store = session.getStore("pop3");
            store.connect(server, username, password);
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_ONLY);
            Message[] msgs = folder.getMessages(); 
            for(int i = 0; i < msgs.length; i++) {
                System.out.println(msgs[i].getMessageNumber() + " " +
                                  msgs[i].getFrom()[0] + " " +
                                  msgs[i].getSubject());     
            }
            folder.close(false);
            store.close();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
    public static void get(String server, String username, String password, int n) {
        try {
            Properties props = System.getProperties();
            Session session = Session.getDefaultInstance(props, null);
            Store store = session.getStore("pop3");
            store.connect(server, username, password);
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
            if(folder.getMessageCount() >= n) {
                Message[] msgs = folder.getMessages(n, n); 
                System.out.println(msgs[0].getFrom()[0] + " " +
                                  msgs[0].getAllRecipients()[0] + " " +
                                  msgs[0].getSubject()); 
                BufferedReader body = new BufferedReader(new InputStreamReader(msgs[0].getInputStream()));
                String line;
                while((line = body.readLine()) != null) {
                    System.out.println(line); 
                }
                msgs[0].setFlag(Flags.Flag.DELETED, true);
            }
            folder.close(true);
            store.close();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
18. juli 2003 - 19:07 #10
Hvis I hellere vil gå mere direkte på POP3 end javamail's meget generelle
interface, så har:
  http://jakarta.apache.org/commons/net/index.html
nogle POP3 klasser.
Avatar billede jonasbc Nybegynder
22. juli 2003 - 13:52 #11
import java.net.*;
import java.io.*;
import java.util.Vector;


/**
* Commands for the POP3 protocol are specified in <a href="http://sunsite.auc.dk/RFC/rfc/rfc1939.html">RFC 1939</a>.
* Some of the basic commands used include:
* USER: user name
* PASS: password
* STAT: statistics
* LIST: list a Mail
* RETR: retrieve a Mail
* DELE: delete a mail
* QUIT: close Connection with Server
* @author  joch
*/
public class POP {
   
    private Socket socket;
    private PrintStream writer;
    private BufferedReader reader;
    private String response;
    private boolean deleteFromServer;
   
    public POP(){
        deleteFromServer = false;
    }
   
    public Vector getMail(String popServer, String user, String pass){
        Vector messages = new Vector();
       
        try{
            createSocket(popServer, 110);
           
            login(user, pass);
           
            messages = getMessages();
           
            exit();
        }
        catch(Exception e){
            e.printStackTrace();
        }
       
        return messages;
    }
   
    private void createSocket(String server, int port) throws java.net.UnknownHostException, java.io.IOException{
        System.out.println("create socket");
        socket = new Socket(server,port);
       
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        writer = new PrintStream(new BufferedOutputStream(socket.getOutputStream(),2500),true);
       
        response = read();
    }
   
    private void login(String user, String pass) throws java.io.IOException{
        send("USER " + user);
       
        if (!read().startsWith("+OK")) {
            System.out.println("Wrong user name!!");
        }
       
        send("PASS " + pass);
       
        if (!read().startsWith("+OK")) {
            System.out.println("Wrong password!!");
        }
    }
   
    private Vector getMessages() throws java.io.IOException, java.lang.NumberFormatException{
       
        Vector v = new Vector();
       
        send("STAT");
       
        response = read();
       
        if (!response.startsWith("+OK")) {
            System.out.println("Error:" + response);
        }
       
        int i = response.lastIndexOf(' ');
        String numberMessages = response.substring(4,i);
        int n = Integer.parseInt(numberMessages);
       
        System.out.println("You have " + n + " message(s) in your mailbox");
       
        int numberBytes;
        for (int msg=1; msg <= n; msg++) {
            System.out.println("Retreaving message " + msg);
           
            send("RETR " + msg);
           
            response = read();
           
            if (!response.startsWith("+OK")) {
                System.out.println("Error: " + response);
            }
           
            //the response is probably: +OK XXXX octets follow
            String temp = response.substring(0, response.lastIndexOf(' '));
            i = temp.lastIndexOf(' ');
            numberBytes = Integer.parseInt(response.substring(4,i));
           
            Email email = new Email();
            StringBuffer text = new StringBuffer();
            boolean write = false;
           
            response = reader.readLine();
           
            while (response.compareTo(".") != 0) {
                System.out.println(response);
                if (response.compareTo("..") == 0){
                    System.out.println(".");
                }
                else{
                    if (write){
                        String lowerCaseLine = response.toLowerCase().trim();
                        if (!lowerCaseLine.startsWith("content-transfer") &&
                        !lowerCaseLine.startsWith("message-id") &&
                        !lowerCaseLine.startsWith("charset=") &&
                        !lowerCaseLine.startsWith("x-") &&
                        !lowerCaseLine.startsWith("importance:")){
                            //System.out.println("response: " + response);
                            text.append(response + "\n");
                        }
                    }
                    if (response.startsWith("Return-Path: <")){
                        email.setSender(response.substring(14,response.length()-1));
                    }
                    else if (response.startsWith("Subject: ")){
                        email.setSubject(response.substring(9));
                    }
                    else if (response.toLowerCase().startsWith("content-type:"))
                        if (response.toLowerCase().startsWith("content-type: text/plain"))
                            write = true;
                        else
                            write = false;
                }
                response = reader.readLine();
            }
           
            //replace odd characters in the text (performance...)
            String parsedText1 = parseText(text.toString(), "=E5", "å");
            String parsedText2 = parseText(parsedText1, "=E6", "æ");
            String parsedText3 = parseText(parsedText2, "=F8", "ø");
            String parsedText4 = parseText(parsedText3, "=D8", "Ø");
            String parsedText = parseText(parsedText4, "=20", "\n");
           
            email.setContent(parsedText);
           
            v.addElement(email);
           
            if (deleteFromServer) {
                send("DELE " + msg);
                read();
            }
        }
       
        return v;
    }
   
    private void exit() throws java.io.IOException{
        send("QUIT");
        read();
        socket.close();
    }
       
    private void send(String s){
        //System.out.println("client: " + s);
        writer.println(s);
    }
   
    private String read() throws java.io.IOException{
        String s = reader.readLine();
        //System.out.println("server: " + s);
        return s;
    }
   
    private String parseText(String haystack, String needle, String newNeedle){
        StringBuffer tmp = new StringBuffer("");
        int pos = 0;
        while (pos < haystack.length()) {
            int needleIndex = haystack.indexOf(needle, pos);
            if (needleIndex >= 0) {
                //if the needle is found, add the text until needle
                tmp.append(haystack.substring(pos, needleIndex));
                //add the new needle
                tmp.append(newNeedle);
                //skip past the needle and search for the next one
                pos = pos + (needleIndex - pos) + needle.length();
            }
            else {
                //if the needle is not found, just add the rest of the text
                tmp.append(haystack.substring(pos));
                //move the pointer to the end of the string to stop the while loop
                pos = haystack.length();
            }
        }
        //return the temporary string, which we've added text to
        return tmp.toString();
       
    }
}

Der mangler lidt i parsingen af den hentede tekst... Altså det, der udføres af parseText() metoden. Men funktionaliteten er der.
Avatar billede arne_v Ekspert
22. juli 2003 - 14:05 #12
Nu er det nok ikke meget pointe i at bruge javamail i noget kode
som bevidst ikke bruger javamail, men der er noget i javamail til
at decode quoted-printable med. Eksempel:

import java.io.*;

import javax.mail.*;
import javax.mail.internet.*;

public class QP {

    public static void main(String[] args) {
        String s = "=E6=F8=E5=C6=D8=C5";
        try {
            InputStream is = MimeUtility.decode(new ByteArrayInputStream(s.getBytes()),"quoted-printable");
            byte[] b = new byte[6];
            is.read(b);
            System.out.println(new String(b, "ISO-8859-1"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
22. juli 2003 - 14:06 #13
Jeg tror iøvrigt a:
  parseText(parsedText4, "=20", "\n");
er forkert.

=20 må være mellemrum.
Avatar billede jonasbc Nybegynder
22. juli 2003 - 14:52 #14
arne: jeg tror, du har ret mht. "=20". Vedr. MimeUtility, så synes jeg, som du også selv nævner, at man skla vælge enten eller.
Avatar billede arne_v Ekspert
31. juli 2003 - 08:18 #15
hepou>

Kommet videre ?
Avatar billede hepou Nybegynder
31. juli 2003 - 12:24 #16
Undskyld jeg ikke lige har svaret. Fik en anden opgave, der er lidt vigtigere. Kigger lige på det og vender tilbage. (går nok lige 14 dage endnu!!), men tusind tak! :-)
Avatar billede hepou Nybegynder
08. februar 2004 - 15:33 #17
Undskylder det extremt sene svar meget. Tiden går og man glemmer let når man har meget at se til..

Undskylder og Takker

arne_v > Kom lidt videre, men har ikke fået det færdigt og til at virke helt, men hælpen har været stor her..

:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester