📄 emailprocessor.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.server;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import javax.mail.*;
import org.compiere.*;
import org.compiere.model.*;
import org.compiere.util.*;
/**
* Request Mail Processor
*
* @author Jorg Janke
* @version $Id: EMailProcessor.java,v 1.7 2005/09/24 01:51:06 jjanke Exp $
*/
public class EMailProcessor
{
/**
* EMail Processor
* @param client client
*/
public EMailProcessor (MClient client)
{
this (client.getSMTPHost(), client.getRequestUser(), client.getRequestUserPW());
} // EMailProcessor
/**
* EMail Processor
*/
public EMailProcessor (String host, String user, String password)
{
m_host = host;
m_user = user;
m_pass = password;
} // EMail
/** EMail Host Parameter */
private String m_host = null;
/** EMail User Parameter */
private String m_user = null;
/** Password Parameter */
private String m_pass = null;
/** Session */
private Session m_session = null;
/** Store */
private Store m_store = null;
/** Logger */
protected CLogger log = CLogger.getCLogger(getClass());
/** Process Error */
private static final int ERROR = 0;
/** Process Request */
private static final int REQUEST = 1;
/** Process Workflow */
private static final int WORKFLOW = 2;
/** Process Delivery Confirm */
private static final int DELIVERY = 9;
/**
* Process Messages in InBox
* @return number of mails processed
*/
public int processMessages()
{
int processed = 0;
try
{
getSession();
getStore();
processed = processInBox();
}
catch (Exception e)
{
log.log(Level.SEVERE, "processInBox", e);
}
// Cleanup
try
{
if (m_store.isConnected())
m_store.close();
}
catch (Exception e)
{
}
m_store = null;
return processed;
} // processMessages
/**************************************************************************
* Get Session
* @return Session
*/
private Session getSession() throws Exception
{
if (m_session != null)
return m_session;
// Session
Properties props = System.getProperties();
props.put("mail.store.protocol", "smtp");
props.put("mail.transport.protocol", "smtp");
props.put("mail.host", m_host);
props.put("mail.smtp.auth","true");
EMailAuthenticator auth = new EMailAuthenticator (m_user, m_pass);
//
m_session = Session.getDefaultInstance(props, auth);
m_session.setDebug(CLogMgt.isLevelFinest());
log.fine("getSession - " + m_session);
return m_session;
} // getSession
/**
* Get Store
* @return Store
*/
private Store getStore() throws Exception
{
if (m_store != null)
return m_store;
if (getSession() == null)
throw new IllegalStateException("No Session");
// Get IMAP Store
m_store = m_session.getStore("imap");
// Connect
m_store.connect();
//
log.fine("getStore - " + m_store);
return m_store;
} // getStore
/**
* Process InBox
* @return number of processed
* @throws Exception
*/
private int processInBox() throws Exception
{
// Folder
Folder folder;
folder = m_store.getDefaultFolder();
if (folder == null)
throw new IllegalStateException("No default folder");
// Open Inbox
Folder inbox = folder.getFolder("INBOX");
if (!inbox.exists())
throw new IllegalStateException("No Inbox");
inbox.open(Folder.READ_WRITE);
log.fine("processInBox - " + inbox.getName()
+ "; Messages Total=" + inbox.getMessageCount()
+ "; New=" + inbox.getNewMessageCount());
// Open Request
Folder requestFolder = folder.getFolder("CRequest");
if (!requestFolder.exists() && !requestFolder.create(Folder.HOLDS_MESSAGES))
throw new IllegalStateException("Cannot create Request Folder");
requestFolder.open(Folder.READ_WRITE);
// Open Workflow
Folder workflowFolder = folder.getFolder("CWorkflow");
if (!workflowFolder.exists() && !workflowFolder.create(Folder.HOLDS_MESSAGES))
throw new IllegalStateException("Cannot create Workflow Folder");
workflowFolder.open(Folder.READ_WRITE);
// Open Error
Folder errorFolder = folder.getFolder("CompiereError");
if (!errorFolder.exists() && !errorFolder.create(Folder.HOLDS_MESSAGES))
throw new IllegalStateException("Cannot create Error Folder");
errorFolder.open(Folder.READ_WRITE);
// Messages
Message[] messages = inbox.getMessages();
/**
FetchProfile fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
fp.add("X-Mailer");
inbox.fetch(messages, fp);
**/
//
int noProcessed = 0;
int noError = 0;
for (int i = 0; i < messages.length; i++)
// for (int i = messages.length-1; i >= 0; i--) // newest first
{
Message msg = messages[i];
int result = processMessage (msg);
if (result == REQUEST)
{
msg.setFlag(Flags.Flag.SEEN, true);
msg.setFlag(Flags.Flag.ANSWERED, true);
// Copy to processed
requestFolder.appendMessages(new Message[]{msg});
}
else if (result == WORKFLOW)
{
msg.setFlag(Flags.Flag.SEEN, true);
msg.setFlag(Flags.Flag.ANSWERED, true);
// Copy to processed
workflowFolder.appendMessages(new Message[]{msg});
}
else if (result == DELIVERY)
{
msg.setFlag(Flags.Flag.SEEN, true);
msg.setFlag(Flags.Flag.ANSWERED, true);
}
else // error
{
errorFolder.appendMessages(new Message[]{msg});
noError++;
}
// Delete in InBox
// msg.setFlag(Flags.Flag.DELETED, true);
// Message[] deleted = inbox.expunge();
//
noProcessed++;
}
log.info("processInBox - Total=" + noProcessed + " - Errors=" + noError);
// Fini
errorFolder.close(false);
requestFolder.close(false);
workflowFolder.close(false);
//
inbox.close(true);
return noProcessed;
} // processInBox
/**
* Process Message
* @param msg message
* @return Type of Message
*/
private int processMessage (Message msg) throws Exception
{
dumpEnvelope (msg);
dumpBody (msg);
printOut (":::::::::::::::");
printOut (getSubject(msg));
printOut (":::::::::::::::");
printOut (getMessage(msg));
printOut (":::::::::::::::");
String delivery = getDeliveryReport(msg);
printOut (delivery);
printOut (":::::::::::::::");
// if (delivery != null)
// return DELIVERY;
// Unknown
return ERROR;
} // processMessage
/**
* Get Subject
* @param msg message
* @return subject or ""
*/
private String getSubject (Message msg)
{
try
{
String str = msg.getSubject();
if (str != null)
return str.trim();
}
catch (MessagingException e)
{
log.log(Level.SEVERE, "getSubject", e);
}
return "";
} // getSubject
/**
* Get Message
* @param msg Message
* @return message or ""
*/
private String getMessage (Part msg)
{
StringBuffer sb = new StringBuffer();
try
{
// Text
if (msg.isMimeType("text/plain"))
{
sb.append(msg.getContent());
}
// Other Text (e.g. html/xml)
else if (msg.isMimeType("text/*"))
{
sb.append(msg.getContent());
}
// Nested
else if (msg.isMimeType("message/rfc822"))
{
sb.append(msg.getContent());
}
// Multi Part Alternative
else if (msg.isMimeType("multipart/alternative"))
{
String plainText = null;
String otherStuff = null;
//
Multipart mp = (Multipart)msg.getContent();
int count = mp.getCount();
for (int i = 0; i < count; i++)
{
Part part = mp.getBodyPart(i);
Object content = part.getContent();
if (content == null || content.toString().trim().length() == 0)
continue;
if (part.isMimeType("text/plain"))
plainText = content.toString();
else
otherStuff = content.toString();
}
if (plainText != null)
sb.append(plainText);
else if (otherStuff != null)
sb.append(otherStuff);
}
// Multi Part
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -