firemail
标题:
群发单显
[打印本页]
作者:
hechengjin
时间:
2016-3-27 22:51
标题:
群发单显
---需求描述:
群发单
显就是在群发邮件的时候,会采用一对一发送的方式,这样每个收件人看到的都是该邮件单独发给了自己,不会有群发的感觉。
----实现原理:
将收件人列表循环处理,一次只发给一个人。
----关键注意点:
1.进度条的控制 ---借用扩展解决
mail_merge
mailnews.show_send_progress 是否显示进度条
thinkmail中主要问题:循环发送,进度窗口会弹出多个,且只关闭第一个,其它后续弹出的不关闭
2.其它弹窗细节处理
如保存到其它邮件夹的弹窗操作
3.要在已发送邮件中追加一条以群发形式显示的单个邮件,并能控制单个发送的邮件是否要单独保存到已发送邮件中。[这里要注意与已发送邮件中存在两封邮件问题的无缝整合]
---修改的文件:
firemail\mail\components\compose\content\MsgComposeCommands.js
增加的扩展:
firemail\mail\app\profile\extensions\
mailmerge@example.net
---难点处理:
a.已保存草稿的群发间显邮件,重新打开修改时能识别出其为群发单显状态
1.由于已经在源码文件中写入了
BulkSendSingleShow:1标志,本来可以像读信页一样,判断这个标志,但由于写信面和读信面解析的方法不同,写信面中没有mime相关的操作,无法获取标志
2.虽然已经在compFields域中包含了bulkSendSingleShow标志,但却无法传送到写信页,就算单独传参数给写信面,也没有找到读取当前邮件此标志的地方,也无法确认是不是群发单显
3.模仿msgCompFields.DSN的方法,但此为针对一个用户,而这个是针对每个邮件,不方便从identity中设置和获取。4.写信页中收件人等的加载是放在msghdr中的,而msghdr的获取是从服务器下载邮件头动态解析出来的,且一般下载的邮件头不会包含BulkSendSingleShow:1类似这样的标志,请求中加入,
服务端也不一定能返回,且不合公用协议。
4.研究写信页内容加载过程,解析出里面的BulkSendSingleShow:1标志,再采用2后面的方法传送参数。
总结:依然用compFields域写入,再次编辑时读取,读取代码的解析位置,通过查找js中ComposeFieldsReady方法的触发,即找nsIMsgComposeNotificationType::ComposeFieldsReady
NS_IMETHODIMP QuotingOutputStreamListener::OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult status)上面那个不是应该是
mime_parse_stream_complete (nsMIMESession *stream)
这个里面进行解析的。
注:目前流程,不在线,不能保存邮件;所有操作都是先提交到服务器,然后再同步下来,而不是先存在本地,后同步。
docc_back 记录原来是否保存到已发送中
用于群发单显后,再设置回去。
群发单显默认都调用 保存到已发送
作者:
hechengjin
时间:
2016-3-27 22:52
1.设置标志的时机当点发送按钮后,检测到是群发单显时:
msgcomposecommands.js
if ( document.getElementById("msgTO_lab").textContent.indexOf(bloksss) >= 0 )
{
msgCompFields.bulkSendSingleShow = true;
}
C++对应实现
D:\svn\Client\ThinkMail_ClientWin_2013\trunk\src\thinkmail\mailnews\compose\src\nsMsgCompUtils.cpp
if (fields->GetBulkSendSingleShow())
PUSH_STRING ("BulkSendSingleShow:1" CRLF);
2.群发单显在已发送中显示:
该封邮件已经通过群发单显单独发送到每个收件人。
BulkSendSingleShow:1
D:\svn\Client\ThinkMail_ClientWin_2013\trunk\src\thinkmail\obj_cmmail\mozilla\dist\bin\chrome\messenger\content\messenger\mailWindowOverlay.jsD:\svn\Client\ThinkMail_ClientWin_2013\trunk\src\thinkmail\mailnews\mime\emitters\src\nsMimeHtmlEmitter.cpp
headerSink->OnEndMsgHeaders(mailnewsUrl);??????????
//alert(aUrl); //[xpconnect wrapped nsIMsgMailNewsUrl]
邮件内容加载时调用function HandleBSSSResponse(aUrl)
mimeHdr = aUrl.mimeHeaders;
var BSSSHeader = mimeHdr.extractHeader("BulkSendSingleShow", false);
根据
BSSSHeader确认是否显示
3.只在已发送中显示这个提示
if ( msgFolder.isSpecialFolder(Components.interfaces.nsMsgFolderFlags.SentMail) )
gMessageStateNotificationBar.setBSSSMsg(msgHdr, mimeHdr, BSSSHeader);
else
{
gMessageStateNotificationBar.setBSSSMsg(msgHdr, mimeHdr, false);
}
4.群发单显的情况下保存草稿,再打开草稿,保持住群发单显状态。作为新邮件编辑流程
mailWindowOverlay.js
//作为新邮件编辑
function MsgEditMessageAsNew()
{
composeMsgByType(Components.interfaces.nsIMsgCompType.Template);
}
//草稿编辑邮件
ComposeMessage(Components.interfaces.nsIMsgCompType.Draft,
Components.interfaces.nsIMsgCompFormat.Default,
gFolderDisplay.displayedFolder,
gFolderDisplay.selectedMessageUris);
mailCommands.js
function ComposeMessage(type, format, folder, messageArray)
{
for (var i = 0; i < messageArray.length; ++i) //这里只传过来一个选中的邮件
{
var messageUri = messageArray
;//
//hechengjin88@imap.126.com/&g0l6P3ux-#1385437452
hdr = messenger.msgHdrFromURI(messageUri);
identity = getIdentityForHeader(hdr, type);
if (FeedMessageHandler.isFeedMessage(hdr))
openComposeWindowForRSSArticle(null, hdr, messageUri, type,
format, identity, msgWindow);
else
MailServices.compose.OpenComposeWindow(null, hdr, messageUri, type,
format, identity, msgWindow);
}
}
MsgComposeCommands.js
function ComposeStartup(recycled, aParams)
{
var composeSvc = Components.classes["@mozilla.org/messengercompose;1"]
.getService(Components.interfaces.nsIMsgComposeService);
gMsgCompose = composeSvc.initCompose(params, window, editorElement.docShell);
document.getElementById("dsnMenu")
.setAttribute("checked", gMsgCompose.compFields.DSN);
}
function ComposeFieldsReady()
{
let msgHdr;
if (gParamsWhenComposeStartup)
msgHdr = gParamsWhenComposeStartup.origMsgHdr;
}
D:\svn\Client\ThinkMail_ClientWin_2013\trunk\src\thinkmail\mailnews\compose\src\nsMsgComposeService.cpp
NS_IMETHODIMP nsMsgComposeService::InitCompose
D:\svn\Client\ThinkMail_ClientWin_2013\trunk\src\thinkmail\mailnews\compose\src\nsMsgCompose.cpp
nsMsgCompose::Initialize
//alert(messageUri);//imap-message://hechengjin88@imap.126.com/&g0l6P3ux-#1385437452
//alert(hdr); //[xpconnect wrapped nsIMsgDBHdr]
var hdrinfos;
for(attribute in hdr){
var objectValue = eval('hdr.' + attribute);
dump(attribute + ":" +objectValue+"\n");
hdrinfos += attribute + ":" +objectValue+"\n";
}
alert(hdrinfos);
identity = getIdentityForHeader(hdr, type);
//alert(identity); //[nsIMsgIdentity: id1]
//alert(format); //0
//alert(msgWindow); //[xpconnect wrapped nsIMsgWindow]
复制代码
hdr内容
undefinedflags:129
mime2DecodedRecipients:hechengjin <hechengjin@richinfo.cn>, hechengjin88 <hechengjin88@126.com>
mime2DecodedSubject:sfg
date:1409110867000000
isFlagged:false
getStringProperty:function getStringProperty() {
[native code]
}
messageSize:938
folder:[xpconnect wrapped (nsISupports, nsIMsgFolder, nsIRDFResource, nsIMsgImapMailFolder)]
getUint32Property:function getUint32Property() {
[native code]
}
recipients:hechengjin <hechengjin@richinfo.cn>, hechengjin88 <hechengjin88@126.com>
ccList:
accountKey:
label:0
author:hechengjin88 <hechengjin88@126.com>
isRead:true
messageId:53FD4F81.4000604@126.com
markHasAttachments:function markHasAttachments() {
[native code]
}
QueryInterface:function QueryInterface() {
[native code]
}
getProperty:function getProperty() {
[native code]
}
setProperty:function setProperty() {
[native code]
}
setStringProperty:function setStringProperty() {
[native code]
}
setUint32Property:function setUint32Property() {
[native code]
}
isKilled:false
markRead:function markRead() {
[native code]
}
markFlagged:function markFlagged() {
[native code]
}
priority:1
setPriorityString:function setPriorityString() {
[native code]
}
OrFlags:function OrFlags() {
[native code]
}
AndFlags:function AndFlags() {
[native code]
}
threadId:1385437452
messageKey:1385437452
threadParent:4294967295
lineCount:0
statusOffset:0
messageOffset:5612
offlineMessageSize:794
dateInSeconds:1409110867
bccList:
subject:sfg
setReferences:function setReferences() {
[native code]
}
numReferences:0
getStringReference:function getStringReference() {
[native code]
}
setRecipientsArray:function setRecipientsArray() {
[native code]
}
setCCListArray:function setCCListArray() {
[native code]
}
setBCCListArray:function setBCCListArray() {
[native code]
}
mime2DecodedAuthor:hechengjin88 <hechengjin88@126.com>
getAuthorCollationKey:function getAuthorCollationKey() {
[native code]
}
getSubjectCollationKey:function getSubjectCollationKey() {
[native code]
}
getRecipientsCollationKey:function getRecipientsCollationKey() {
[native code]
}
Charset:UTF-8
propertyEnumerator:[xpconnect wrapped nsIUTF8StringEnumerator]
复制代码
写信页,缓存窗口打开执行的js函数
onReopen: function(params) {
写信页中,做为新邮件编辑里,收信人等内容的加载会延时
fillRecipient_EditAsNew
if(iTo == countOfTo) //故在每一个延时后都要重新收集下联系人
{
saveRecipientsForCheck();
}
另外:收信人等编辑框内含有计数机制,当移除不成功时,应该是计数没有减到0
且移除方法要注意索引的动态变化
var ccleng = gAddressCc.items.length;
for (let i = 0; i < ccleng; i++)
{
gAddressCc.removeItemAt(0);
}
欢迎光临 firemail (http://firemail.wang:8088/)
Powered by Discuz! X3