我正在试图创建一个Thunderbird扩展,其中一个是bootstrapped / restartless类型(我的意思是,javascript代码不从覆盖中运行。相反,侦听器会触发各种事件)。
在某些时候,我想在用户决定发送消息时检查发件人和收件人(To,Cc,Bcc),以便对它们进行一些检查。
我已经设置并运行了许多事件监听器,包括用于确认发送消息时正确触发的compose-send-message
事件。
在那里,我无法找到如何获取发件人电子邮件地址以及所有收件人电子邮件地址。我试过两个:
let fields = components.classes["@mozilla.org/messengercompose/composefields;1"].
createInstance(components.interfaces.nsIMsgCompFields)
和:
let params = components.classes["@mozilla.org/messengercompose/composeparams;1"].
createInstance(components.interfaces.nsIMsgComposeParams);
let fields = params.composeFields;
但无论如何fields.hasRecipients
返回false,例如fields.to
为空(或为空,无法准确回忆)。看起来他们没有被TB确定。
当然我在周围搜索,也是在与覆盖扩展相关的TB线程中,但没有运气。有一个SO线程here,似乎没有完全回答这个问题,因为它只是关于发送者。
其他参考文献:SO again,MozillaZine,TB stdlib。
答案 0 :(得分:0)
好了,感谢此人mozilla.dev.apps.thunderbird thread以及此mozilla.dev.extensions thread的人们提供的帮助,我可以从compose-send-message
事件监听器中访问发件人和收件人。
以下是相关代码......实际上,更多一点:果汁就在onComposeSendMessage
之内:
var windowMediator = components.classes['@mozilla.org/appshell/window-mediator;1'].
getService(components.interfaces.nsIWindowMediator);
var listener = new Listener(windowMediator);
windowMediator.addListener(listener);
function Listener (windowMediator) {
var self = this;
var _mediator = windowMediator;
var _compose = null;
this.onOpenWindow = function (aWindow) {
// [...]
_compose = aWindow.docShell.
QueryInterface(components.interfaces.nsIInterfaceRequestor).
getInterface(components.interfaces.nsIDOMWindow);
_compose.addEventListener('compose-send-message', self.onComposeSendMessage, true);
};
this.onComposeSendMessage = function (event) {
event.currentTarget.removeEventListener(event.type, self.onComposeSendMessage, true);
// event.currentTarget.gMsgCompose <--> _compose.gMsgCompose
// Get sender
log(_compose.gMsgCompose.identity.email); // DEBUG with custom log function
// Get recipients
log(_compose.gMsgCompose.compFields.to); // DEBUG
log(_compose.gMsgCompose.compFields.cc); // DEBUG
log(_compose.gMsgCompose.compFields.bcc); // DEBUG
};
this.onCloseWindow = function () {
_mediator.removeListener(self); // Remove itself, so to not receive message twice
};
// [...]
}
再次感谢所有群体的反馈意见。
答案 1 :(得分:0)
我更简单地使用它完成了它。
var win = Services.wm.getMostRecentWindow("msgcompose");
composeFields = {};
win.Recipients2CompFields(composeFields);
// composeFields has more properties than this like cc and bcc but the
// below is what you asked for.
Components.utils.reportError(composeFields.to); // Debug output.
var sender = document.getElementById("msgIdentity").description