Làm cách nào tôi có thể tạo bộ lọc cho lời mời lịch / sự kiện / cuộc hẹn trong Thunderbird 38.2+


5

Tôi muốn gắn thẻ tất cả các thư đến bao gồm lời mời lịch. Sau đó, tôi muốn chuyển chúng vào một thư mục khác. Tôi đã thử phương pháp được mô tả trong điều này trả lời, nhưng nó không hoạt động: Tôi đã thử tìm một tiêu đề có tên "Loại nội dung" với nội dung "văn bản / lịch" nhưng nó không hoạt động.

Tôi cũng đã thử addon FilteraQuilla , mà thất bại là tốt. Tôi đã sử dụng mã sau đây:

var sHeaderToLookFor = "content-type";
var sContentInHeader = "text/calendar";
var bFoundIt = false;
function msgHdrGetHeaders(aMsgHdr, k) {
    let uri = aMsgHdr.folder.getUriForMsg(aMsgHdr);
    let messageService = MailServices.messenger.messageServiceFromURI(uri);
    MsgHdrToMimeMessage(aMsgHdr, null, function (aMsgHdr, aMimeMsg) { k(aMimeMsg);  }, true, { partsOnDemand: true, examineEncryptedParts:true });
}

msgHdrGetHeaders(message, function (aHeaders) {
    if (aHeaders.has(sHeaderToLookFor)) {
        var pattern = new RegExp(sContentInHeader);
        Application.console.log("InBetween_1");
        if (!bFoundIt)
            bFoundIt= pattern.test(aHeaders.get(sHeaderToLookFor));
        Application.console.log(bFoundIt);
        Application.console.log("InBetween_2");
    }
});

Application.console.log("AtEnd_1");
Application.console.log(bFoundIt);
Application.console.log("AtEnd_2");
bFoundIt;

Tôi đã theo dõi đầu ra trên bảng điều khiển sau khi kiểm tra bộ lọc trên email với lời mời .ics:

AtEnd_1
false
AtEnd_2
InBetween_1
true
InBetween_2

Về cơ bản, bộ lọc này với JavaScript sẽ hoạt động. Nhưng nó không hoạt động vì MsgHdrToMimeMessage () sẽ gọi lại cuộc gọi sau khi Bộ lọc trả về "false" cho FilteraQuilla. Tôi sẽ cần phải làm cho mã chờ (sử dụng đồng bộ thay vì không đồng bộ), nhưng tôi không biết làm thế nào để làm điều đó.

Dù sao, tôi không thực sự tập trung vào việc sử dụng FilteraQuilla. Tôi chỉ muốn có một giải pháp cho vấn đề của tôi.

Tôi sử dụng IMAP và tôi lưu email của mình trên HD cục bộ để đọc email ngoại tuyến.

Có một phiên bản Thunderbird cũ hơn, nơi FilteraQuilla hoạt động (tương tự như 24.x), và ở đó các phiên bản Thunderbird cũ hơn (như 3.x) nơi các bộ lọc trên các tiêu đề hoạt động. Nhưng một cái gì đó đã thay đổi và bây giờ tôi không biết làm thế nào để lọc nữa.


Có vẻ như đây là một lỗi của Thunderbird: bugzilla.mozilla.org/show_orms.cgi?id=622307 . Nhưng tôi không thể tưởng tượng rằng vấn đề này tồn tại trong vài năm.
nusi

Là một giải pháp tạm thời tôi vừa đưa ra, bạn có thể tìm kiếm "ics" hoặc "vcs" (đó là những phần mở rộng thông thường của các tệp hẹn lịch). Lưu ý rằng việc sử dụng các tiện ích mở rộng đó có thể phụ thuộc vào máy khách và / hoặc HĐH, nhưng nó có thể hữu ích như một quy tắc ngón tay cái hoặc cho trường hợp khẩn cấp.
ysmartin

Câu trả lời:


0

Cuối cùng tìm thấy một giải pháp cho điều đó. Bên dưới mã JavaScript hoạt động tốt với FilteraQuilla và Thunderbird 38.2.0.

{
    var sHeaderToLookFor = "content-type";
    var sContentInHeader = "text/calendar";

    var hwindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
            .getService(Components.interfaces.nsIAppShellService)
            .hiddenDOMWindow;
    function waitFor(callback, message, timeout, interval, thisObject) {
        timeout = timeout || 5000;
        interval = interval || 100;
        var self = {counter: 0, result: callback.call(thisObject)};
        function wait() {
            self.counter += interval;
            self.result = callback.call(thisObject);
        }
        var timeoutInterval = hwindow.setInterval(wait, interval);
        var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
        while ((self.result != true) && (self.counter < timeout)) {
            thread.processNextEvent(true);
        }
        hwindow.clearInterval(timeoutInterval);
        if (self.counter >= timeout) {
            message = message || arguments.callee.name + ": Timeout exceeded for '" + callback + "'";
            throw new TimeoutError(message);
        }
      return true;
    }

    var bFoundIt = false;
    var called = false;
    function msgHdrGetHeaders(aMsgHdr, k) {
        let uri = aMsgHdr.folder.getUriForMsg(aMsgHdr);
        let messageService = MailServices.messenger.messageServiceFromURI(uri);
        MsgHdrToMimeMessage(aMsgHdr, null,
            function(aMsgHdr, aMimeMsg) {
                try {
                    k(aMimeMsg);
                }
                catch (ex)
                {
                }
                finally {
                    called = true;
                }
            },
            true, { partsOnDemand: true, examineEncryptedParts:true });
    }

    msgHdrGetHeaders(message, function (aHeaders) {
        if (aHeaders.has(sHeaderToLookFor)) {
            var pattern = new RegExp(sContentInHeader);
            // Application.console.log("InBetween_1");
            if (!bFoundIt)
                bFoundIt = pattern.test(aHeaders.get(sHeaderToLookFor));
            Application.console.log(bFoundIt);
            // Application.console.log("InBetween_2");
        }
    });

    waitFor(function () called, "Timeout waiting for message to be parsed");
    // Application.console.log("AtEnd_1");
    Application.console.log(bFoundIt);
    // Application.console.log("AtEnd_2");
    bFoundIt;
}

Tôi đã sử dụng hàm WaitFor () từ https://searchcode.com/codesearch/view/21382111/ . Liên kết đó dường như là nguồn từ thư viện thử nghiệm Thunderbird (/thunderbird-14.0/comm-release/mail/test/resource/mozmill/mozmill/extension/resource/modules/utils.js)

Dù sao, nếu ai đó có vấn đề tương tự, nơi anh ta muốn phân tích tiêu đề email trên các thư mục IMAP, anh ta có thể sử dụng mã ở trên và chỉ cần thay đổi "sHeaderToLookFor" và "sContentInHeader" theo nhu cầu của mình.


Nusi, bạn có thể giải thích cách cấu hình FilteraQuilla để sử dụng tập lệnh của mình không? Cảm ơn! Jay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.