Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 10712|回复: 1
打印 上一主题 下一主题

群发单显

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-3-27 22:51:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
---需求描述:
群发单显就是在群发邮件的时候,会采用一对一发送的方式,这样每个收件人看到的都是该邮件单独发给了自己,不会有群发的感觉。


----实现原理:
将收件人列表循环处理,一次只发给一个人。
----关键注意点:
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 记录原来是否保存到已发送中
用于群发单显后,再设置回去。
群发单显默认都调用 保存到已发送

回复

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
沙发
 楼主| 发表于 2016-3-27 22:52:24 | 只看该作者
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

  1. //alert(messageUri);//imap-message://hechengjin88@imap.126.com/&g0l6P3ux-#1385437452
  2.         //alert(hdr); //[xpconnect wrapped nsIMsgDBHdr]
  3.         var hdrinfos;
  4.         for(attribute in hdr){
  5.    var objectValue = eval('hdr.' + attribute);
  6.    dump(attribute + ":" +objectValue+"\n");
  7.    
  8.    hdrinfos += attribute + ":" +objectValue+"\n";
  9. }
  10. alert(hdrinfos);
  11.         identity = getIdentityForHeader(hdr, type);
  12.         //alert(identity); //[nsIMsgIdentity: id1]
  13.         //alert(format); //0
  14.         //alert(msgWindow); //[xpconnect wrapped nsIMsgWindow]
复制代码
hdr内容
  1. undefinedflags:129
  2. mime2DecodedRecipients:hechengjin <hechengjin@richinfo.cn>, hechengjin88 <hechengjin88@126.com>
  3. mime2DecodedSubject:sfg
  4. date:1409110867000000
  5. isFlagged:false
  6. getStringProperty:function getStringProperty() {
  7.     [native code]
  8. }
  9. messageSize:938
  10. folder:[xpconnect wrapped (nsISupports, nsIMsgFolder, nsIRDFResource, nsIMsgImapMailFolder)]
  11. getUint32Property:function getUint32Property() {
  12.     [native code]
  13. }
  14. recipients:hechengjin <hechengjin@richinfo.cn>, hechengjin88 <hechengjin88@126.com>
  15. ccList:
  16. accountKey:
  17. label:0
  18. author:hechengjin88 <hechengjin88@126.com>
  19. isRead:true
  20. messageId:53FD4F81.4000604@126.com
  21. markHasAttachments:function markHasAttachments() {
  22.     [native code]
  23. }
  24. QueryInterface:function QueryInterface() {
  25.     [native code]
  26. }
  27. getProperty:function getProperty() {
  28.     [native code]
  29. }
  30. setProperty:function setProperty() {
  31.     [native code]
  32. }
  33. setStringProperty:function setStringProperty() {
  34.     [native code]
  35. }
  36. setUint32Property:function setUint32Property() {
  37.     [native code]
  38. }
  39. isKilled:false
  40. markRead:function markRead() {
  41.     [native code]
  42. }
  43. markFlagged:function markFlagged() {
  44.     [native code]
  45. }
  46. priority:1
  47. setPriorityString:function setPriorityString() {
  48.     [native code]
  49. }
  50. OrFlags:function OrFlags() {
  51.     [native code]
  52. }
  53. AndFlags:function AndFlags() {
  54.     [native code]
  55. }
  56. threadId:1385437452
  57. messageKey:1385437452
  58. threadParent:4294967295
  59. lineCount:0
  60. statusOffset:0
  61. messageOffset:5612
  62. offlineMessageSize:794
  63. dateInSeconds:1409110867
  64. bccList:
  65. subject:sfg
  66. setReferences:function setReferences() {
  67.     [native code]
  68. }
  69. numReferences:0
  70. getStringReference:function getStringReference() {
  71.     [native code]
  72. }
  73. setRecipientsArray:function setRecipientsArray() {
  74.     [native code]
  75. }
  76. setCCListArray:function setCCListArray() {
  77.     [native code]
  78. }
  79. setBCCListArray:function setBCCListArray() {
  80.     [native code]
  81. }
  82. mime2DecodedAuthor:hechengjin88 <hechengjin88@126.com>
  83. getAuthorCollationKey:function getAuthorCollationKey() {
  84.     [native code]
  85. }
  86. getSubjectCollationKey:function getSubjectCollationKey() {
  87.     [native code]
  88. }
  89. getRecipientsCollationKey:function getRecipientsCollationKey() {
  90.     [native code]
  91. }
  92. Charset:UTF-8
  93. 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);         

        }

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-30 09:46 , Processed in 0.056327 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表