如何基于"Message-ID:"生成动态"Reply-To:"?[+细节]

AnF*_*nFi 10 email emacs elisp gnus emacs24

如何根据创建的消息的 Message-ID在emacs/gnus中生成动态的"Reply-To:"(和"From:")标头?我想使用外部(perl)脚本+detail基于"Messaged-ID:"标头生成动态部分.

user+detail@example.net
Run Code Online (Sandbox Code Playgroud)

我已设法创建一个包含由我的外部脚本生成的内容的标头.该脚本将usenet组名称作为命令行参数.我也想传递message-id值.

我目前的代码
〜/ .emacs:

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

〜/ .gnus

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

(defun my-script(path &optional param) ....
Run Code Online (Sandbox Code Playgroud)

问题:脚本没有接收message-id作为其参数(my-script正确显式设置参数)

tar*_*leb 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)))))
Run Code Online (Sandbox Code Playgroud)

请注意 周围的附加引号和括号message-make-reply-to。对此的解释是,该函数在不同的时间运行,具体取决于它是作为符号还是作为带引号的 s 表达式给出。

  • 如果以符号形式给出,则在将 lambda 函数添​​加到 时运行message-setup-hook。这发生在 a 中message-mode-hook,即在新缓冲区创建并切换到 后message-mode。造成这种情况的原因是在创建 lambda 函数期间对值进行了一些疯狂的引用/取消引用。
  • 如果以带引号的 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))
Run Code Online (Sandbox Code Playgroud)