【问题标题】:How to generate dynamic "Reply-To:" based on "Message-ID:"? [+detail]如何根据“Message-ID:”生成动态“Reply-To:”? [+详细]
【发布时间】:2013-02-24 23:25:35
【问题描述】:

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

user+detail@example.net

我已经成功地创建了一个标题,其中包含由我的外部脚本生成的内容。该脚本获取 usenet 组名称作为命令行参数。我也想将 message-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 得到正确的显式设置参数)

【问题讨论】:

  • 为什么不完全从 Emacs/Gnus 中处理任务?您说的是哪个消息 ID,是来自新回复的消息 ID,还是来自正在回复的消息的消息 ID?
  • @schaueho 1) 如果您告诉如何在 Emacs/Gnus 中处理它,那么我应该能够添加 perl 第 2 部分) 我想要新的新消息 ID(它是由我的 Emacs/Gnus 生成的自定义)
  • 你心中的过程对我来说仍然太不清楚,无法给出完整的答案,但我相信你必须在 Emacs Lisp 中编写一个小程序。因此有一些提示:使用(message-fetch-field "Message-Id") 可以从新回复中获取消息ID,可以使用message-goto-reply-to 生成回复字段,然后处理行内容或(message-replace-header "Reply-To" "my value")。跨度>
  • 它似乎不起作用。我使用以下代码执行脚本:defun my-script(path &optional param) ...。用于生成 X-Reply-To 的 lisp 函数中的 dollowing 未将 Message-Id: 传递给脚本 (my-script ".../script" (message-fetch-field "Message-Id"))
  • 您可能需要确保首先生成 Message-ID,这可能取决于各种变量。我也不知道您的自定义 lisp 函数何时启动。

标签: email emacs elisp emacs24 gnus


【解决方案1】:
;; 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 表达式给出。

  • 如果以符号形式给出,则在将 lambda 函数添​​加到 message-setup-hook 时运行。这发生在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))

【讨论】:

  • 经过一些修改后可以使用:(defun reply-to-message-header-setup-hook () (message-add-header (concat "Reply-To: " (my-script ".../reply-to-pl" (list (message-fetch-field "Message-ID"))))))。我希望它仅被 gnus-posting-styles 选择用于某些帖子/消息,但我接受的答案是最好的。
  • @AndrzejA.Filip 重新阅读各自的 gnus 代码后,我发现答案比我提出的要简单得多:(setq gnus-posting-styles ("^pl\\.test$" (Reply-To '(message-make-reply-to))))(注意额外的引号/括号)应该像只要message-generate-headers-first 的值设置如上。我将编辑答案以包含此内容。
  • 有一个问题:脚本获取消息撰写缓冲区中显示的 Message-Id 但是消息是使用另一个 Message-Id 发送的。
  • @AndrzejA.Filip 我们必须从 message-deletable-headers 中删除 Message-ID 以防止在发送消息时重置它:(setq message-deletable-headers (remove 'Message-ID message-deletable-headers))
  • @AndrzejA.Filip 太棒了!感谢您的耐心,与您一起调试很有趣。
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2013-04-22
相关资源
最近更新 更多