在K-9邮件应用程序中下载新邮件后移至另一个文件夹

时间:2015-08-25 12:43:41

标签: java android email imap

我有一个基于K-9邮件的邮件客户端。我添加了新功能来自动检查从某个电子邮件地址发送的邮件并将其存储在自定义文件夹中。

这是对LocalFolder.java的更改 源代码: https://github.com/k9mail/k-9/blob/master/k9mail/src/main/java/com/fsck/k9/mailstore/LocalFolder.java

我正在检查规则:

public Message checkRule(Message message,String body)
{
    int state = 0;
    lstFolder.clear();
    if (Globals.lst_rules == null)
    {
        lstFolder.add(String.valueOf(mFolderId));
        return message;
    }
    for (int i = 0;i < Globals.lst_rules.size();i++)
    {
        state = 0;
        RuleDBManager.RuleModel rule = Globals.lst_rules.get(i);
        String pattern = rule.word;
        List<String> ptList = parsePattern(pattern);

        int condition = rule.condition;
        int action = rule.action;
        String container = "";
        container = Address.pack(message.getFrom()).toLowerCase();
        }
        for (int j = 0;j < ptList.size();j++) {
            if (container.contains(ptList.get(j).toLowerCase())) {
                lstFolder.add(String.valueOf(rule.folderId));
                }
                state = 1;
                break;
            }

        }
        if (state != 1) {
            lstFolder.add(String.valueOf(mFolderId));
        }
    }
    if (lstFolder.size() == 0)
    {
        lstFolder.add(String.valueOf(mFolderId));
    }

    return message;

我改变了这部分代码:

MessageInfoExtractor messageExtractor = new MessageInfoExtractor(localStore.context, message);
        String preview = messageExtractor.getMessageTextPreview();
        int attachmentCount = messageExtractor.getAttachmentCount();

        long rootMessagePartId = saveMessageParts(db, message);

        ContentValues cv = new ContentValues();
        cv.put("message_part_id", rootMessagePartId);
        cv.put("uid", uid);
        cv.put("subject", message.getSubject());
        cv.put("sender_list", Address.pack(message.getFrom()));
        cv.put("date", message.getSentDate() == null
                ? System.currentTimeMillis() : message.getSentDate().getTime());
        cv.put("flags", this.localStore.serializeFlags(message.getFlags()));
        cv.put("deleted", message.isSet(Flag.DELETED) ? 1 : 0);
        cv.put("read", message.isSet(Flag.SEEN) ? 1 : 0);
        cv.put("flagged", message.isSet(Flag.FLAGGED) ? 1 : 0);
        cv.put("answered", message.isSet(Flag.ANSWERED) ? 1 : 0);
        cv.put("forwarded", message.isSet(Flag.FORWARDED) ? 1 : 0);
        cv.put("folder_id", mFolderId);
        cv.put("to_list", Address.pack(message.getRecipients(RecipientType.TO)));
        cv.put("cc_list", Address.pack(message.getRecipients(RecipientType.CC)));
        cv.put("bcc_list", Address.pack(message.getRecipients(RecipientType.BCC)));
        cv.put("preview", preview);
        cv.put("reply_to_list", Address.pack(message.getReplyTo()));
        cv.put("attachment_count", attachmentCount);
        cv.put("internal_date", message.getInternalDate() == null
                ? System.currentTimeMillis() : message.getInternalDate().getTime());
        cv.put("mime_type", message.getMimeType());
        cv.put("empty", 0);

        String messageId = message.getMessageId();
        if (messageId != null) {
            cv.put("message_id", messageId);
        }

        if (oldMessageId == -1) {
            long msgId = db.insert("messages", "uid", cv);

            // Create entry in 'threads' table
            cv.clear();
            cv.put("message_id", msgId);

            if (rootId != -1) {
                cv.put("root", rootId);
            }
            if (parentId != -1) {
                cv.put("parent", parentId);
            }

            db.insert("threads", null, cv);
        } else {
            db.update("messages", cv, "id = ?", new String[] { Long.toString(oldMessageId) });
        }

对此:

