沟通系统
邮件列表等沟通工具
群英汇邮件列表更新
11月12日
经过近两周的工作,群英汇邮件列表系统(Mailman)更新了,主要修正了以下四个方面的问题。
归档附件链接由绝对路径改为相对路径
发给邮件列表的邮件若有附件,Mailman 在生成归档网页时会将附件保存到相应文件,并在归档网页中建立链接。通常会用华丽的分割符“—”来界限,然后是相应的链接。链接是相应归档附件的绝对地址,即用 http打头,紧跟着是域名,可以点击链接查看或下载附件。
群英汇邮件列表有一个改进就是将绝对地址转换为相对地址,这样当用户的邮件列表主机的域名修改后或者因为安全上的需要由HTTP转换为HTTPS协议的时候,归档的链接也依然有效。否则,在更换域名时这些网页必须重新生成,这对有大量邮件存档的服务器来说将是一个梦魇。
但是,群英汇之前的实现有一个副作用,就是当使用相对路径则没有生成链接,而只是文本显示出来
-------------- next part -------------- 一个HTML附件被移除... URL: </mailman/private/tech/attachments/20101111/79f938b2/attachment.htm>
在经过反复的研究之后,终于定位在代码 Mailman/Archiver/HyperArch.py:
158 # Argh! This pattern is buggy, and will choke on URLs with GET parameters. 159 # MAS: Given that people are not constrained in how they write URIs in plain 160 # text, it is not possible to have a single regexp to reliably match them. 161 # The regexp below is intended to match straightforward cases. Even humans 162 # can't reliably tell whether various punctuation at the end of a URI is part 163 # of the URI or not. 164 urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE)
神马意思呢?就是说:
当你看到这个正则表达式的时候,它已下了一个艰难的决定,就是以http://开头的文本行将进行一系列操作,添加上<a>标签,制作成链接,否则无视。
我们为了让相对URL和绝对URL不再打架,不再让用户为难,我们做出一个超级强大的正则表达式,并和QQ 100% 兼容。
index a532c81..9aa8c6f 100644
--- a/Mailman/Archiver/HyperArch.py
+++ b/Mailman/Archiver/HyperArch.py
@@ -161,7 +161,7 @@ emailpat = re.compile(r'([-+,.\w]+@[-+.\w]+)')
# The regexp below is intended to match straightforward cases. Even humans
# can't reliably tell whether various punctuation at the end of a URI is part
# of the URI or not.
-urlpat = re.compile(r'([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])', re.IGNORECASE)
+urlpat = re.compile(r'(?P<prefix>url:\s*<)?(?P<url>(?(prefix)[^\s\'">]+|[a-z]+://.*?))(?:_\s|_$|$|[])>\'"\s])', re.IGNORECASE)
# Blank lines
blankpat = re.compile(r'^\s*$')
@@ -1224,19 +1225,19 @@ class HyperArchive(pipermail.T):
if kr is None:
k = -1
else:
- k = kr.start(0)
+ k = kr.start('url')
if j != -1 and (j < k or k == -1):
text = jr.group(1)
length = len(text)
... ...
URL = 'mailto:' + text
pos = j
elif k != -1 and (j > k or j == -1):
- text = URL = kr.group(1)
+ text = URL = kr.group('url')
length = len(text)
pos = k
else: # j==k
上面的正则表达式有哪位网友不解,待我有时间,下回分解。
归档html附件取消转义
默认Mailman会将HTML格式文本进行转义,在点HTML附件链接时看到的是HTML源码。而实际上用户更希望看到的是实际显示的内容。仔细分析以后发现,原来有一个转义函数,将文本里的HTML标签进行了转义,然后还自己定义了一个<tt>标签把这些内容括起来,为的是让显示更加规整。
整个注释掉此转义函数,这样邮件的 HTML 附件能够在归档中直接以 HTML 显示了。风险也是有的,就是会让列表的 HTML 归档被滥用,如用 HTML 链接进行 SEO 等,不过公司或团队范围使用,大可放心,没有哪个用户胆敢发送垃圾邮件。
自动回复邮件首选reply-to地址,其次是From地址
有时我们发邮件不希望自动回复到发件人地址,就需要提供一个 reply-to 地址。
我们的一个客户在使用邮件列表时,设置了自动回复器用于人员招聘等工作,发现从 51job 发送的简历的求职者的邮件地址都放到了 Reply-To 邮件头。由于 Mailman 自动转发器没有使用 Reply-To 邮件头,导致自动回复失败。
我们的改进也很简单,就是先对 reply-to 邮件头进行判断。有了这个改进后,自动回复器在复杂的环境中也可以使用了。
自动回复邮件内容取消自动折行
Mailman在发送自动回复器在回复的时候先对回复内容进行了处理,以70字符为界断行,结果显示效果不是很好看。这可能是历史原因造成的,可能当时的显示屏比较小,一行只能显示70字符,段行比较美观。但现在的显示屏比当时先进多了,而且大多数邮件都有自动换行显示的功能,这个就没必要了。修改也很简单,取消掉这个自动折行的函数即可。

群英汇 Mailman 人性化设计(5): 创建新列表
5月29日
创建新列表,在 Mailman 中是如何进行的呢?看看 Python 的邮件列表的新建页面。
- 输入列表名称,以及一系列列表的设置
- 在表单的最后,需要输入口令,即:List creator’s (authentication) password
即 Mailman 本身的创建列表的授权,是通过简单的密码检查完成的。这样的实现存在安全问题和管理问题:
- 密码认证在不安全的 http 信道内进行,存在密码泄漏风险
- 只有密码,没有用户名的不完整的认证。知道密码的可能有多个人,无法得知是谁完成的操作
- 密码管理,需要在命令行下执行 mmsitepass 命令重置管理员密码或者列表创建密码
群英汇扩展的Mailman解决这个问题,是通过双因子认证完成的。
阅读全部内容 »

