📄 jdavmailservice.java
字号:
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 + -