📄 mailviewsource.java
字号:
/*
<class>MyNa.xml.MailViewSource</class>
<useclass>MyNa.xml.RowViewSource</useclass>
<dbDriver>pop3</dbDriver>
<dbName>mail.dreamscape.com</dbName>
<dbUser>JohnSmith</dbUser>
<dbPwd>hArd-tO-gUEss?</dbPwd>
<dbSource>INBOX</dbSource>
<theColumnLabels>msgsubject,msgdate,msgflags,msgfromaddr</theColumnLabels>
<verbose>true</verbose>
<debug>true</debug>
*/
/* The MailViewSource provides access to one mail folder
at a time, in the form of a RowViewSource. It's initializable
by an xml file via the XmlConfig interface. We assume that the
first request will always be "initSession", and that close()
will be called at the end.
*/
package MyNa.xml;
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import MyNa.utils.*;
import org.w3c.dom.Node;
import java.sql.*;
public class MailViewSource extends XmlConfigBase
implements RowViewSource{
Env msgEnv; Logger lg;
String protocol; // pop3, imap
int port; // -1 is fine
String host; // x.y.com, mail source
String dbUser; // userId for mail
String dbPwd;
String retaddr;
String mbox; // current mailbox name; INBOX only for pop3
boolean expunge; // if true, deletions stay gone.
int rownum; // used for individual extraction/deletion
String[]columnLabels;
String[]columnTypes;
String errorType;
String errorMessage;
Session session;
Store store;
Folder folder;
FetchProfile fp;
public MailViewSource(){
lg=new Logger(); msgEnv=new Env();
columnLabels=MessageData.getDefaultLabels();
errorType=null; errorMessage=null;
session=null; store=null; folder=null;
}
public void setInitDefs(Env E){
if(msgEnv==null)msgEnv=E;
else msgEnv.addHashtable(E);
}
private boolean ok(String S){return null!=S && S.length()>0;}
public void setDbDriver(String S){if(ok(S))protocol=S;}
public void setDbName(String S){if(ok(S))host=S;}
public void setDbUser(String S){if(ok(S))dbUser=S;}
public void setDbPwd(String S){if(ok(S))dbPwd=S;}
public void setRetaddr(String S){if(ok(S))retaddr=S;}
public void setExpunge(String S){
if(ok(S))expunge=(new Boolean(S)).booleanValue();
}
public void setRowNum(String S){
if(ok(S))rownum=Integer.parseInt(S);
}
public void setRowNum(int N){rownum=N;}
public void setPort(String S){
if(ok(S))port=Integer.parseInt(S);
}
public void setDbSource(String S){
if(!ok(S))return;
mbox=S;
if(null==folder)return; // on init or error, don't try anything
if(!initFolder())return; // get back to default folder...
enterFolder();
}
public void setSession(Session s){session=s;}
public void setColumnLabels(String[]A){
columnLabels=A; int N=0;
if(columnTypes==null ||
columnTypes.length!=(N=columnLabels.length)){
columnTypes=new String[N];
for(int i=0;i<N;i++)columnTypes[i]="VARCHAR";
}
}
public void setColumnLabels(String S){
if(ok(S))setColumnLabels(Misc.stringSplit(S,','));
}
public void setColumnTypes(String S){
if(ok(S))columnTypes=Misc.stringSplit(S,',');
}
public void setColumnTypes(String[] columnTypes){
this.columnTypes=columnTypes;
}
public void setMiscError(String S){
errorType="miscError"; errorMessage=S;
}
public void setLoginError(String S){
errorType="loginError"; errorMessage=S;
}
public void setString(String nm,String val){
lg.logIt("(mVS.setString):"+nm+"=?"+val);
if(nm==null)return;
if(nm.equals("dbDriver"))setDbDriver(val);
else if(nm.equals("dbName"))setDbName(val);
else if(nm.equals("dbUser"))setDbUser(val);
else if(nm.equals("dbPwd"))setDbPwd(val);
else if(nm.equals("dbSource"))setDbSource(val);
else if(nm.equals("expunge"))setExpunge(val);
else if(nm.equals("rownum"))setRowNum(val);
else if(nm.equals("verbose"))setVerbose(val);
else if(nm.equals("debug"))setDebug(val);
else if(nm.equals("retaddr"))setRetaddr(val);
else if(nm.equals("port"))setPort(val);
else if(nm.equals("columnLabels"))setColumnLabels(val);
else if(nm.equals("beanName"))setBeanName(val);
else lg.logIt("(MailViewSource) no such setString: "+nm+"!="+val);
}
public int getRowNum(){return rownum;}
public String getString(String key){
if(key==null)return null;
if(key.equals("errorMessage"))return getErrorMessage();
if(key.equals("errorType"))return getErrorType();
if(key.equals("dbSource"))return mbox;
if(key.equals("rownum"))return ""+rownum;
return null;
}
public void initSession(Env E) throws Exception{
Session sess=(Session)E.get("msgSession");
if(null!=sess)setSession(sess);
store = session.getStore(protocol);
store.connect(host, port, dbUser, dbPwd);
initFetchProfile();
lg.logIt("MVS: initSession() got store and fetchProfile");
}
public boolean hasError(){
return (null!=errorMessage && errorMessage.length()>0);
}
public void unsetError(){errorMessage=null;}
public String getErrorMessage(){
String S=errorMessage; errorMessage=null; return S;
}
public String getErrorType(){return errorType;}
public String[]getColumnLabels(){return columnLabels;}
public String[]getColumnTypes(){return columnTypes;}
public int getNumberOfColumns(){return columnLabels.length;}
public boolean checkFolder(){
try{
if(folder!=null)return true;
if(!initFolder())return false;
lg.logIt("MVS.checkfolder initialized folder");
if(!enterFolder())return false;
lg.logIt("MVS.checkFolder succeeded");
return true; // if we got here, the folder is open.
}
catch(Exception ex){setMiscError("check folder error: "+mbox+"\n"+ex);}
return false;
}
public RowSeq getRowList(){ // with columnLabels as in msgEnv
try{
lg.logIt("MVS.getRowList, mbox="+mbox);
if(!checkFolder())return null;
msgEnv.put("columnLabels",columnLabels);
return new MailSequence(folder,fp,msgEnv);
}catch(MessagingException ex){
setMiscError("MVS.getRowList(): failed to get message list: "+ex);
return null;
}catch(Exception E){
setMiscError("MVS.getRowList(): err in getting MailSequence: "+E);
return null;
}
}
public RowSeq getAllColumnsRowList(){ // use all column labels;
String[]cL=columnLabels;
columnLabels=MessageData.getAllLabels();
RowSeq rE=getRowList();
columnLabels=cL;
return rE;
}
public void initFetchProfile(){
fp = new FetchProfile();
fp.add(FetchProfile.Item.ENVELOPE);
fp.add(FetchProfile.Item.FLAGS);
}
public Env getRow(int N){
if(N <=0 || !checkFolder())return msgEnv; // miscError set.
rownum=N;
try {
Message m=folder.getMessage(rownum);
MessageData md=new MessageData(m,columnLabels);
md.addToEnv(msgEnv); // as in messageList
msgEnv.put("msgcontent",md.getContentString());
}catch (IndexOutOfBoundsException iex) {
setMiscError("getRow: Message number "+rownum+" is out of range");
}catch (Exception ex) {
setMiscError("getRow error: "+ex);
}
return msgEnv;
}
public void delRow(int N){
if(!checkFolder())return;
try{deleteMessageRange(N,N);}
catch(MessagingException e){setMiscError(""+e);}
}
public void delRowRange(int start,int end){
if(!checkFolder())return;
try{deleteMessageRange(start,end);}
catch(Exception E){setMiscError("error in deletion: "+E);}
}
public void sendTo(String sourceType,String sourceName){
if("mail".equalsIgnoreCase(sourceType))sendToMail(sourceName);
else if("db".equalsIgnoreCase(sourceType))sendToDB(sourceName);
else if("file".equalsIgnoreCase(sourceType))sendToXMLFile(sourceName);
else if("string".equalsIgnoreCase(sourceType))
sendToXMLString(sourceName); // result in msgEnv.
else setMiscError("unknown sourceType "+sourceType+" for sendTo");
}
public void sendTo(Env E){
sendTo(msgEnv.getStr("sourceType","mail"),
msgEnv.getStr("sourceName",retaddr));
}
public void sendToMail(String msgtoaddr){
try{forwardMessageList(msgtoaddr);
}catch(Exception E){setMiscError("can't mail to "+msgtoaddr+": "+E);}
}
public void sendToXMLFile(String fileName){
try{
Writer out=new BufferedWriter(new FileWriter(new File(fileName)));
sendToXML(out);
out.close();
}catch(Exception E){setMiscError("can't save to "+fileName+": "+E);}
}
public void sendToXMLString(String name){
try{
StringWriter sw=new StringWriter();
sendToXML(sw);
msgEnv.put(name,sw.toString());
lg.logIt("sendToXMLString("+name+") produces \n"+msgEnv.getStr(name));
}catch(Exception ex){msgEnv.put(name,"MVS.sendToXMLString error: "+ex);}
}
public void sendToXML(Writer out)throws Exception{
msgEnv.put("OutputWriter",out);
msgEnv.put("tableName",mbox);
RowSeq rE=getAllColumnsRowList();
if(!hasError() && rE!=null)rE.toXML();
}
public void sendToDB(Connection conn,String tableName,boolean reset)
throws Exception{
RowSeq rE=getAllColumnsRowList();
if(!hasError() && rE!=null)rE.toDB(conn,tableName,reset);
}
public void sendToDB(String mailboxName){ // won't normally be used...fallback.
Connection conn=null;
try{
String dbDriver=msgEnv.getStr("jdbcDriver","sun.jdbc.odbc.JdbcOdbcDriver");
String dbUrl=msgEnv.getStr("jdbcUrl","jdbc:odbc:MAIL");
String user=msgEnv.getStr("jdbcUser",dbUser);
String pwd=msgEnv.getStr("jdbcPwd",dbPwd);
Class.forName(dbDriver);
conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);
sendToDB(conn,mailboxName,false);
}catch(Exception E){
setMiscError("can't save to db box "+mailboxName+": "+E);
}finally{try{if(null!=conn)conn.close();}catch(Exception e){}}
}
public void close(){
try{
lg.logIt("closing folder, store with expungeDeleted="+expunge);
if(null!=folder)folder.close(expunge);
if(null!=store)store.close();
session=null;
}catch(Exception E){setMiscError("closing error "+E);}
}
public void forwardMessageList(String msgtoaddr)throws Exception{
RowSeq msgs=getAllColumnsRowList();
if(hasError())return;
msgs=new MapRowSeq("msgtoaddr",msgtoaddr,msgs);
msgs.toMail();
}
public boolean initFolder(){ // gets to default folder
try{
if(null!=folder && folder.isOpen())
folder.close(expunge); // reset
if(null==store){ // bad session somehow...
initSession(msgEnv);
if(hasError())return false;
}
folder = store.getDefaultFolder();
return true;
}catch(Exception E){
setMiscError("MVS initFolder: "+E); return false;
}
}
public boolean enterFolder(){ // set to mbox name
try{if(null==folder)if(!initFolder())return false;}
catch(Exception E){
folder=null;
setMiscError("enterFolder failed to get default for "+mbox+"\n"+E);
return false;
} // if we got here, folder is default folder.
try{
folder = folder.getFolder(mbox);
folder.open(Folder.READ_WRITE);
}catch(MessagingException E){
setMiscError("enter folder failed: "+mbox+"\n"+E);
return false;
}
return true;
}
public boolean deleteMessageRange(int start,int end)
throws MessagingException{
Message[] msgs = folder.getMessages(start, end);
setMiscError("can't delete messages "+start+".."+end);
if(msgs.length==0)return false;
// folder.copyMessages(msgs, trashfolder);
folder.setFlags(msgs, new Flags(Flags.Flag.DELETED), true);
for (int i = 0; i < msgs.length; i++)
if (!msgs[i].isSet(Flags.Flag.DELETED))return false;
unsetError();
return true;
}
public void addRow(String[]fieldNames,String[]vals){
/* NOT IMPLEMENTED IN THIS EXAMPLE */
// construct a message, call folder.appendMessages()
}
public void delRowSearch(String field,String pat){
/* NOT IMPLEMENTED IN THIS EXAMPLE */
// loop through RowSeq.next().getStr(field),
// test val.indexOf(pat)>=0, call delRow(loop counter)
}
// deletes rows in which that field contains pat.
public RowSeq getFilteredRowList(String field,String pat){
return null;
/* NOT IMPLEMENTED IN THIS EXAMPLE */
}
public void delRows(String[]fieldNames,String[]vals){
/* NOT IMPLEMENTED IN THIS EXAMPLE */
// same structure as delRowSearch
}
// deletes rows in which each of those fieldnames
// has exactly the corresponding value, apart from
// case (nulls match each other).
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -