SylpheedでHTMLメールを表示する htmlview.dll 0.4.0

SylpheedでHTMLメールを表示するためのプラグインにhtmlviewというものがあります。

こいつはWebKitGTK+を使っているので、そのままではWindows版のSylpheed用にコンパイルするには茨の道という状況でした。

0.4.0になって、WebKitGTK+だけではなく、GtkHTMLに対応しました。(Unix系OSならコンパイルできるというだけ)

とはいえ、公開されているそれなりに新しいGtkHTMLのコンパイル済みバイナリは、いずれも新しめのGTK+を要求するのでそのままでは使えないというとても残念な状況でした。 かといって、要求するGTK+のバージョンが古いものを使ってもまともにHTMLをレンダリングできないという致命的な弱点がありました。

そこで、GtkHTML 3.32.2をGTK+ 2.10向けにバックポートしてGtkHTMLを自前でビルドするというとても不毛なことにチャレンジしてみました。

その結果がこちら。

f:id:kenhys:20130227232651p:plain

手元に届くコミットメールの差分のHTMLメール程度であれば、それなりに表示できるようになりました。

普段はUbuntu環境なのでWebKitGTK+版としてコンパイルして使っているんですが、これでWindowsでもようやくそれっぽくHTMLメールを表示する環境ができたことになります。

まだきちんと整備してはいませんが、ダウンロードはこちらからどうぞ。

http://gigo-ice.org/tech/sylpheed/index.ja.html

SylpheedでHTMLメールを表示する Windows編

Unix系OSではhtmlviewなるWebKitGTKを利用しているプラグインをSylpheed向けに過去に作りました。
多少インターフェースに難はありますが、HTMLメールを表示することができます。

が、このhtmlviewプラグインはWindows版を提供していません。

  • Sylpheed Windows版で使っているGTK+が2.10.14と古いためWebKitGTK+を使うにはちょっとつらそう
  • WebKitGTK+のバイナリの準備が面倒臭そう(試してない)

というのがその理由です。

GTK+のバイナリをごっそり入れかえてしまえばいいのかも知れませんが、プラグインとしてはそこまで要求するのはなんだかなぁというのがあります。

というわけで、その他の方法としてGtkHTMLによるHTMLメールの表示をやってみました。

GtkHTMLも依存関係がとても面倒臭いので自前でビルドしたりしているんですが、HTMLメールで送られてくるコミットメールの差分を表示するだけでこんなんなっているのでまだまだ改善が必要そうです。

SylpheedでHTMLメールと添付ありのメールを区別する

とつぶやいている人がいて、なるほどと思ったので、やってみました。

  • text/plain,text/htmlのみからなるメールについては小さなメールアイコンを表示
  • それ以外は従来通りクリップアイコンを表示

という動作をするようにしてみました。


上記を実現するためのパッチは以下の通りです。

diff -uNr '--exclude=.svn' sylpheed.orig/src/icons/htmlmail.xpm sylpheed.rev/src/icons/htmlmail.xpm
--- sylpheed.orig/src/icons/htmlmail.xpm	1970-01-01 09:00:00.000000000 +0900
+++ sylpheed.rev/src/icons/htmlmail.xpm	2012-08-18 16:29:42.000000000 +0900
@@ -0,0 +1,44 @@
+/* XPM */
+static char *htmlmail_xpm[] = {
+"8 12 28 1",
+" 	c None",
+"B	c #000000",
+"C	c #474747",
+"D	c #F5F5F5",
+"E	c #323232",
+"F	c #F4F4F4",
+"G	c #C1C1C1",
+"H	c #EAEAEA",
+"I	c #EBEBEB",
+"J	c #AAAAAA",
+"K	c #3D3D3D",
+"L	c #EFEFEF",
+"M	c #F3F3F3",
+"N	c #3F3F3F",
+"O	c #464646",
+"P	c #BDBDBD",
+"Q	c #D6D6D6",
+"R	c #A0A0A0",
+"S	c #F2F2F2",
+"T	c #BABABA",
+"U	c #E9E9E9",
+"V	c #8C8C8C",
+"W	c #BFBFBF",
+"X	c #DADADA",
+"Y	c #CDCDCD",
+"Z	c #A7A7A7",
+"a	c #D3D3D3",
+"b	c #282828",
+"        ",
+"        ",
+"        ",
+" BBBBBB ",
+"BBDDDDBB",
+"BDCLDCDB",
+"BDDCCDDB",
+"BDCGGCDB",
+"BCDDDDCB",
+" BBBBBB ",
+"        ",
+"        "
+};
diff -uNr '--exclude=.svn' sylpheed.orig/src/stock_pixmap.c sylpheed.rev/src/stock_pixmap.c
--- sylpheed.orig/src/stock_pixmap.c	2012-08-18 16:28:20.000000000 +0900
+++ sylpheed.rev/src/stock_pixmap.c	2012-08-18 16:29:20.000000000 +0900
@@ -34,6 +34,7 @@
 #include "icons/deleted.xpm"
 #include "icons/error.xpm"
 #include "icons/forwarded.xpm"
