多年来一直使用Gnus作为新闻组和邮件程序,但是一直为Gnus的多账号情况下发送邮件问题所困扰,最近有想法换一个别的程序,可惜研究之后发现找不到一个能满足我需求的程序,因为我使用offlineimap进行本地和服务器端的同步(我的多数邮箱都支持IMAP),然后用nnmaildir后端管理。最后决定还是回到Gnus本身来寻找解决方法,因为毕竟唯一的问题就是多账号SMTP发送。
网络上有几种可选方案,其中被广泛采用的可能是 fs-change-smtp 这个函数,但是我使用并不成功。
我一直以来使用的是msmtp,但是为此需要配置复杂的posting styles,而我的工作邮件是按照公司名归档的,这样一个组里我所用的邮箱就不只是一个,这特别对回复邮件特别不方便,因为为了激活posting style需要在特定的组里回复才行。
昨晚经过几个小时的艰辛努力,终于写除了一个10来行代码(汗!),彻底解决了这个困扰已久的问题。自认为这是到目前为止最简单也是最灵活有效的解决办法。
设置MSMTP
MSMTP配置很简单,参考主站的文档即可。
注意事项
文档中的配置文件中,指定了一个 default account,通过 account default 或者 default account : defaultemail。我发现为了Gnus正常使用,不能指定default账号。(这一点有时间需要再研究一下)
建议
为了记忆的方便,建议account label直接使用email地址,也就是说:
文档中
account gmail
host …
…
我的建议是
account youraccount@gmail.com
host …
…
Gnus设置
在.gnus.el中加入以下代码:
[Code]
;; Choose account label to feed msmtp -a option based on From header in Message buffer;
;; This function must be added to message-send-mail-hook for on-the-fly change of From address
;; before sending message since message-send-mail-hook is processed right before sending message.
(defun cg-feed-msmtp ()
(if (message-mail-p)
(save-excursion
(let* ((from
(save-restriction
(message-narrow-to-headers)
(message-fetch-field “from”)))
(account
(cond
;; I use email address as account label in ~/.msmtprc
((string-match “myemail1@server1.com” from)“myemail1@server1.com”)
;; Add more string-match lines for your email accounts
((string-match “myemail2@server2.com” from)“myemail2@server2.com”))))
(setq message-sendmail-extra-arguments (list “-a” account))))))
(setq message-sendmail-envelope-from ‘header)
(add-hook ‘message-send-mail-hook ‘cg-feed-msmtp)
根据email账号增加相应的 ((string-match “myemail1@server1.com” from) “myemail1@server1.com”) 行,其中 myemail1@server1.com 等就是在 .msmtprc 中的对应的account label。
结束语
这个设置就是这么简单,但是完全避免了使用复杂的posting styles来配置。 以上代码关于获取 From header部分借自 fs-change-smtp。
Gnus+MSMTP实现多账号邮件发送
No TrackBacks
TrackBack URL: http://cyberhut.org/mt/mt-tb.cgi/27

Leave a comment