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

📄 jdavmailservice.java

📁 一个接收基于WebDav邮件的开源项目
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
		if (m_rootFolder == null) {
			String strRootURL = super.url.getFile();
			if (strRootURL.charAt(0) != '/') {
				strRootURL = "/" + strRootURL;
			}
			QueryFoldersMethod m = new QueryFoldersMethod(strRootURL);
			try {
				if (!executeMethod(m)) {
					close();
					return false;	// authentication error
				}
				Document docFolders = saxBuilder.build(m.getResponseBodyAsStream());

				if (m_log.isTraceEnabled()) {
					m_log.trace(new XMLOutputter(Format.getPrettyFormat()).outputString(docFolders));
				}
			
				Element elemResponse = docFolders.getRootElement().getChild("response", JDAVMail.NS_DAV);
				m_rootFolder = FolderProxy.createRootInstance(this, elemResponse);
				m_sendMsgFolder = FolderProxy.createSendMsgInstance(this, elemResponse);
			} finally {
				m.releaseConnection();
			}
		}
		
		GetFolderInfoMethod gfim = new GetFolderInfoMethod(m_rootFolder);
		Document docRootFolderProxy = null; 
		try {
			executeMethod(gfim);
			docRootFolderProxy = saxBuilder.build(gfim.getResponseBodyAsStream());
		} finally {
			gfim.releaseConnection();
		}

		if (m_log.isTraceEnabled()) {
			m_log.trace(new XMLOutputter(Format.getPrettyFormat()).outputString(docRootFolderProxy));
		}
		
		FolderProxy foldersToDelete[] = m_rootFolder.getChildren();
		List listFolders = docRootFolderProxy.getRootElement().getChildren("response", JDAVMail.NS_DAV);
		for (Iterator iterFolders = listFolders.iterator(); iterFolders.hasNext(); ) {
			FolderProxy fp = FolderProxy.getInstance(this, (Element) iterFolders.next());
			if (fp != null) {
				String strName = fp.getName();
				
				// Remove from the 'to delete' array
				for (int i = 0; i < foldersToDelete.length; i++) {
					if (foldersToDelete[i] != null) {
						if (strName.equals(foldersToDelete[i].getName())) {
							foldersToDelete[i] = null;
							break;
						}
					}
				}
				
				FolderProxy fpExisting = m_rootFolder.getChild(strName);
				if (fpExisting == null) {
					m_rootFolder.addChild(fp);
				} else {
					fpExisting.refreshWith(fp);
				}
			}
		}
		
		// Delete 'disapeared' folders
		for (int i = 0; i < foldersToDelete.length; i++) {
			if (foldersToDelete[i] != null) {
				m_rootFolder.removeChild(foldersToDelete[i]);
			}
		}
		
		return true;
	}
	
    /**
     */
    public boolean isConnected() {
		return (m_http != null);
    }

	/**
	 */
    public synchronized void close() throws MessagingException {
	    super.close();
		m_http = null;
		m_rootFolder = null;
    }

	/**
	 */
    protected void finalize() throws Throwable {
		super.finalize();
		close();
	}

	/**
	 */
    protected Folder getDefaultFolder(JDAVMailStore store) throws MessagingException {
		return new JDAVMailFolder(store, m_rootFolder);
    }

	/**
	 */
    private void checkConnected() throws IllegalStateException {
		if (!isConnected()) {
			throw new IllegalStateException("Service not connected");
		}
    }
	
	/**
	 */
	protected FolderProxy getFolderProxy(String strName){
		return (m_rootFolder != null) ? m_rootFolder.getChild(strName) : null;
	}
	
	/**
	 */
	protected FolderProxy getRootFolderProxy(){
		return m_rootFolder;
	}
	
	/**
	 */
	protected FolderProxy getFolderProxy(URLName url) throws URIException {
		return (m_rootFolder != null) ? m_rootFolder.getChild(url) : null;
	}

	/**
	 */
	protected FolderProxy getTrashCan(){
		return (m_rootFolder != null) ? m_rootFolder.getChild("deleteditems") : null;
	}

	/**
	 */
	protected void sendMessage(Message msg, Address[] addresses) throws MessagingException {
		checkConnected();

		// check if the message is a valid MIME/RFC822 message and that
		// it has all valid InternetAddresses; fail if not
		if (!(msg instanceof MimeMessage)) {
			throw new MessagingException("JDAVMail can only send RFC822 messages");
		}
		for (int i = 0; i < addresses.length; i++) {
			if (!(addresses[i] instanceof InternetAddress)) {
				throw new MessagingException(addresses[i] + " is not an InternetAddress");
			}
		}

		try {
			PostMessageMethod postMethod = new PostMessageMethod(m_sendMsgFolder);

			try {
				// Set message content:
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				//	1. Enveloppe headers
				bos.write(_getEnveloppeHeaders(msg, addresses).getBytes()); // Encoding ?
				//	2. Message body
				((MimeMessage)msg).writeTo(bos);
				ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
				postMethod.setRequestBody(bis);
				postMethod.setRequestContentLength(bis.available());
						
				executeMethod(postMethod);
			} finally {
				postMethod.releaseConnection();
			}
		} catch (Exception e) {
			throw new MessagingException("sendMessage exception", e);
		}
	}

	/**
	 * Build the transport headers
	 * @param msg - the message to be contained in the transport enveloppe
	 * @param addresses - the message recipients addresses
	 * @return 
	 * @throws MessagingException - address error
	 */
	private String _getEnveloppeHeaders(Message msg, Address[] addresses) throws MessagingException {
		StringBuffer strEnveloppeHeaders = new StringBuffer();
			
		// Enveloppe sender address
		strEnveloppeHeaders.append("MAIL FROM:").append(_getMessageFrom(msg)).append("\r\n");

		// Enveloppe recipients
		for (int i = 0; i < addresses.length; i++) {
			strEnveloppeHeaders.append("RCPT TO:")
					.append(_normalizeAddress(((InternetAddress)addresses[i]).getAddress()))
					.append("\r\n");
		}
		strEnveloppeHeaders.append("\r\n");
			
		return strEnveloppeHeaders.toString();		
	}
	
	/**
	 * Discover the (enveloppe) sender's address
	 * @param msg - the message contained in the transport enveloppe
	 * @return A non-null mailing address
	 * @throws MessagingException if no suitable address was found
	 */
	private String _getMessageFrom(Message msg) throws MessagingException {
		String strFrom = null;
		// 1. Is there a "mail.davmail.from" property defined ?
		strFrom = session.getProperty(JDAVMail.PROPERTY_FROM);
		if ((strFrom == null) || (strFrom.length() <= 0)) {
			// 2. Is there a 'from' header defined ?
			Address[] addrMessageFrom = msg.getFrom();
			if ((addrMessageFrom != null) && (addrMessageFrom.length > 0)) {
				strFrom = ((InternetAddress) addrMessageFrom[0]).getAddress();
			}
			if ((strFrom == null) || (strFrom.length() <= 0)) {
				// 3. Is there a default local address defined ?
				InternetAddress addrLocal = InternetAddress.getLocalAddress(session);
				if (addrLocal != null) {
					strFrom = addrLocal.getAddress();
				}
				if ((strFrom == null) || (strFrom.length() <= 0)) {
					throw new MessagingException("can't determine local email address");
				}
			}
		}
		return _normalizeAddress(strFrom);
	}
	
	/**
	 * Wraps an address in "<>" if necessary
	 */ 
	private String _normalizeAddress(String addr) {
		return addr.startsWith("<") ? addr : "<" + addr + ">";
	}
}

⌨️ 快捷键说明

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