@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.
+ 1 - 0 | §Gmail的noname附件

看上去导致Gmail收到邮件里面出现文件名为 noname 的附件的原因很复杂,所以直到现在 Gmail 开发团队仍然没办法完美解决这个很纠结的问题。

网上能找到的解决方法不多:一个是用 php 写的小脚本,用于修正从Mac系统发出的MIME邮件中附件文件名编码双单引号问题;一个是用 openssl 对 base64 编码的附件内容进行解压 [1]。但都是针对 Mac 系统的。

可给我发邮件的哥们都是最傻瓜不过的 MS Outlook 使用者,那天他别人通过 51job 的发送简历功能发过来的应聘邮件存成 eml 再放在附件里发给我,然后我收到的就是十几个 noname 附件。。。

直接把 noname 附件保存到本地,加上 .eml 文件后缀就可以直接用 Outlook Express 打开了。但打开之后邮件内容一半能看一半是乱码。

用文本编辑器打开这个 noname 文件,可以看到 outlook 发出来的时候对文本使用 base64 编码,对 html 附件使用 quoted-printable 编码。

把使用 quoted-printable 编码的 html 附件那部分 MIME multi-part 内容删掉再用 OE 打开,可以看到 base64 编码的邮件正文都正常了。再回过头去看打开的 html 附件的源代码,发现解码出来的 html 文件每一行开头都多了一个 = 号。就因为这一个 = 号,使得 html 的语法全都乱掉了。把 quoted-printable 编码的那部分代码每一行结尾的 = 号删掉,再用 OE 打开,看到的 html 附件就正常了。

因为原始发出的邮件给我收取的时候自动从服务器删除了,暂时没法验证这个多出来的 = 号是 outlook 发的时候就有还是 gmail 收取过程中产生的。 查看了一下服务器原始发出的邮件,发现邮件内容全部都是 base64 编码的,因为我是设置了自动转发到Gmail邮箱的,结果经过MDaemon二次处理转发之后的邮件就被转码成 quoted-printable 并且每行结尾多了类似=OA=的字符。如果直接设置 Gmail 通过 pop3 方式收取的话就不会出现乱码。看来还是由于不同的邮件系统对邮件进行处理的时候添加了某些不标准的元素而导致noname的出现。Gmail 到现在还搞不定这个问题,大概是因为邮件服务器和客户端的种类实在太多太繁杂了吧。

看来没什么好的解决方法,要手工去把多余的 = 号去掉也太费劲,用脚本处理还差不多。还是先让对方以后打成压缩包再发给我吧。

附:

[1] blogspot 被墙,该文内容如下:I have to write this down, otherwise I'll have to spend another hour figuring it out again.

  1. Save the attachment from Gmail to the desktop (I assume as noname).
  2. Edit it to remove the small MIME attachment near the top (the real document is the second one). Also remove all the MIME header information. What you should be left with is a huge continuous chunk of text. Don't forget to remove the MIME delimiter at the bottom of the file.
  3. Run the following command...
    openssl enc -d -base64 -in noname -out somename
  4. That's it! The output (somename) should be a usable now.
标签 ( 网络 ) :
+ 0 - 0 | §制作Windows下的Portable Firefox

虽然 PortableApps 提供的 Firefox 便携版已经很好用,不过有些时候还是会需要按自己的特殊需求制作更为个性化的绿色版本。比如把某个富客户端的内部系统用Firefox包装成一个压缩包让那些只知道马桶套套的用户解压使用就会比说服他们安装Firefox浏览器并做各种配置来得有效,同时可以得到比IE快N次方倍的访问效果。

当然其实 Firefox 本身的运行机制就已经相当绿色了。通过 -profile "<path>" 参数可以指定Firefox启动使用的个人配置文件目录,通过 -no-remote 参数可以允许同时运行多个Firefox进程实例;[1] 启动时使用这两个参数就已经能够保证 Firefox 不与系统其他程序发生冲突。

