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

📄 webmailsession.java

📁 这是个JAVA开发的WEB邮箱
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* CVS ID: $Id: WebMailSession.java,v 1.14 2001/03/26 17:08:11 wastl Exp $ */package net.wastl.webmail.server;import java.net.*;import java.io.*;import java.util.*;import java.text.*;import javax.mail.*;import javax.mail.event.*;import javax.mail.internet.*;import net.wastl.webmail.misc.*;import net.wastl.webmail.xml.*;// No longer used://import net.wastl.webmail.ui.html.JavaScriptFilter;//import net.wastl.webmail.ui.html.HTMLifier;import net.wastl.webmail.ui.html.Fancyfier;import net.wastl.webmail.server.http.HTTPRequestHeader;import net.wastl.webmail.exceptions.*;// Modified by exce, startimport org.bulbul.webmail.util.TranscodeUtil;// Modified by exce, endimport org.w3c.tidy.Tidy;import org.w3c.dom.*;/* * WebMailSession.java * * Created: Thu Feb  4 12:59:30 1999 * * Copyright (C) 1999-2001 Sebastian Schaffert *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. *  * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. *//** * A user session for WebMail. * Contains the state of the actual user (loads it from disk). * Has a unique session-ID. * * * @author Sebastian Schaffert * @version $Revision: 1.14 $ *//* 9/24/2000 devink - updated for challenge/response auth */public class WebMailSession implements HTTPSession {	    /** When has the session been last accessed? */    private long last_access;    /** The session-ID for this session */    private String session_code;    /** Parent WebMailServer */    private WebMailServer parent;    /** State of the current users configuration */    private XMLUserData user;    private XMLUserModel model;    /** Connections to Mailboxes */    private Hashtable connections;        /** Connections to hosts */    private Hashtable stores;    /** javax.mail Mailsession */    private Session mailsession;	    private InetAddress remote;	    /* Files attached to messages will be stored here. We will have to take care of       possible memory problems! */    private Hashtable mime_parts_decoded;	    private boolean sent;	    private String remote_agent;    private String remote_accepts;	    private int attachments_size=0;	    private String last_login;	    /** Save the login password. It will be used for the second try password if     * opening a folder fails.     */    private String login_password;	    private Object sess=null;    private Hashtable folders;    protected Vector need_expunge_folders;    protected boolean is_logged_out=false;		    	    public WebMailSession(WebMailServer parent,Object parm,HTTPRequestHeader h) 	 throws UserDataException, InvalidPasswordException {	try {	    Class srvltreq=Class.forName("javax.servlet.http.HttpServletRequest");	    if(srvltreq.isInstance(parm)) {		javax.servlet.http.HttpServletRequest req=(javax.servlet.http.HttpServletRequest)parm;		this.sess=req.getSession(false);		session_code=((javax.servlet.http.HttpSession)sess).getId();						try {		    remote=InetAddress.getByName(req.getRemoteHost());		} catch(UnknownHostException e) {		    try {			remote=InetAddress.getByName(req.getRemoteAddr());		    } catch(Exception ex) {			try {			    remote=InetAddress.getByName("localhost");			} catch(Exception ex2) {}		    }		}	    } else {		throw new Exception("Servlet class found but not running as servlet");	    }	} catch(Throwable t) {	    this.remote=(InetAddress)parm;	    session_code=Helper.calcSessionCode(remote,h);	}	doInit(parent,h);		    }	    /**     * This method does the actual initialisation     *     * devink 7/15/2000 - added TwoPassAuthenticationException      *                  - updated call to getUserData(), to use my new one.     * devink 9/24/2000 - reverted back to old getUserData call     */    protected void doInit(WebMailServer parent, HTTPRequestHeader h) 	 throws UserDataException, InvalidPasswordException {	setLastAccess();	this.parent=parent;	remote_agent=h.getHeader("User-Agent").replace('\n',' ');	remote_accepts=h.getHeader("Accept").replace('\n',' ');	parent.getStorage().log(Storage.LOG_INFO,"WebMail: New Session ("+session_code+")");	user=WebMailServer.getStorage().getUserData(h.getContent("login"),h.getContent("vdom"),h.getContent("password"),true);       	last_login=user.getLastLogin();	user.login();	login_password=h.getContent("password");	model=parent.getStorage().createXMLUserModel(user);	connections=new Hashtable();	stores=new Hashtable();	folders=new Hashtable();	mailsession=Session.getDefaultInstance(System.getProperties(),null);	/* If the user logs in for the first time we want all folders subscribed */	if(user.getLoginCount().equals("1")) {	    Enumeration enum=user.mailHosts();	    while(enum.hasMoreElements()) {		String id=(String)enum.nextElement();		if(user.getMailHost(id).getName().equals("Default")) {		    try {			setSubscribedAll(id,true);		    } catch(MessagingException ex) {			ex.printStackTrace();		    }		    break;		}	    }	}	setEnv();    }    public XMLUserModel getUserModel() {	return model;    }    public Document getModel() {	return model.getRoot();    }	    /**     * Calculate session-ID for a session.     *     * @param a Adress of the remote host     * @param h Requestheader of the remote user agent     * @returns Session-ID     */    public String calcCode(InetAddress a, HTTPRequestHeader h) {	if(sess==null) {	    return Helper.calcSessionCode(a,h);	} else {	    try {		Class srvltreq=Class.forName("javax.servlet.http.HttpSession");		if(srvltreq.isInstance(sess)) {		    return ((javax.servlet.http.HttpSession)sess).getId();		} else {		    return "error";		}	    } catch(Throwable t) {		return "error";	    }	}    }	    /**     * Login to this session.     * Establishes connections to a user磗 Mailhosts     *     * @param h RequestHeader with content from Login-POST operation.     * @deprecated Use login() instead, no need for parameters and exception handling     */    public void login(HTTPRequestHeader h) throws InvalidPasswordException {	//user.login(h.getContent("password"));	login();    }    /**     * Login this session.     *     * Updates access time, sets initial environment and connects all configured mailboxes.     */    public void login() {	setLastAccess();	setEnv();	connectAll();    }			    /**     * Return a locale-specific string resource     */    public String getStringResource(String key) {	return parent.getStorage().getStringResource(key,user.getPreferredLocale());    }        /**     * Create a Message List.     * Fetches a list of headers in folder foldername for part list_part.     * The messagelist will be stored in the "MESSAGES" environment.     *     * @param foldername folder for which a message list should be built     * @param list_part part of list to display (1 = last xx messages, 2 = total-2*xx - total-xx messages)     */    public void createMessageList(String folderhash,int list_part) 	throws NoSuchFolderException {	long time_start=System.currentTimeMillis();	TimeZone tz=TimeZone.getDefault();	DateFormat df=DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, user.getPreferredLocale());	df.setTimeZone(tz);	try {				    Folder folder=getFolder(folderhash);	    Element xml_folder=model.getFolder(folderhash);	    Element xml_current=model.setCurrentFolder(folderhash);	    Element xml_messagelist=model.getMessageList(xml_folder);	    if(folder == null) {		throw new NoSuchFolderException(folderhash);	    }						    long fetch_start=System.currentTimeMillis();				    if(!folder.isOpen()) {		folder.open(Folder.READ_ONLY);	    } else {		folder.close(false);		folder.open(Folder.READ_ONLY);	    }				    /* Calculate first and last message to show */	    int total_messages=folder.getMessageCount();	    int new_messages=folder.getNewMessageCount();	    int show_msgs=user.getMaxShowMessages();	    	    xml_messagelist.setAttribute("total",total_messages+"");	    xml_messagelist.setAttribute("new",new_messages+"");// 	    System.err.println("Total: "+total_messages);	    /* Handle small messagelists correctly */	    if(total_messages < show_msgs) {		show_msgs = total_messages;	    }	    /* Don't accept list-parts smaller than 1 */	    if(list_part < 1) {		list_part=1;	    }	    for(int k=0;k<list_part;k++) {		total_messages-=show_msgs;	    }	    /* Handle beginning of message list */	    if(total_messages<0) {		total_messages=0;	    }	    int first=total_messages+1;	    int last=total_messages+show_msgs;	    /* Set environment variable */	    setEnv();	    xml_current.setAttribute("first_msg",first+"");	    xml_current.setAttribute("last_msg",last+"");	    xml_current.setAttribute("list_part",list_part+"");	    /* Fetch headers */	    FetchProfile fp=new FetchProfile();	    fp.add(FetchProfile.Item.ENVELOPE);	    fp.add(FetchProfile.Item.FLAGS);	    fp.add(FetchProfile.Item.CONTENT_INFO);// 	    System.err.println("Last: "+last+", first: "+first);	    Message[] msgs=folder.getMessages(first,last);	    //System.err.println(msgs.length + " messages fetching...");	    folder.fetch(msgs,fp);	    long fetch_stop=System.currentTimeMillis();				    Hashtable header=new Hashtable(15);							    Flags.Flag[] sf;	    String from,to,cc,bcc,replyto,subject;	    String messageid;	    for(int i=msgs.length-1; i>=0; i--) {// 		if(((MimeMessage)msgs[i]).getMessageID() == null) {// 		    folder.close(false);// 		    folder.open(Folder.READ_WRITE);// 		    ((MimeMessage)msgs[i]).setHeader("Message-ID","<"+user.getLogin()+"."+System.currentTimeMillis()+".jwebmail@"+user.getDomain()+">");// 		    ((MimeMessage)msgs[i]).saveChanges();// 		    folder.close(false);// 		    folder.open(Folder.READ_ONLY);// 		}		try {		    StringTokenizer tok=new StringTokenizer(((MimeMessage)msgs[i]).getMessageID(),"<>");		    messageid=tok.nextToken();		} catch(NullPointerException ex) {		    // For mail servers that don't generate a Message-ID (Outlook et al)		    messageid=user.getLogin()+"."+i+".jwebmail@"+user.getDomain();		}       		XMLMessage xml_message=model.getMessage(xml_folder,msgs[i].getMessageNumber()+"",						     messageid);		    				/* Addresses */		from="";replyto="";to="";cc="";bcc="";		try {		   		    from=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getFrom()));		    replyto=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getReplyTo()));		    to=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.TO)));		    cc=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.CC)));		    bcc=MimeUtility.decodeText(Helper.joinAddress(msgs[i].getRecipients(Message.RecipientType.BCC)));		} catch(UnsupportedEncodingException e) {		    parent.getStorage().log(Storage.LOG_WARN,"Unsupported Encoding: "+e.getMessage());		}		if(from=="") from=getStringResource("unknown sender");		if(to == "") to = getStringResource("unknown recipient");		   		    				/* Flags */		sf = msgs[i].getFlags().getSystemFlags();		String basepath=parent.getBasePath();		    		for(int j=0;j<sf.length;j++) {		    if(sf[j]==Flags.Flag.RECENT) xml_message.setAttribute("recent","true");		    if(sf[j]==Flags.Flag.SEEN) xml_message.setAttribute("seen","true");		    if(sf[j]==Flags.Flag.DELETED) xml_message.setAttribute("deleted","true");		    if(sf[j]==Flags.Flag.ANSWERED) xml_message.setAttribute("answered","true");		    if(sf[j]==Flags.Flag.DRAFT) xml_message.setAttribute("draft","true");		    if(sf[j]==Flags.Flag.FLAGGED) xml_message.setAttribute("flagged","true");		    if(sf[j]==Flags.Flag.USER) xml_message.setAttribute("user","true");		}		if(msgs[i] instanceof MimeMessage && 		   ((MimeMessage) msgs[i]).getContentType().toUpperCase().startsWith("MULTIPART/")) {		    xml_message.setAttribute("attachment","true");		}		    		if(msgs[i] instanceof MimeMessage) {		    int size=((MimeMessage) msgs[i]).getSize();		    size/=1024;		    xml_message.setAttribute("size",(size>0?size+"":"<1")+" kB");		}		    		/* Subject */		subject="";		if(msgs[i].getSubject() != null) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -