java邮件附件下载_用Java下载邮件附件

这是我用来下载电子邮件的类(附件处理).您将不得不浏览它正在做的一些事情(比如忽略日志记录类和数据库写入).为了便于阅读,我还重新命名了一些软件包.

一般的想法是所有附件都保存为文件系统中的单个文件,并且每个电子邮件都作为记录保存在数据库中,并带有一组指向所有附件文件路径的子记录.

专注于doEMailDownload方法.

/**

* 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 vema = new Vector();

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;

}

}


版权声明:本文为weixin_30975527原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。