ฉันจะสร้างตัวกรองสำหรับคำเชิญในปฏิทิน / กิจกรรม / การนัดหมายใน Thunderbird 38.2+ ได้อย่างไร


5

ฉันต้องการแท็กเมลขาเข้าทั้งหมดซึ่งรวมถึงคำเชิญในปฏิทิน จากนั้นฉันต้องการย้ายพวกเขาไปยังโฟลเดอร์อื่น ฉันลองวิธีที่อธิบายไว้ในคำตอบนี้แต่ไม่ได้ผล: ฉันลองค้นหาส่วนหัวชื่อ "Content-Type" ด้วยเนื้อหา "text / calendar" แต่ไม่ได้ผล

ฉันยังลองใช้ addon FiltaQuillaซึ่งล้มเหลวเช่นกัน ฉันใช้รหัสต่อไปนี้ที่นั่น:

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;

ฉันมีเอาต์พุตต่อไปนี้บนคอนโซลหลังจากทดสอบตัวกรองในอีเมลด้วยคำเชิญ. ics:

AtEnd_1
false
AtEnd_2
InBetween_1
true
InBetween_2

ดังนั้นโดยพื้นฐานแล้วตัวกรองนี้กับ JavaScript จะใช้งานได้ แต่มันไม่ทำงานเพราะ MsgHdrToMimeMessage () จะโทรกลับหลังจากตัวกรองคืนค่า "false" ไปที่ FiltaQuilla ฉันจะต้องทำให้รหัสรอ (ใช้มันแบบซิงโครนัสแทนแบบอะซิงโครนัส) แต่ฉันไม่มีความคิดว่าจะทำอย่างไร

อย่างไรก็ตามฉันไม่ได้ตั้งใจจะใช้ FiltaQuilla จริงๆ ฉันต้องการแก้ไขปัญหาของฉัน

ฉันใช้ IMAP และฉันบันทึกอีเมลของฉันลงในเครื่อง HD สำหรับการอ่านอีเมลออฟไลน์

มีรุ่นธันเดอร์เบิร์ดรุ่นเก่าที่ FiltaQuilla ทำงาน (บางอย่างเช่น 24.x) และที่นั่นแม้แต่รุ่นเก่าของธันเดอร์เบิร์ด (เช่น 3.x) ที่ตัวกรองบนส่วนหัวทำงาน แต่มีบางอย่างเปลี่ยนไปและตอนนี้ฉันไม่รู้วิธีกรองอีกต่อไป


ดูเหมือนว่าปัญหานี้เป็นปัญหาของธันเดอร์เบิร์ด: bugzilla.mozilla.org/show_bug.cgi?id=622307 แต่ฉันไม่สามารถจินตนาการได้ว่าปัญหานี้มีอยู่เป็นเวลาหลายปี
nusi

ในฐานะที่เป็นโซลูชันชั่วคราวที่ฉันเพิ่งได้รับคุณสามารถค้นหา "ics" หรือ "vcs" (ซึ่งเป็นส่วนเสริมของไฟล์นัดหมายในปฏิทินปกติ) โปรดทราบว่าการใช้ส่วนขยายเหล่านั้นอาจขึ้นอยู่กับไคลเอนต์และ / หรือระบบปฏิบัติการ แต่อาจมีประโยชน์ในกรณีที่เป็นกฎง่ายๆหรือสำหรับกรณีฉุกเฉิน
ysmartin

คำตอบ:


0

ในที่สุดก็พบทางออกสำหรับสิ่งนั้น โค้ด JavaScript ด้านล่างใช้งานได้ดีกับ FiltaQuilla และ 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;
}

ผมใช้ waitfor () ฟังก์ชันจากhttps://searchcode.com/codesearch/view/21382111/ ลิงค์นั้นน่าจะเป็นแหล่งที่มาจากห้องสมุดทดสอบของธันเดอร์เบิร์ด (/thunderbird-14.0/comm-release/mail/test/resources/mozmill/mozmill/extension/resource/modules/utils.js)

อย่างไรก็ตามถ้ามีคนอื่นมีปัญหาคล้ายกันซึ่งเขาต้องการแยกส่วนหัวของอีเมลในโฟลเดอร์ IMAP เขาสามารถใช้โค้ดด้านบนและเพียงแค่เปลี่ยน "sHeaderToLookFor" และ "sContentInHeader" ตามความต้องการของเขา


Nusi, คุณช่วยอธิบายวิธีกำหนดค่า FiltaQuilla ให้ใช้สคริปต์ของคุณได้ไหม? ขอบคุณ! Jay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.