10

作成されたメッセージのMessage-IDに基づいて、emacs / gnusに動的な「Reply-To:」(および「From:」)ヘッダーを生成するにはどうすればよいですか?+detail外部(perl)スクリプトを使用して、「Messaged-ID:」ヘッダーに基づいて動的パーツを生成したいと思います。

user+detail@example.net

外部スクリプトによって生成されたコンテンツを使用してヘッダーを作成することができました。スクリプトは、コマンドラインパラメータとしてusenetグループ名を取得します。メッセージIDの値も渡したいと思います。

私の現在のコード
〜/ .emacs:

'(gnus-posting-styles ("^pl\\.test$" ("Reply-To" message-make-reply-to)))

〜/ .gnus

(defun message-make-reply-to()
  (my-script ".../reply-to.pl" (message-fetch-field "Message-Id")))

(defun my-script(path &optional param) ....

問題:スクリプトはパラメーターとしてmessage-idを受け取りません(my-scriptは正しく明示的にパラメーターを設定します)

4

1 に答える 1

4
;; Make sure the Message-ID header is present in newly created messages
(setq message-generate-headers-first '(Message-ID))

;; Prevent emacs from resetting the Message-ID before the message is sent.
(setq message-deletable-headers
      (remove 'Message-ID message-deletable-headers))

(setq gnus-posting-styles
      '(("^pl\\.test$"
         ("Reply-To" '(message-make-reply-to)))))

の周りの追加の引用符と括弧に注意してくださいmessage-make-reply-to。これについての説明は、関数がシンボルとして指定されているか、引用符で囲まれたs式として指定されているかに応じて、異なる時間に実行されるということです。

  • シンボルとして指定された場合、ラムダ関数がに追加されたときに実行されmessage-setup-hookます。これは、で発生しますmessage-mode-hook。つまり、新しいバッファが作成されてに切り替えられた直後message-modeです。これの原因は、ラムダ関数の作成中の値のワイルドクォート/アンクォートです。
  • 引用符で囲まれたsexprとして指定された場合、評価は、バッファーが初期値で満たされるまで延期されます。これは、メッセージ設定で実行される最後のコードに近いものです。

代替ソリューション(なしgnus-posting-styles

すべての新しいメッセージに新しいヘッダーを追加する必要がある場合は、Reply-Toを使用してヘッダーを設定することもできますmessage-header-setup-hook。新しいメッセージごとにヘッダーを追加するには、カスタムフックを定義する必要があります。

(defun reply-to-message-header-setup-hook ()
  (let* ((msg-id (message-fetch-field "Message-ID"))
         (reply-to (my-script ".../reply-to-pl" msg-id)))
    (message-add-header (concat "Reply-To: " reply-to))))

;; Call the hook every time a new message is created
(add-hook 'message-header-setup-hook 'reply-to-message-header-setup-hook)

;; Make sure the Message-ID header is present in newly created messages
(setq message-generate-headers-first '(Message-ID))
于 2015-06-26T11:43:03.100 に答える