for (int p = 0; p < lstFolder.size(); p++) {
                                ContentValues cv = new ContentValues();
                                cv.put("uid", uid);
                                cv.put("subject", message.getSubject());
                                cv.put("sender_list", Address.pack(message.getFrom()));
                                cv.put("date", message.getSentDate() == null
                                        ? System.currentTimeMillis() : message.getSentDate().getTime());
                                cv.put("flags", LocalFolder.this.localStore.serializeFlags(message.getFlags()));
                                cv.put("deleted", message.isSet(Flag.DELETED) ? 1 : 0);
                                cv.put("read", message.isSet(Flag.SEEN) ? 1 : 0);
                                cv.put("flagged", message.isSet(Flag.FLAGGED) ? 1 : 0);
                                cv.put("answered", message.isSet(Flag.ANSWERED) ? 1 : 0);
                                cv.put("forwarded", message.isSet(Flag.FORWARDED) ? 1 : 0);
                                //cv.put("folder_id", mFolderId);
                                cv.put("folder_id", lstFolder.get(p));
                                cv.put("to_list", Address.pack(message.getRecipients(RecipientType.TO)));
                                cv.put("cc_list", Address.pack(message.getRecipients(RecipientType.CC)));
                                cv.put("bcc_list", Address.pack(message.getRecipients(RecipientType.BCC)));
                                cv.put("html_content", html.length() > 0 ? html : null);
                                cv.put("text_content", text.length() > 0 ? text : null);
                                cv.put("preview", preview.length() > 0 ? preview : null);
                                cv.put("reply_to_list", Address.pack(message.getReplyTo()));
                                cv.put("attachment_count", attachments.size());
                                cv.put("internal_date", message.getInternalDate() == null
                                        ? System.currentTimeMillis() : message.getInternalDate().getTime());
                                cv.put("mime_type", message.getMimeType());
                                cv.put("empty", 0);

                                String messageId = message.getMessageId();
                                if (messageId != null) {
                                    cv.put("message_id", messageId);
                                }

                                long msgId;

                                if (oldMessageId == -1) {
                                    msgId = db.insert("messages", "uid", cv);

                                    // Create entry in 'threads' table
                                    cv.clear();
                                    cv.put("message_id", msgId);

                                    if (rootId != -1) {
                                        cv.put("root", rootId);
                                    }
                                    if (parentId != -1) {
                                        cv.put("parent", parentId);
                                    }

                                    db.insert("threads", null, cv);
                                } else {
                                    db.update("messages", cv, "id = ?", new String[]{Long.toString(oldMessageId)});
                                    msgId = oldMessageId;
                                }

                                if (attachments.size() == 2) {
                                    saveAttachment(msgId, attachments.get(0), false);
                                } else if (attachments.size() > 0)
                                    saveAttachment(msgId, attachments.get(0), false);
                                saveHeaders(msgId, (MimeMessage) message);
                            }

但是当我点击消息时,我在代码的这一部分得到了一个N​​ullPointerException

public Message storeSmallMessage(final Message message, final Runnable runnable) throws MessagingException {
    return this.localStore.database.execute(true, new DbCallback<Message>() {
        @Override
        public Message doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
            try {
                appendMessages(Collections.singletonList(message));
                final String uid = message.getUid();
                final Message result = getMessage(uid);
                Log.e("g",result.toString());
                runnable.run();
                //CheckRuleMove(message);
                // Set a flag indicating this message has now be fully downloaded
//result.setFlag get this Exception probably because "result" is Null
                result.setFlag(Flag.X_DOWNLOADED_FULL, true);
                return result;
            } catch (MessagingException e) {
                throw new WrappedException(e);
            }
        }
    });
}

&#34;结果&#34;是从这一部分得到的:

public LocalMessage getMessage(final String uid) throws MessagingException {
    try {
        return this.localStore.database.execute(false, new DbCallback<LocalMessage>() {
            @Override
            public LocalMessage doDbWork(final SQLiteDatabase db) throws WrappedException, UnavailableStorageException {
                try {
                    open(OPEN_MODE_RW);
                    LocalMessage message = new LocalMessage(LocalFolder.this.localStore, uid, LocalFolder.this);
                    Cursor cursor = null;
                    try {
                        cursor = db.rawQuery(
                                     "SELECT " +
                                     LocalStore.GET_MESSAGES_COLS +
                                     "FROM messages " +
                                     "LEFT JOIN threads ON (threads.message_id = messages.id) " +
                                     "WHERE uid = ? AND folder_id = ?",
                                new String[] {
                                         message.getUid(), Long.toString(mFolderId)
                                     });
                        Log.e("hey",cursor.toString());
                        if (!cursor.moveToNext()) {
                            return null;
                        }
                        message.populateFromGetMessageCursor(cursor);
                    } finally {
                        Utility.closeQuietly(cursor);
                    }
                    return message;
                } catch (MessagingException e) {
                    throw new WrappedException(e);
                }
            }
        });
    } catch (WrappedException e) {
        throw(MessagingException) e.getCause();
    }
}

据我所知,mFolderId(刷新文件夹的ID)不等于服务器的lstFolder.get(0)(保存邮件的文件夹),我无法同步电子邮件文件夹和我的客户端文件夹。 问题是如何改进我的代码,以便我可以同时将消息移动到服务器上的另一个文件夹?

1 个答案:

答案 0 :(得分:0)

MessagingController.class中有一个方法 - queueMoveOrCopy