⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mailviewsource.java

📁 java xml开发指南(初学者推荐)Java Xml 编程指南书籍源码
💻 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 + -