download mail attachment with Java

前端 未结 6 796
耶瑟儿~
耶瑟儿~ 2020-12-13 03:29

I had a look in the reference doc, and Spring seems to have pretty good support for sending mail. However, I need to login to a mail account, read the messages, and download

相关标签:
6条回答
  • 2020-12-13 03:41
    import java.io.IOException;
    import java.io.InputStream;
    
    import javax.mail.internet.MimeMessage;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.io.InputStreamSource;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.mail.javamail.MimeMessagePreparator;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    
    @Controller
    @RequestMapping("/sendEmail.do")
    public class SendEmailAttachController {
        @Autowired
        private JavaMailSender mailSender;
    
        @RequestMapping(method = RequestMethod.POST)
        public String sendEmail(HttpServletRequest request,
                final @RequestParam CommonsMultipartFile attachFile) {
    
            // Input here
            final String emailTo = request.getParameter("mailTo");
            final String subject = request.getParameter("subject");
            final String yourmailid = request.getParameter("yourmail");
            final String message = request.getParameter("message");
    
            // Logging
            System.out.println("emailTo: " + emailTo);
            System.out.println("subject: " + subject);
            System.out.println("Your mail id is: "+yourmailid);
            System.out.println("message: " + message);
            System.out.println("attachFile: " + attachFile.getOriginalFilename());
    
            mailSender.send(new MimeMessagePreparator() {
    
                @Override
                public void prepare(MimeMessage mimeMessage) throws Exception {
                    MimeMessageHelper messageHelper = new MimeMessageHelper(
                            mimeMessage, true, "UTF-8");
                    messageHelper.setTo(emailTo);
                    messageHelper.setSubject(subject);
                    messageHelper.setReplyTo(yourmailid);
                    messageHelper.setText(message);
    
                    // Attachment with mail
                    String attachName = attachFile.getOriginalFilename();
                    if (!attachFile.equals("")) {
    
                        messageHelper.addAttachment(attachName, new InputStreamSource() {
    
                            @Override
                            public InputStream getInputStream() throws IOException {
                                return attachFile.getInputStream();
                            }
                        });
                    }
    
                }
    
            });
    
            return "Result";
        }
    }
    
    0 讨论(0)
  • 2020-12-13 03:42

    Here is an error:

    else if ((disposition != null) && (disposition.equals(Part.ATTACHMENT)
     || disposition.equals(Part.INLINE) ) 
    

    it should be:

    else if ((disposition.equalsIgnoreCase(Part.ATTACHMENT)
     || disposition.equalsIgnoreCase(Part.INLINE))
    

    Thanks @Stevenmcherry for your answer

    0 讨论(0)
  • 2020-12-13 03:45

    Here's the class that I use for downloading e-mails (with attachment handling). You'll have to glance by some of the stuff it's doing (like ignore the logging classes and database writes). I've also re-named some of the packages for ease of reading.

    The general idea is that all attachments are saved as individual files in the filesystem, and each e-mail is saved as a record in the database with a set of child records that point to all of the attachment file paths.

    Focus on the doEMailDownload method.

    /**
      * Copyright (c) 2008 Steven M. Cherry
      * All rights reserved.
      */
    package utils.scheduled;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.sql.Timestamp;
    import java.util.Properties;
    import java.util.Vector;
    
    import javax.mail.Address;
    import javax.mail.Flags;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Multipart;
    import javax.mail.Part;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.internet.MimeBodyPart;
    
    import glob.ActionLogicImplementation;
    import glob.IOConn;
    import glob.log.Log;
    import logic.utils.sql.Settings;
    import logic.utils.sqldo.EMail;
    import logic.utils.sqldo.EMailAttach;
    
    /**
      * This will connect to our incoming e-mail server and download any e-mails
      * that are found on the server.  The e-mails will be stored for further processing
      * in our internal database.  Attachments will be written out to separate files
      * and then referred to by the database entries.  This is intended to be  run by 
      * the scheduler every minute or so.
      *
      * @author Steven M. Cherry
      */
    public class DownloadEMail implements ActionLogicImplementation {
    
        protected String receiving_host;
        protected String receiving_user;
        protected String receiving_pass;
        protected String receiving_protocol;
        protected boolean receiving_secure;
        protected String receiving_attachments;
    
        /** This will run our logic */
        public void ExecuteRequest(IOConn ioc) throws Exception {
            Log.Trace("Enter");
    
            Log.Debug("Executing DownloadEMail");
            ioc.initializeResponseDocument("DownloadEMail");
    
            // pick up our configuration from the server:
            receiving_host = Settings.getValue(ioc, "server.email.receiving.host");
            receiving_user = Settings.getValue(ioc, "server.email.receiving.username");
            receiving_pass = Settings.getValue(ioc, "server.email.receiving.password");
            receiving_protocol = Settings.getValue(ioc, "server.email.receiving.protocol");
            String tmp_secure = Settings.getValue(ioc, "server.email.receiving.secure");
            receiving_attachments = Settings.getValue(ioc, "server.email.receiving.attachments");
    
            // sanity check on the parameters:
            if(receiving_host == null || receiving_host.length() == 0){
                ioc.SendReturn();
                ioc.Close();
                Log.Trace("Exit");
                return; // no host defined.
            }
            if(receiving_user == null || receiving_user.length() == 0){
                ioc.SendReturn();
                ioc.Close();
                Log.Trace("Exit");
                return; // no user defined.
            }
            if(receiving_pass == null || receiving_pass.length() == 0){
                ioc.SendReturn();
                ioc.Close();
                Log.Trace("Exit");
                return; // no pass defined.
            }
            if(receiving_protocol == null || receiving_protocol.length() == 0){
                Log.Debug("EMail receiving protocol not defined, defaulting to POP");
                receiving_protocol = "POP";
            }
            if(tmp_secure == null || 
                tmp_secure.length() == 0 ||
                tmp_secure.compareToIgnoreCase("false") == 0 ||
                tmp_secure.compareToIgnoreCase("no") == 0
            ){
                receiving_secure = false;
            } else {
                receiving_secure = true;
            }
            if(receiving_attachments == null || receiving_attachments.length() == 0){
                Log.Debug("EMail receiving attachments not defined, defaulting to ./email/attachments/");
                receiving_attachments = "./email/attachments/";
            }
    
            // now do the real work.
            doEMailDownload(ioc);
    
            ioc.SendReturn();
            ioc.Close();
            Log.Trace("Exit");
        }
    
        protected void doEMailDownload(IOConn ioc) throws Exception {
            // Create empty properties
            Properties props = new Properties();
            // Get the session
            Session session = Session.getInstance(props, null);
    
            // Get the store
            Store store = session.getStore(receiving_protocol);
            store.connect(receiving_host, receiving_user, receiving_pass);
    
            // Get folder
            Folder folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);
    
            try {
    
                // Get directory listing
                Message messages[] = folder.getMessages();
    
                for (int i=0; i < messages.length; i++) {
                    // get the details of the message:
                    EMail email = new EMail();
                    email.fromaddr = messages[i].getFrom()[0].toString();
                    Address[] to = messages[i].getRecipients(Message.RecipientType.TO);
                    email.toaddr = "";
                    for(int j = 0; j < to.length; j++){
                        email.toaddr += to[j].toString() + "; ";
                    }
                    Address[] cc;
                    try {
                        cc = messages[i].getRecipients(Message.RecipientType.CC);
                    } catch (Exception e){
                        Log.Warn("Exception retrieving CC addrs: %s", e.getLocalizedMessage());
                        cc = null;
                    }
                    email.cc = "";
                    if(cc != null){
                        for(int j = 0; j < cc.length; j++){
                            email.cc += cc[j].toString() + "; ";
                        }
                    }
                    email.subject = messages[i].getSubject();
                    if(messages[i].getReceivedDate() != null){
                        email.received_when = new Timestamp(messages[i].getReceivedDate().getTime());
                    } else {
                        email.received_when = new Timestamp( (new java.util.Date()).getTime());
                    }
    
    
                    email.body = "";
                    Vector<EMailAttach> vema = new Vector<EMailAttach>();
                    Object content = messages[i].getContent();
                    if(content instanceof java.lang.String){
                        email.body = (String)content;
                    } else if(content instanceof Multipart){
                        Multipart mp = (Multipart)content;
    
                        for (int j=0; j < mp.getCount(); j++) {
                            Part part = mp.getBodyPart(j);
    
                            String disposition = part.getDisposition();
    
                            if (disposition == null) {
                                // Check if plain
                                MimeBodyPart mbp = (MimeBodyPart)part;
                                if (mbp.isMimeType("text/plain")) {
                                    Log.Debug("Mime type is plain");
                                    email.body += (String)mbp.getContent();
                                } else {
                                    Log.Debug("Mime type is not plain");
                                    // Special non-attachment cases here of 
                                    // image/gif, text/html, ...
                                    EMailAttach ema = new EMailAttach();
                                    ema.name = decodeName(part.getFileName());
                                    File savedir = new File(receiving_attachments);
                                    savedir.mkdirs();
                                    File savefile = File.createTempFile("emailattach", ".atch", savedir );
                                    ema.path = savefile.getAbsolutePath();
                                    ema.size = part.getSize();
                                    vema.add(ema);
                                    ema.size = saveFile(savefile, part);
                                }
                            } else if ((disposition != null) && 
                                (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE) ) 
                            ){
                                // Check if plain
                                MimeBodyPart mbp = (MimeBodyPart)part;
                                if (mbp.isMimeType("text/plain")) {
                                    Log.Debug("Mime type is plain");
                                    email.body += (String)mbp.getContent();
                                } else {
                                    Log.Debug("Save file (%s)", part.getFileName() );
                                    EMailAttach ema = new EMailAttach();
                                    ema.name = decodeName(part.getFileName());
                                    File savedir = new File(receiving_attachments);
                                    savedir.mkdirs();
                                    File savefile = File.createTempFile("emailattach", ".atch", savedir );
                                    ema.path = savefile.getAbsolutePath();
                                    ema.size = part.getSize();
                                    vema.add(ema);
                                    ema.size = saveFile( savefile, part);
                                }
                            }
                        }
                    }
    
                    // Insert everything into the database:
                    logic.utils.sql.EMail.insertEMail(ioc, email);
                    for(int j = 0; j < vema.size(); j++){
                        vema.get(j).emailid = email.id;
                        logic.utils.sql.EMail.insertEMailAttach(ioc, vema.get(j) );
                    }
    
                    // commit this message and all of it's attachments
                    ioc.getDBConnection().commit();
    
                    // Finally delete the message from the server.
                    messages[i].setFlag(Flags.Flag.DELETED, true);
                }
    
                // Close connection 
                folder.close(true); // true tells the mail server to expunge deleted messages.
                store.close();
            } catch (Exception e){
                folder.close(true); // true tells the mail server to expunge deleted messages.
                store.close();
                throw e;
            }
    
        }
    
        protected int saveFile(File saveFile, Part part) throws Exception {
    
            BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(saveFile) );
    
            byte[] buff = new byte[2048];
            InputStream is = part.getInputStream();
            int ret = 0, count = 0;
            while( (ret = is.read(buff)) > 0 ){
                bos.write(buff, 0, ret);
                count += ret;
            }
            bos.close();
            is.close();
            return count;
        }
    
        protected String decodeName( String name ) throws Exception {
            if(name == null || name.length() == 0){
                return "unknown";
            }
            String ret = java.net.URLDecoder.decode( name, "UTF-8" );
    
            // also check for a few other things in the string:
            ret = ret.replaceAll("=\\?utf-8\\?q\\?", "");
            ret = ret.replaceAll("\\?=", "");
            ret = ret.replaceAll("=20", " ");
    
            return ret;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-13 03:45

    I used Apache Commons Mail for this task:

    import java.util.List;
    import javax.activation.DataSource; 
    import javax.mail.internet.MimeMessage;   
    import org.apache.commons.mail.util.MimeMessageParser;   
    
    public List<DataSource> getAttachmentList(MimeMessage message) throws Exception {
        msgParser = new MimeMessageParser(message);
        msgParser.parse();
        return msgParser.getAttachmentList();
    }
    

    From a DataSource object you can retrieve an InputStream (beside name and type) of the attachment (see API: http://docs.oracle.com/javase/6/docs/api/javax/activation/DataSource.html?is-external=true).

    0 讨论(0)
  • 2020-12-13 03:48

    I worked Steven's example a little bit and removed the parts of the code specific to Steven. My code won't read the body of an email if it has attachments. That is fine for my case but you may want to refine it further for yours.

    package utils;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    import javax.mail.Address;
    import javax.mail.Flags;
    import javax.mail.Folder;
    import javax.mail.Message;
    import javax.mail.Multipart;
    import javax.mail.Part;
    import javax.mail.Session;
    import javax.mail.Store;
    import javax.mail.internet.MimeBodyPart;
    
    public class IncomingMail {
    
     public static List<Email> downloadPop3(String host, String user, String pass, String downloadDir) throws Exception {
    
      List<Email> emails = new ArrayList<Email>();
    
      // Create empty properties
      Properties props = new Properties();
    
      // Get the session
      Session session = Session.getInstance(props, null);
    
      // Get the store
      Store store = session.getStore("pop3");
      store.connect(host, user, pass);
    
      // Get folder
      Folder folder = store.getFolder("INBOX");
      folder.open(Folder.READ_WRITE);
    
      try {
       // Get directory listing
       Message messages[] = folder.getMessages();
       for (int i = 0; i < messages.length; i++) {
    
        Email email = new Email();
    
        // from 
        email.from = messages[i].getFrom()[0].toString();
    
        // to list
        Address[] toArray = messages[i] .getRecipients(Message.RecipientType.TO);
        for (Address to : toArray) { email.to.add(to.toString()); }
    
        // cc list
        Address[] ccArray = null;
        try {
         ccArray = messages[i] .getRecipients(Message.RecipientType.CC);
        } catch (Exception e) { ccArray = null; }
        if (ccArray != null) {
         for (Address c : ccArray) {
          email.cc.add(c.toString());
         }
        }
    
        // subject
        email.subject = messages[i].getSubject();
    
        // received date
        if (messages[i].getReceivedDate() != null) {
         email.received = messages[i].getReceivedDate();
        } else {
         email.received = new Date();
        }
    
        // body and attachments
        email.body = "";
        Object content = messages[i].getContent();
        if (content instanceof java.lang.String) {
    
         email.body = (String) content;
    
        } else if (content instanceof Multipart) {
    
         Multipart mp = (Multipart) content;
    
         for (int j = 0; j < mp.getCount(); j++) {
    
          Part part = mp.getBodyPart(j);
          String disposition = part.getDisposition();
    
          if (disposition == null) {
    
           MimeBodyPart mbp = (MimeBodyPart) part;
           if (mbp.isMimeType("text/plain")) {
            // Plain
            email.body += (String) mbp.getContent();
           } 
    
          } else if ((disposition != null) && (disposition.equals(Part.ATTACHMENT) || disposition .equals(Part.INLINE))) {
    
           // Check if plain
           MimeBodyPart mbp = (MimeBodyPart) part;
           if (mbp.isMimeType("text/plain")) {
            email.body += (String) mbp.getContent();
           } else {
            EmailAttachment attachment = new EmailAttachment();
            attachment.name = decodeName(part.getFileName());
            File savedir = new File(downloadDir);
            savedir.mkdirs();
            // File savefile = File.createTempFile( "emailattach", ".atch", savedir);
            File savefile = new File(downloadDir,attachment.name);
            attachment.path = savefile.getAbsolutePath();
            attachment.size = saveFile(savefile, part);
            email.attachments.add(attachment);
           }
          }
         } // end of multipart for loop 
        } // end messages for loop
    
        emails.add(email);
    
        // Finally delete the message from the server.
        messages[i].setFlag(Flags.Flag.DELETED, true);
       }
    
       // Close connection
       folder.close(true); // true tells the mail server to expunge deleted messages
       store.close();
    
      } catch (Exception e) {
       folder.close(true); // true tells the mail server to expunge deleted
       store.close();
       throw e;
      }
    
      return emails;
     }
    
     private static String decodeName(String name) throws Exception {
      if (name == null || name.length() == 0) {
       return "unknown";
      }
      String ret = java.net.URLDecoder.decode(name, "UTF-8");
    
      // also check for a few other things in the string:
      ret = ret.replaceAll("=\\?utf-8\\?q\\?", "");
      ret = ret.replaceAll("\\?=", "");
      ret = ret.replaceAll("=20", " ");
    
      return ret;
     }
    
     private static int saveFile(File saveFile, Part part) throws Exception {
    
      BufferedOutputStream bos = new BufferedOutputStream(
        new FileOutputStream(saveFile));
    
      byte[] buff = new byte[2048];
      InputStream is = part.getInputStream();
      int ret = 0, count = 0;
      while ((ret = is.read(buff)) > 0) {
       bos.write(buff, 0, ret);
       count += ret;
      }
      bos.close();
      is.close();
      return count;
     }
    
    }
    

    You also need these two helper classes

    package utils;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class Email {
    
     public Date received;
     public String from;
     public List<String> to = new ArrayList<String>();
     public List<String> cc = new ArrayList<String>();
     public String subject;
     public String body;
     public List<EmailAttachment> attachments = new ArrayList<EmailAttachment>();
    }
    

    and

    package utils;
    
    public class EmailAttachment {
    
     public String name;
     public String path;
     public int size;
    }
    

    I used this to test the above classes

    package utils;
    
    import java.util.List;
    
    
    public class Test {
    
     public static void main(String[] args) {
    
      String host = "some host";
      String user = "some user";
      String pass = "some pass";
      String downloadDir = "/Temp";
      try {
       List<Email> emails = IncomingMail.downloadPop3(host, user, pass, downloadDir);
       for ( Email email : emails ) {
        System.out.println(email.from);
        System.out.println(email.subject);
        System.out.println(email.body);
        List<EmailAttachment> attachments = email.attachments;
        for ( EmailAttachment attachment : attachments ) {
         System.out.println(attachment.path+" "+attachment.name);
        }
       }
      } catch (Exception e) { e.printStackTrace(); }
    
     }
    
    }
    

    More info can be found at http://java.sun.com/developer/onlineTraining/JavaMail/contents.html

    0 讨论(0)
  • 2020-12-13 03:48

    Thus far, I've only used the JavaMail APIs (and I've been reasonably happy with them for my purposes). If the full JavaMail package is too heavy for you, the underlying transport engine can be used without the top layers of the package. The lower you go in the SMTP, POP3 and IMAP stacks, the more you have to be prepared to do for yourself.

    On the bright side, you'll also be able to ignore the parts that aren't required for your application.

    0 讨论(0)
提交回复
热议问题