所以Portable第一步,把整个 Firefox 安装目录复制一份,然后把自己现有的profile目录(缺省情况下Firefox Profile 在 Documents and Settings\[当前登录用户名]\Application Data\Mozilla\Firefox\Profiles\随机目录名 中)覆盖到 defaults\profile  子目录。然后在主目录建一个简单的批处理文件:

firefox -no-remote -profile defaults\profile

运行该批处理即可启动。如果嫌批处理的命令行窗口难看的话,可以考虑安装一个 AutoHotKey ,利用该程序附带的 ahk2exe 工具编写启动脚本并编译成可执行的EXE文件。ahk 脚本文件的语法很简单,参考官方的help文档即可。个人比较喜欢把整个复制出来的Firefox目录作为子目录并设置成隐藏属性,然后在主目录下就只剩下一个由 ahk2exe 编译出来的引导程序,看上去会比较干净。ahk脚本如下:

Run, %A_ScriptDir%\Firefox\firefox -no-remote -profile defaults\profile, %A_ScriptDir%\Firefox\, Max
ExitApp

然后用 ahk2exe 指定源 ahk 和 目标 exe (同时还可以给你的目标 exe 配一个个性化的图标文件),进行转换即可。

当然直接拷出来的Firefox和profile目录会有很多并不一定需要的文件内容。

其中必须删除的文件:
defaults\profile 目录下 ->
    compatibility.ini
    extensions.cache
    extensions.ini
    pluginreg.dat
    XPC.mfl
    xpti.dat
    XUL.mfl

这些文件在firefox运行的时候会自动根据当前目录进行生成。如果不删除的话当打包到其他电脑之后解压缩到与之前不一样的目录的话就会出现扩展、插件无法正常加载等异常。

可以选择性删除的:
主目录下的 ->
目录
    searchplugins  搜索引擎插件,如果不想显示搜索工具栏的话这个目录就不需要
    uninstall  卸载目录,都绿色了也就不需要它了
    updates 更新目录,做成绿色了一般要把自动更新关闭,这个目录也不需要
文件
    browserconfig.properties
    install.log
    LICENSE
    old-homepage-default.properties
    update.locale
    updater.exe
    updater.ini
defaults\profile 子目录下的 ->
    bookmarks.html
    compreg.dat
    content-prefs.sqlite
    cookies.sqlite
    cookies.sqlite-journal
    downloads.sqlite
    formhistory.sqlite
    places.sqlite
    places.sqlite-journal
    search.json
    search.sqlite
    signons.sqlite
    urlclassifier3.sqlite
    目录
        bookmarkbackups
        Cache 缓存目录,完全可以删掉,不然文件会比较大
        minidumps

这些文件基本上是个人访问相关的历史数据,如果不需要的话都可以删除(尤其当有些历史数据会非常大的时候)。当要生成一个不保存访问隐私数据的便携版时那些 .sqlite 之类的都能删掉,如果是给自己用的话根据需要来选择保留那些历史数据。

同样,可以把这些删除多余内容的操作也写成 ahk 脚本来自动执行,这样每次重新发布新版本的时候清理起来就比较方便。比如:

FileDelete, %A_ScriptDir%\defaults\profile\compatibility.ini
FileDelete, %A_ScriptDir%\defaults\profile\extensions.cache
FileDelete, %A_ScriptDir%\defaults\profile\extensions.ini
FileDelete, %A_ScriptDir%\defaults\profile\pluginreg.dat
FileDelete, %A_ScriptDir%\defaults\profile\XPC.mfl
FileDelete, %A_ScriptDir%\defaults\profile\xpti.dat
FileDelete, %A_ScriptDir%\defaults\profile\XUL.mfl

FileDelete, %A_ScriptDir%\defaults\profile\compreg.dat

FileDelete, %A_ScriptDir%\defaults\profile\downloads.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\places.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\places.sqlite-journal
FileDelete, %A_ScriptDir%\defaults\profile\search.json
FileDelete, %A_ScriptDir%\defaults\profile\search.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\urlclassifier3.sqlite