群英汇 Mailman 人性化设计(4): 列表订阅策略
5月27日
Mailman 本身只包含三种订阅策略,有:确认, 要求核准 和 确认并核准。这三种订阅策略都要求用户手工输入自己的邮件地址,以及一个口令。例如:Python-idea 列表的订阅。
这样的邮件列表使用起来不方便,尤其对于企业用户可能有着下面的需求:
- 只允许使用公司内部的邮件地址订阅,不允许使用其它非企业邮箱订阅;
- 如果员工用外网邮箱订阅,会出现员工离职但是邮件通知仍然通过外网邮箱获取,导致信息泄漏;
- 企业都有相应的用户管理中心甚至认证中心,应该允许认证用户直接订阅,而不必手工输入邮件地址信息;
群英汇扩展了邮件列表系统的订阅策略,增加了两个新的订阅策略。

群英汇 Mailman 人性化设计(3): 列表订阅的人性化设计
5月17日
在邮件列表一览页面,当点击某个列表,将进入相应列表的首页。在 Mailman 本身的实现中,这个首页会包含该列表的订阅对话框(需要手动填写),还包含该列表的订阅编辑对话框。例如:Python-idea 列表的首页 。
而群英汇为每个列表的首页都加入的身份认证的判别。如果用户已经登录,则显示类似下面的界面:
- 如果列表已经订阅,会显示“用户已经订阅本列表”的信息
- 如果用户尚未订阅列表,会显示订阅对话框,不过对话框中的邮件地址信息已经自动填好。
- 在花名册查看对话框以及订阅编辑对话框等,不再显示口令输入等输入对话框,而是简化成一个按钮,因为认证已经完成或者认证会在点击对话框后开始。
另外一个主要的不同,订阅的策略的改进,增加了新的订阅策略,更加符合公司/团队的使用习惯。请听下回分解。

群英汇 Mailman 人性化设计(2): 管理员认证方式和管理员面板的变化
5月9日
Mailman 的管理员界面缺省并不进行认证(例如:Mailnan 项目本身的 admin 页面),这有点说不过去:
- 管理员界面中的创建新列表链接,需要口令认证
- 管理员界面中的其他链接,指向各个列表的配置界面,也需要口令认证
- 因为管理员界面不进行认证,因此非公开列表也不显示,管理员也成了瞎子…
在我们为 Mailman 增加了新的认证机制后,管理员界面必须登录才能访问,并能够显示列表概要信息。下面显示的是登录后的管理员面板:

群英汇 Mailman 人性化设计(1): 列表一览页增加登录和已订阅列表加亮
5月1日
群英汇为 Mailman 增加了独创的认证插件,从根本上改变了 Mailman 原有的基于简单 COOKIE 加口令的认证方式。为普通用户和管理员使用邮件列表提供了更为人性化的设计。
首先,我们介绍一下在 listinfo 页面,就是 列表一览 页面的改进。
阅读全部内容 »

wordpress日志评论时间错误问题
1月14日
也许这个问题在你的服务器中不是常见的,但是偶然间还是会碰到的,它就像定时炸弹一样,说不定
下一秒钟在你的服务器上爆发了。
关于这个问题的解决过程真的不敢妄自菲薄,我先把问题叙述一下。这个是我们错误显示的截图:
当你看到那个醒目的”大约-1年”时,不知道你作何敢想。原来鼎鼎大名的Wordpress也有这样的
错误,其实细查下来才会发现这是当前主题和Wordpress内部函数共同酿成的苦果。
有了以往查找错误的经验,先查找“大约-1年前”出现的变量的地址,然后就可以按图索骥了,根
据变量你很快就能定位到“主题名/functions.php“文件中,在functions.php下的timeSince函数中
有这样一个变量:$since,
$since = current_time('timestamp',$wp_time_offset ? get_option('gmt_offset') : 0) - $startTimestamp;它的值为当前时间-发表评论的时间,你可以打一下这个
current_time('timestamp',$wp_time_offset ? get_option('gmt_offset') : 0),结果显示那条错误的评论和那些正确的评论取出的当前时间都是正确的,说明问题还不在于此。
继续往下找,在真正输出时间的地方,该主题又对发表评论的时间进行了处理,如下:
comment_date));?>
,
用echo命令输出的信息表明$comment->comment_date所取出的时间并没有错误,错误就发生
在strtotime,这个PHP内部函数上,PHP内部函数也会出问题?我的第一个反应就是这样。
我们看一下PHP的这个函数,下面是对该函数的说明:
The function expects to be given a string containing a US English date format and will try to parse that format into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 UTC), relative to the timestamp given in now , or the current time if now is not supplied. This function will use the TZ environment variable (if available) to calculate the timestamp. Since PHP 5.1.0 there are easier ways to define the timezone that is used across all date/time functions. That process is explained in the date_default_timezone_get() function page.
但是在我们的环境中为什么会对一个时间点处理出错呢,这个原因我慢慢再道来。
我们已经把这个问题的解决方案提交到github上了,这个是问题的地址:
改动1,
改动2。改完了就再也不会出问题了




最新评论