+#include "icons/htmlmail.xpm"
 #include "icons/interface.xpm"
 #include "icons/jpilot.xpm"
 #include "icons/ldap.xpm"
@@ -110,6 +111,7 @@
 	{error_xpm	 , NULL, NULL},
 	{forwarded_xpm	 , NULL, NULL},
 	{NULL, NULL, NULL, NULL, group, sizeof(group), "group", 0},
+	{htmlmail_xpm	 , NULL, NULL},
 	{interface_xpm	 , NULL, NULL},
 	{jpilot_xpm	 , NULL, NULL},
 	{ldap_xpm	 , NULL, NULL},
diff -uNr '--exclude=.svn' sylpheed.orig/src/stock_pixmap.h sylpheed.rev/src/stock_pixmap.h
--- sylpheed.orig/src/stock_pixmap.h	2012-08-18 16:28:20.000000000 +0900
+++ sylpheed.rev/src/stock_pixmap.h	2012-08-18 16:29:20.000000000 +0900
@@ -38,6 +38,7 @@
 	STOCK_PIXMAP_ERROR,
 	STOCK_PIXMAP_FORWARDED,
 	STOCK_PIXMAP_GROUP,
+	STOCK_PIXMAP_HTMLMAIL,
 	STOCK_PIXMAP_INTERFACE,
 	STOCK_PIXMAP_JPILOT,
 	STOCK_PIXMAP_LDAP,
diff -uNr '--exclude=.svn' sylpheed.orig/src/summaryview.c sylpheed.rev/src/summaryview.c
--- sylpheed.orig/src/summaryview.c	2012-08-18 16:28:20.000000000 +0900
+++ sylpheed.rev/src/summaryview.c	2012-08-18 16:38:22.000000000 +0900
@@ -139,6 +139,7 @@
 static GdkPixbuf *forwarded_pixbuf;
 
 static GdkPixbuf *clip_pixbuf;
+static GdkPixbuf *htmlmail_pixbuf;
 
 static void summary_clear_list_full	(SummaryView		*summaryview,
 					 gboolean		 is_refresh);
@@ -624,6 +625,8 @@
 			 &forwarded_pixbuf);
 	stock_pixbuf_gdk(summaryview->treeview, STOCK_PIXMAP_CLIP,
 			 &clip_pixbuf);
+	stock_pixbuf_gdk(summaryview->treeview, STOCK_PIXMAP_HTMLMAIL,
+			 &htmlmail_pixbuf);
 
 	font_desc = pango_font_description_new();
 	size = pango_font_description_get_size
@@ -2416,6 +2419,7 @@
 	MsgFlags flags;
 	GdkColor color;
 	gint color_val;
