LoginSignup
1
0

More than 3 years have passed since last update.

HTMLメールへのplaintextでの返信で引用部分が1行おきに改行される話

Posted at

状況

  • 日々多量に受信する電子メールの多くがHTMLメールである。
  • しかしながら、自身はplaintextでの送信、返信をなるべく実施したい(ポリシーみたいなもの)。
  • 周囲の標準環境はOutlookだが、自身の肌に合っているMUAはThunderbirdである。
  • Outlook 2016 / Thunderbird 68.7.0 / Windows 10

解決したい問題

  • OutlookのHTML形式で送信されたメールにThunderbirdでplaintextで返信しようとすると、元メールの引用部分に1行おきに余計な改行が入ってしまう。
  • 単純に1行おきになるのではなく、もともと空行だった箇所はそのまま1つの空行になる。

元メール(Outlookで書かれたHTML形式)

こんにちは。
いつもお世話になっております。

例の件ですが、OKです。
よろしくお願いいたします。

Thunderbird plaintextで返信しようとしたときの引用文

> こんにちは。
> 
> いつもお世話になっております。
> 
> 例の件ですが、OKです。
> 
> よろしくお願いいたします。

解決策の模索

  • Thunderbirdのメール編集画面での置換で直せるか?
    • 上述の通り、「単純に1行おきになるのではなく、もともと空行だった箇所はそのまま1つの空行」となり失われている情報があるため、返信メールの編集画面での解決は不可能。
  • 元メールをコピー&ペーストして置換で直せるか?
    • これはうまくいきそう。

元メール(Outlookで書かれたHTML形式)

こんにちは。
いつもお世話になっております。

例の件ですが、OKです。
よろしくお願いいたします。

元メールをテキストエディタにコピー&ペーストしたもの([space]はわかりやすく明示したもの)

こんにちは。

いつもお世話になっております。

[space]

例の件ですが、OKです。

よろしくお願いいたします。

本来の空行でスペースがひとつ入る親切設計。

テキストエディタで s/\r\n\r\n/\r\n> /g (2連続CRLFをCRLFと引用符に置換)して、冒頭に追加で引用符を挿入すればOK。

> こんにちは。
> いつもお世話になっております。
> 
> 例の件ですが、OKです。
> よろしくお願いいたします。

これで欲しい引用部分ができた。

実装方針の模索

  1. Thunderbirdの本体修正やアドオン開発
    • Thunderbird BugZillaを見てもいまいちピンとくるものはなく、11年前が最終更新の Bug 520755 があるくらい。事情を説明して修正に持っていくまではかなり労力がかかりそう。
    • アドオン開発は、可能かどうかの調査を含めて土地勘がなさすぎて今回は見送り。
  2. テキストエディタで置換
    • 正規表現での置換ができるエディタであれば何でもできる。
    • 実際これでしばらく運用していたが、「受信メール全体をコピー」→「エディタの画面に移動して貼り付け」→「置換」→「エディタで全体コピー」→「返信メールに貼り付け」という流れがやはり面倒。
  3. クリップボードの中身を置換するプログラムでの実装
    • エディタに頼らずクリップボードの中身を置換してしまう作戦。
    • 「受信メール全体をコピー」→「プログラムの実行」→「返信メールに貼り付け」とエディタを使うよりも大分ショートカットできる。
    • プログラム自体の起動はキーボードショートカットでもなんでもよし。
    • 今回はこれでいってみよう。サクッとGoで。

仕様とコード

  • クリップボードの中身を読んで置換する。改行の前提はCRLF。
  • ついでに前後の余計なスペースや空行も除去しておく。
replyfilter.go
package main

import (
    "strings"
    "github.com/atotto/clipboard"
)

func main() {
    var str string

    // Read from clipboard
    str, _ = clipboard.ReadAll()

    // Trim, replace and quote
    str = strings.TrimSpace(str)
    str = strings.Replace(str, "\r\n\r\n", "\r\n> ", -1)
    str = "> " + str + "\r\n"

    // Write to clipboard
    clipboard.WriteAll(str)
}

使い方

  • 適当な名前(replyfilter.exe)でgo buildして実行すればクリップボードの中身が置換される。
  • キーボードで何でもしたいなら、exeファイルにショートカットを作って、ショートカットをスタートメニューかデスクトップに置いて、キーボードショートカットを設定するなりなんなり。

備考

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0