FileDelete, %A_ScriptDir%\defaults\profile\bookmarks.html
FileDelete, %A_ScriptDir%\defaults\profile\content-prefs.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\cookies.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\cookies.sqlite-journal
FileDelete, %A_ScriptDir%\defaults\profile\signons.sqlite
FileDelete, %A_ScriptDir%\defaults\profile\formhistory.sqlite

FileRemoveDir, %A_ScriptDir%\defaults\profile\bookmarkbackups, 1
FileRemoveDir, %A_ScriptDir%\defaults\profile\Cache, 1
FileRemoveDir, %A_ScriptDir%\defaults\profile\minidumps, 1

FileDelete, %A_ScriptDir%\browserconfig.properties
FileDelete, %A_ScriptDir%\install.log
FileDelete, %A_ScriptDir%\LICENSE
FileDelete, %A_ScriptDir%\old-homepage-default.properties
FileDelete, %A_ScriptDir%\update.locale
FileDelete, %A_ScriptDir%\updater.exe
FileDelete, %A_ScriptDir%\updater.ini

FileRemoveDir, %A_ScriptDir%\searchplugins, 1
FileRemoveDir, %A_ScriptDir%\uninstall, 1
FileRemoveDir, %A_ScriptDir%\updates, 1

MsgBox, Firefox Directory Cleaning Finished

ExitApp

另一个需要注意的是 Firefox 对于在系统注册表里面注册的插件的处理。比如像 Java Quick Starter, Google Update, Microsoft .NET Framework Assistant 这些玩意,虽然你期望的是真正的绿色版,但在启动之后 Firefox 会自动搜索windows系统注册表把注册的插件给装上。大多数情况下除了 Flash, Media Player 有限几个插件之外,其他乱七八糟的插件都不应该启用。

要让 Firefox 在启动后自动禁用某些流氓插件,就需要用到主目录下的 blocklist.xml [2] 文件。在其中的  <emItems> 标签中加上 <emItem id="jqs@sun.com"/> 禁用 Java Quick Starter ,在 <pluginItems> 标签下加上

  <pluginItem>
    <match name="name" exp="^Picasa"/>
  </pluginItem>
  <pluginItem>
    <match name="name" exp="^Java"/>
  </pluginItem>
  <pluginItem>
    <match name="description" exp="^DRM "/>
  </pluginItem>
  <pluginItem>
    <match name="name" exp="^Google"/>
  </pluginItem>

来禁用其他插件。具体根据实际情况使用不同的正则表达式来匹配需要禁用的内容。修改好之后你还需要给 defaults/profile/prefs.js 文件增加几个配置项:

user_pref("extensions.blocklist.enabled", true);
user_pref("extensions.blocklist.interval", 8640000);
user_pref("extensions.blocklist.url", "");
 

以激活 blocklist 机制同时把 block url 设为空(否则 Firefox 会根据 interval 的时间间隔定时从服务器上抓取最新的 blocklist.xml 覆盖到本地文件)。最好把 blocklist.xml 设为只读属性,免得被重写。

最后一点, Firefox 3.5 仍然没有设置 urlclassifier.updatecachemax 参数,所以该cache文件变成巨无霸导致 Firefox 极端不稳定的可能性依然存在(未经验证),最好再给 prefs.js 加上:

user_pref("urlclassifier.updatecachemax", 20971520);

防止 Firefox CPU 占用 100% 的问题出现。

附:

修改Firefox的默认图标 -> 在 chrome\icons\default 目录下放置你喜欢的图标文件覆盖(目录不存在的话直接新建即可),其中 main-window.ico 这个图标是显示在标题栏左边,以及状态栏中的,其他的应该是打开帮助,扩展等等子窗口上的图标
修改Firefob标题栏后缀 -> 安装 Titlebar Tweaks 扩展

[1] Firefox 启动的命令行参数参考 (Command line arguments)
[2] blocklist.xml语法

标签 ( 网络 ) :
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号