+	MimeInfo *mimeinfo = NULL;
 
 	if (!msginfo) {
 		GET_MSG_INFO(msginfo, iter);
@@ -2473,8 +2477,23 @@
 	else if (MSG_IS_FORWARDED(flags))
 		unread_pix = forwarded_pixbuf;
 
-	if (MSG_IS_MIME(flags))
-		mime_pix = clip_pixbuf;
+	if (MSG_IS_MIME(flags)) {
+		mimeinfo = procmime_scan_message(msginfo);
+		while (mimeinfo) {
+			if (mimeinfo->mime_type != MIME_TEXT &&
+			    mimeinfo->mime_type != MIME_TEXT_HTML &&
+			    mimeinfo->mime_type != MIME_MULTIPART) {
+				break;
+			} else {
+				mimeinfo = procmime_mimeinfo_next(mimeinfo);
+			}
+		}
+		if (mimeinfo) {
+			mime_pix = clip_pixbuf;
+		} else {
+			mime_pix = htmlmail_pixbuf;
+		}
+	}
 
 	if (prefs_common.bold_unread) {
 		if (MSG_IS_UNREAD(flags))

Sylpheed でHTMLメールを閲覧できるようにする

Windowsでも頑張ってみた続報はこちら。id:kenhys:20130218
Sylpheed でHTMLメールを閲覧するとテキストで表示されます。
リンクとかは有効なのですが、ちょっと残念な感じです。


Sylpheedにはプラグインを追加できますね!
というわけで、HTMLメールを描画するためのプラグインを作ってみました。


丁度良いHTMLメールのサンプルがなかったのでアレですがメッセージビューに
Googleロゴ画像がきちんとレンダリングされています。

HTMLのレンダリングにはWebKitGTK+を使ってみました。


ソースコードは以下から入手してコンパイルしてください。
Ubuntuだとapt-get install libwebkitgtk-devをあらかじめインストールしておく必要があります。

https://github.com/kenhys/sylpheed-htmlview

tar.gzが欲しい人は以下のリンクから入手できます。
https://github.com/kenhys/sylpheed-htmlview/tarball/0.1.0


Windows用にバイナリを用意したいところだけども、
WebKitGTK+のコンパイル済みバイナリって(MinGW用)って公式サイトでは提供していないのか。うーむ。

Sylpheedでメールファイルをコピーする Msg2Clip.dll 0.1.0 公開

現実逃避でSylpheedのメールをクリップボードにコピーするプラグインをつくりました。

メール本文ではなくファイルをクリップボードにコピーするので、
ファイラやらエクスプローラなどで任意のディレクトリへ貼り付ける操作を
行うことができるようになります。


ファイルメニューから名前をつけて保存で事足りるというツッコミもありますが。


ヘッダ表示部分にコピー用ボタンを追加しました。

内部的にはCF_HDROPでクリップボードにファイルパスを設定しているのでWindows限定です。


ダウンロードは以下から。Sylpheed 3.2.0beta5以降
http://gigo-ice.org/tech/sylpheed/index.ja.html

Sylpheed で送信元のメールクライアントをアイコン表示する sylicons.dll 0.1.0

送信元のメールクライアントをヘッダを参照して表示するsylicons.dllを作ってみました。
X-Faceなんかと同じように表示することができるようになります。


動作している際のキャプチャアニメは以下のような感じ。
テスト用に用意した適当なメールデータで表示させています。
ThunderbirdでいうところのDispMUAみたいなものです。


ダウンロード先については後程。

Sylpheedでスペルチェックを有効にするために必要なこと(win32)

Sylpheedはスペルチェック機能をサポートしています。
しかし、Windowsだと無効です。使えません。


それではあまりに悲しいので、どうにかできないか試行錯誤してみました。


まず、スペルチェック自体はGtkSpellを利用して提供しているようです。
で、GtkSpellはEnchantに依存しています。
Enchantはというと複数のバックエンドに対応しています。

というわけで、以下ができればいいわけです。

  1. バックエンドのビルド
  2. Enchantのビルド
  3. GtkSpellのビルド

まずバックエンドですが、hunspell 1.3.2についてはmingwビルドがありました。のでこいつを使用します。
https://github.com/zdenop/hunspell-mingw

bin,include,libをc:/MinGW/localへと複写します。


次にenchant 1.6.0をビルドします。
暫定的に以下のパッチを当てます。(このやりかたはまっとうではないので注意)

--- C:/MinGW/msys/1.0/home/khayashi/pkg/enchant-1.6.0/src/enchant.c.orig	Fri Apr 02 05:53:37 2010
+++ C:/MinGW/msys/1.0/home/khayashi/pkg/enchant-1.6.0/src/enchant.c	Sat Jan 07 10:36:34 2012
@@ -1428,8 +1428,9 @@
 					UINT old_error_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
 #endif
 					filename = g_build_filename (dir_name, dir_entry, NULL);
-					
-					module = g_module_open (filename, (GModuleFlags) 0);
+
+					module = g_module_open (dir_entry, (GModuleFlags) 0);
+
 					if (module) 
 						{
 							if (g_module_symbol
 ./configure  --prefix=/mingw/local --with-system-myspell=no --with-myspell-dir=./share/myspell/dicts --with-ispell-dir=./share/ispell/dicts --with-uspell-dir=./share/uspell/dicts --target=i686-mingw32
make
make install

次にgtkspell 2.0.16をビルドします。(Sylpheedビルド用のGTKディレクトリに突っ込んでいます。)

./configure --prefix=/home/khayashi/Project/sylpheed/GTK --enable-shared
make
make install

最後にsylpheedをビルドします。--enable-gtkspellの追加を忘れずに。

#!/bin/sh

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include
export HOME=/home/khayashi/Project/sylpheed
./configure --prefix=$HOME/dist --with-localedir=lib/locale \
  --enable-oniguruma \
  --enable-gtkspell \
  --enable-threads \
  'CC=gcc -mtune=pentium3' CFLAGS=-O3 

で、あとは以下のdllをsylpheed.exeと同じ階層にコピーします。あと、libsylph系も。

  • libenchant-1.dll
  • libenchant_myspell.dll
  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll

辞書については以下のディレクトリに配置します。(よくわからないのでUbuntuからまるっともってきました。)
./share/myspell/dicts

ここまでやると、こんな感じにスペルチェックが有効になります。

enchantをビルドするときにパッチ当てていましたが、本来は以下のような指定をまじめに指定すれば不要なはずです。
(今はc:/MinGWにインストールされているほうを中途半端に参照してしまっているのでとりあえず動くという仕組み。)

  • ENCHANT_PREFIX_DIR
  • ENCHANT_GLOBAL_MODULE_DIR
  • ENCHANT_GLOBAL_ORDERING