Miles' Blog

Welcome 2 My Planet

Available categories: [/] [development. ~]

Yup Mailman - 我们的自用群发软件 [Permalink]

Wed Sep 15 10:04:09 CST 2004

因为目前的网站推广需要,这两天抽空作了一个群发邮件的桌面程序。以前没真正做过swing UI,这也算是新的尝试了 /images/emoticons/wink.gif

程序的核心是利用socket与目标smtp server通信来发信。因为考虑到带宽的利用率,所以设计了多线程的方式。这里的任务分配其实很有学问,目前只是简单的根据mail address的数量和用户设置的thread count进行了数学上分配,其实考虑到建立socket的开销,更好的方式是根据主机MX纪录来分配,这样可以最大限度的利用现有socket资源,避免频繁的握手。。。有空一定要好好优化这部分! (y)

大多的工作还是在周边。一方面是UI,还有一方面是设置文件、成功失败列表文件、临时预览文件的管理,以及他们和UI的交互。大量的dirty works。。。还好有jb这样的优秀RAD工具,否则现在也没有写笔记的功夫了 /images/emoticons/silly.gif

总结一下其间遇到的几个难缠的问题:

  1. 要让滚动条总在最下端,有3个方法:
    • 调用JScrollPane.getViewport().scrollRectToVisible(),使得最下面的某一点可见;
    • 设置vertical scroll bar的value到max;
    • 在scroll pane里面setCaretPosition()(也就是编辑光标的位置)到length()。
    看上去第一和第二个方案比较cool一点,可实际上用于多线程环境都会造成死锁。而我这里恰好有一个需要多线程更新scroll pane的地方:失败和成功邮件状态察看(参看下面的截图)。这里为了保证逐行的显示mail address,不至于串行,所以在scroll pane内的那个text pane上用到了synchronized() {}
    没有细看类库的source,我推测可能是因为这些操作都不是原子的,而其中某些步骤和我这里的synchronized相互竞争了锁导致的问题。这里还有待进一步的研究(如果有时间/images/emoticons/silly.gif)。

  2. 发信时候,有些smtp server会反向查询from地址的主机部分,检查和你的本机ip是否相同。我现在用的是blah@本机ip地址,不过似乎有时候还是会失败。这个需要深入测试
  3. 我的几个dialog,比如preference,还有preview,都是在show的时候让默认的cancel/close button去requestFocus(),不过完全没有作用 /images/emoticons/sad.gif
其他的问题大多没什么难解决的,细心就没问题了。目前的版本还很粗糙,我的目标是把它最终做成一个功能完善的共享软件。有时间就有可能,呵呵。。 下面是一些界面截图以供参考 /images/emoticons/happy.gif



主界面




参数设置界面




邮件预览菜单:可以用内部的浏览器,或者IE进行预览。




预览界面




开始发送




失败和成功邮件状态察看




发送完成报告

Posted by: miles

Comments on this entry





Author (*):
Verify Code (*):8 9 7 9
E-mail:
URL:
Comment (*):
Remember me?

Available categories: [/] [development. ~]

Powered By blojsom   RSS Feed  RSS2 Feed  RDF Feed