📄 imap4.java
字号:
Functions.addMailsInStorageToVector( getTargetBox().getStorage(), tempStorage );
getTargetBox().setStorage( Algorithm.getAlgorithm().invoke( tempStorage ) );
System.gc();
}
if (DEBUG) System.out.println("DEBUG GetMailsTask.doRunWork() - Mails stored to the box.");
long wholeTime = System.currentTimeMillis() - startTime;
String waitTime = wholeTime > 1000 ? wholeTime / 1000 + "sec" : wholeTime + "msec";
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_CHECK_MAILS) + account.getEmail() + "" + Lang.get(Lang.IN) + waitTime);
} catch (MyException myException) {
myException.printStackTrace();
resolveMyExceptionRun(myException);
} catch (Exception ex) {
ex.printStackTrace();
resolveExceptions("100: " + ex + "/ " + account.getEmail(), SOURCE_FILE);
}
if (DEBUG) System.out.println("DEBUG GetMailsTask.doRunWork() - Mails retrieved");
}
protected void downloadBody() {
if (DEBUG) System.out.println("DEBUG IMAP4.downloadBody starting downloading body.");
try {
if (DEBUG) System.out.println("DEBUG IMAP4.DownloadBodyTask.doRunWork starting");
long startTime = System.currentTimeMillis();
if (!open(inProtocolTask)) {
if (DEBUG) System.out.println("DEBUG IMAP4.DownloadBodyTask.doRunWork cannot open connection");
synchronized (actHeader) {
actHeader.notify();
actHeader = null;
}
if (DEBUG) System.out.println("DEBUG IMAP4.DownloadBodyTask.doRunWork returning");
return;
}
if (DEBUG) System.out.println("DEBUG IMAP4.DownloadBodyTask.doRunWork connection opened");
inProtocolTask.setTitle(Lang.get(runMode == RETRIEVE_BODY ? Lang.ALRT_INPL_DOWN_MAIL : Lang.ALRT_INPL_REDOWN_MAIL) + actHeader.getSubject());
inProtocolTask.updateProgress(actHeader.getSize(), 0);
String sld_box = actHeader.getMessageID().substring(0, actHeader.getMessageID().lastIndexOf(MessageHeader.MSG_ID_SEPARATOR) + 1);
//if the actually selected mailbox differs from header's mailBox
if (sld_mailBox_uidval == null || !sld_mailBox_uidval.equals(sld_box)) {
//select header's mailBox
if (!selectMailBox(actHeader.getIMAPFolder())) {
throw new MyException(MyException.PROTOCOL_CANNOT_RETRIEVE_BODY, Lang.get(Lang.ALRT_INPL_IMAP_CANNOT_SELECT_MAILBOX) + sld_box.substring(sld_box.indexOf(0, MessageHeader.MSG_ID_SEPARATOR)));
}
if (!sld_mailBox_uidval.equals(sld_box)) {
throw new MyException(MyException.PROTOCOL_CANNOT_RETRIEVE_BODY, Lang.get(Lang.ALRT_INPL_IMAP_UIDVALIDITY_DIFFERS));
}
}
String fetchTag;
if (runMode == RETRIEVE_BODY || (runMode == REDOWNLOAD_BODY && reDownloadMode == -1)) {
fetchTag = execute("UID FETCH " + parseUID(actHeader.getMessageID()) + " (FLAGS RFC822)", false);
} else if (runMode == CONVERT_BODY) {
String extension = actHeader.getBodyPart(reDownloadMode).getHeader().getExtension();
if ("pdf".equalsIgnoreCase(extension)) {
fetchTag = execute("xmujmail-convert pdf " + parseUID(actHeader.getMessageID()) + " (FLAGS BINARY" + "[" + (reDownloadMode + 1) + "])", false);
}
else { //JPEG conversion
int size = MujMail.mujmail.getMenu().getHeight();
fetchTag = execute("xmujmail-convert jpg " + Integer.toString(size) + " " + parseUID(actHeader.getMessageID()) + " (FLAGS BINARY" + "[" + (reDownloadMode + 1) + "])", false);
}
} else {
fetchTag = execute("UID FETCH " + parseUID(actHeader.getMessageID()) + " (FLAGS BODY" + "[" + (reDownloadMode + 1) + "])", false);
}
String line = "";
do { //skip useless lines fetch response
line = connection.getLine();
} while (!(line.startsWith(fetchTag) || line.indexOf("UID " + parseUID(actHeader.getMessageID())) != -1));
if (line.startsWith(fetchTag)) {
throw new MyException(MyException.PROTOCOL_CANNOT_RETRIEVE_BODY, "200: " + Lang.get(Lang.ALRT_INPL_NO_LONGER_ON_SERVER));
}
//Check for '\Seen', '\Answered', '\Flagged' and '\Deleted' flags
indexOfFlags = line.indexOf("FLAGS (");
if (indexOfFlags != -1) //FLAGS parameter is given first
{
flags = line.substring(indexOfFlags + 7);
flags = flags.substring(0, flags.indexOf(")"));
handleFlags(actHeader, flags);
} else //FLAGS parameter is given last
{
END_OF_MAIL = " FLAGS (";
}
if (DEBUG) System.out.println("DEBUG - IMAP4.downloadBody - before parsing body");
parseBody(actHeader, inProtocolTask);
if (DEBUG) System.out.println("DEBUG - IMAP4.downloadBody - after parsing body");
actHeader.saveHeader();
if (Settings.safeMode) {
getTargetBox().setLastSafeMail(actHeader);
}
long wholeTime = System.currentTimeMillis() - startTime;
String waitTime = wholeTime > 1000 ? wholeTime / 1000 + "sec" : wholeTime + "msec";
inProtocolTask.setTitle("*" + Lang.get(runMode == RETRIEVE_BODY ? Lang.ALRT_INPL_DOWN_MAIL : Lang.ALRT_INPL_REDOWN_MAIL) + actHeader.getSubject() + " " + Lang.get(Lang.IN) + waitTime);
inProtocolTask.updateProgress(actHeader.getSize(), actHeader.getSize());
synchronized (actHeader) { //everything is ok now
actHeader.notify();
actHeader = null;
}
} catch (MyException myException) {
resolveMyExceptionRun(myException);
}
}
protected void removeMails() {
try {
long startTime = System.currentTimeMillis();
if (deleted.isEmpty() || !open(inProtocolTask)) {
return;
}
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_DEL_MAILS) + account.getEmail());
inProtocolTask.updateProgress(deleted.size(), 0);
//let's sort the marked mails by their mailboxes
//so we don't have to reselect mailboxes for every mail having the same mailbox
Functions.sort(deleted, Functions.SRT_ORDER_INC, Functions.SRT_HDR_MSGID);
String msgID;
int actual = 0;
int i = 0,
j = 0;
for (actual = deleted.size() -1 ; actual >= 0; --actual) {
msgID = ((MessageHeader) deleted.elementAt(actual)).getMessageID();
String sld_box = msgID.substring(0, msgID.lastIndexOf(MessageHeader.MSG_ID_SEPARATOR) + 1); //this mail's mail box
j = sld_box.indexOf(MessageHeader.MSG_ID_SEPARATOR);
//if we're gonna select another mailbox, expunge the currently selected mailbox
if (i != 0 && (i != j || !sld_mailBox_uidval.regionMatches(false, 0, sld_box, 0, j))) {
execute("EXPUNGE", true);
}
//if no mailbox was set or the actually selected mailbox differs from header's mailBox
if (i != j || !sld_mailBox_uidval.regionMatches(false, 0, sld_box, 0, j)) {
i = 0;
//select header's mailBox
if (!selectMailBox(sld_box.substring(0, j))) {
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_IMAP_CANNOT_SELECT_MAILBOX) + sld_box.substring(sld_box.indexOf(0, MessageHeader.MSG_ID_SEPARATOR)));
//don't consider this as deleted from the server
//and don't remove it from the onceDownloaded cache to prevent redownloading it again
deleted.removeElementAt(actual);
continue;
}
i = sld_mailBox_uidval.indexOf(MessageHeader.MSG_ID_SEPARATOR);
}
//if the mailbox has changed its UIDVALIDITY from the previous session
if (!sld_mailBox_uidval.equals(sld_box)) {
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_IMAP_UIDVALIDITY_DIFFERS));
deleted.removeElementAt(actual);
} else {
execute("UID STORE " + parseUID(msgID) + " +FLAGS (\\Deleted)", false);
}
removeMessageFromBox(actual);
if (inProtocolTask.stopped()) {
break;
}
}
if (actual != 0) {
execute("EXPUNGE", true);
}
deleted.removeAllElements();
long wholeTime = System.currentTimeMillis() - startTime;
String waitTime = wholeTime > 1000 ? wholeTime / 1000 + "sec" : wholeTime + "msec";
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_DEL_MAILS) + account.getEmail() + Lang.get(Lang.IN) + waitTime);
} catch (MyException myException) {
myException.printStackTrace();
resolveMyExceptionRun(myException);
}
}
protected void setFlags() {
try {
//try to open connection
if (!open(inProtocolTask)) {
throw new MyException(MyException.PROTOCOL_CANNOT_CONNECT);
}
String messageID = actHeader.getMessageID();
String sld_box = messageID.substring(0, messageID.lastIndexOf(MessageHeader.MSG_ID_SEPARATOR) + 1); //this mail's mail box
selectMailBox(actHeader.getIMAPFolder());
//if the mailbox has changed its UIDVALIDITY from the previous session
if (!sld_mailBox_uidval.equals(sld_box)) {
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_IMAP_UIDVALIDITY_DIFFERS));
} else {
execute("UID STORE " + parseUID(messageID) + " +FLAGS " + flagsToSet, false);
}
synchronized (actHeader) { //everything is ok now
actHeader.notify();
actHeader = null;
}
} catch (MyException myException) {
resolveMyExceptionRun(myException);
}
}
protected void removeFlags() {
try {
//try to open connection
if (!open(inProtocolTask)) {
throw new MyException(MyException.PROTOCOL_CANNOT_CONNECT);
}
String mesgID = actHeader.getMessageID();
String sld_box = mesgID.substring(0, mesgID.lastIndexOf(MessageHeader.MSG_ID_SEPARATOR) + 1); //this mail's mail box
selectMailBox(actHeader.getIMAPFolder());
//if the mailbox has changed its UIDVALIDITY from the previous session
if (!sld_mailBox_uidval.equals(sld_box)) {
inProtocolTask.setTitle(Lang.get(Lang.ALRT_INPL_IMAP_UIDVALIDITY_DIFFERS));
} else {
execute("UID STORE " + parseUID(mesgID) + " -FLAGS " + flagsToSet, false);
}
synchronized (actHeader) { //everything is ok now
actHeader.notify();
actHeader = null;
}
} catch (MyException myException) {
resolveMyExceptionRun(myException);
}
}
/* MUJMAIL IMAP4 PROTOCOL EXTENSIONS */
String URL = null;
public synchronized String getURL( String url) {
runMode = IMAP4.GET_URL;
URL = url;
inProtocolTask = new InProtocolTask(this, "Retrieving URL page");
inProtocolTask.start();
return URL;
}
protected void getURL() throws MyException {
if ( URL == null ) return;
if ( isConnected() == false ) {
open(null);
}
String tag = execute( "XmujMail-url processed noncompacted \"" + URL + "\"", false);
String reply = connection.getLine();
// parse reply
if ( reply.startsWith(tag) ) {
URL = null;
String errorTag = tag + " BAD ";
if ( reply.startsWith(errorTag) )
throw new MyException( MyException.PROTOCOL_BASE, "200: " + "Internal error - bad syntax" + reply.substring( errorTag.length()));
String problemTag = tag + " NO ";
if ( reply.startsWith( problemTag) ) {
System.out.println("Error report IMAP4.getURLCommand:" + reply);
throw new MyException(MyException.PROTOCOL_CANNOT_GET_URL, "200: " + Lang.get(Lang.ALRT_INPL_IMAP_GETURL_NO_PAGE) + "Debug server reply:" + reply);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -