Emacs 中发邮件 通过 Gmail SMTP 无法发出去的问题

局部代理试试 with-proxy

感谢,测试了一下 use-proxywith-proxy 都能局部作用。我单独写了个函数,代码如下:

(defun smtpmail-send-email-with-proxy ()
  (use-proxy-with-specified-proxies
   '(("http" . "localhost:8118")
     ("https" . "localhost:8118"))
   (smtpmail-send-it))

  ;; or
  ;; (with-proxy-url
  ;;  :http-server "127.0.0.1:8118"
  ;;  :https-server "127.0.0.1:8118"
  ;;  (smtpmail-send-it))
  )

(setq send-mail-function 'smtpmail-send-email-with-proxy)

之前想的局部方案是用advice

(defun smtpmail-proxy-wrap (orig-func &rest args)
  "Set url.el proxy with `url-proxy-services' in local scope for smtpmail."
  (let ((url-proxy-services '(("no_proxy" . "^\\(localhost\\|192.168.*\\|10.*\\)")
                              ("http"  . "127.0.0.1:8118")
                              ("https" . "127.0.0.1:8118"))))
    (apply orig-func args)))

(advice-add 'smtpmail-send-it :around #'smtpmail-proxy-wrap)

但是不行,奇怪这个按道理应该是可以的。

不可能吧,是不是你看错了?SMTP smtpmail.el 怎么可能会用到 HTTP url.el 呢?url-proxy-services 只能影响用 url.el 发起的 HTTP(S) 请求。

是的,用到的不是url而是 open-network-stream ,但是设置 url-proxy-services 后竟然也能用。不知道为啥。

但是 url-proxy-services 也不太可能会影响 open-network-stream,你确定不设置 url-proxy-services 就发不了邮件?

我和你的区别只在于proxy_host和proxy_port这两项直接写在了gmail的password的下两行,而不是像你那样写在最后,不知道有没有区别

恩,又确认测试了好几次,真的发不了。那一次估计是动了其他地方,莫名其妙发出去了,以为好了。看代码我也觉得不应该发出去的。白高兴了。