如何配置 Emacs smtp 以使用安全服务器(gmail)

如何配置 Emacs smtp 以使用安全服务器(gmail)

这个问题最初是在https://answers.launchpad.net/vm/+question/108267于2010年4月26日。

它询问如何在 MS Windows 上配置 Emacs 邮件发送包,以便与需要 TLS 和 STARTTLS 的安全 SMTP 服务器(例如 gmail)一起使用。原始问题复制如下。


  • 我安装了 Cygwins gnutls。

  • 在.emacs中写道:

    (setq send-mail-function 'smtpmail-send-it
      message-send-mail-function 'smtpmail-send-it
      smtpmail-starttls-credentials
      '(("smtp.gmail.com" 587 nil nil))
      smtpmail-auth-credentials
      (expand-file-name "~/.authinfo")
      smtpmail-default-smtp-server "smtp.gmail.com"
      smtpmail-smtp-server "smtp.gmail.com"
      smtpmail-smtp-service 587
      smtpmail-debug-info t)
    
    (require 'starttls)
    (setq starttls-use-gnutls t)
    (setq smtpmail-debug-info t)
    (setq smtpmail-debug-verb t)
    (require 'smtpmail)
    
  • 我使用 gmail 凭证创建了“~/.authinfo”文件。

  • 我删除了starttls.elc,所以编译后的版本不会被emacs加载。

  • 我替换(signal-process (process-id process) 'SIGALRM)

    (call-process "g:\\www\\cygwin\\bin\\kill.exe" nil nil nil
              "-ALRM" (format "%d" (process-id process)))
    

我使用了以下描述: http://obfuscatedcode.wordpress.com/2007/04/26/configuring-emacs-for-gmails-smtp/

  • 当我尝试发送邮件时,迷你缓冲区显示:“发送失败 SMTP 错误”

在调试缓冲区中我收到一个错误:

'Process SMTP exited abnormally with code 53'

这并没有告诉我任何有用的信息。

答案1

以下是引出当前问题的建议。该建议由 Uday Reddy 发掘,可在以下网址找到:http://article.gmane.org/gmane.emacs.windows/3250。日期为 2006 年 8 月 7 日。

The problem boils down to the fact that the command

(signal-process (process-id process) 'SIGALRM)

does not work with Win32 Emacs, even with Cygwin also installed.  But one can mimic that with:

(call-process "c:\\cygwin\\bin\\kill.exe" nil nil nil
                                     "-ALRM" (format "%d" (process-id 
process)))

根据 gnutsl-cli 的文档(例如http://www.gnu.org/software/gnutls/manual/html_node/gnutls_002dcli-Invocation.html#gnutls_002dcli-Invocation):

starttls option (-s)

这是“连接,建立普通会话并启动 tls。”选项。当收到 EOF 或 SIGALRM 时,将启动 TLS 会话。

新闻组 gnu.emacs.bug 上讨论的 Bug #7789 报告了 MS Windows(又名 Woe32)中的这种信号缺陷。

我也按照建议进行了此项更改(在文件“starttls.el”中的函数“starttls-negotiate-gnutls”中),但仍然无法通过服务器 smtp.gmail.com:587 发送测试电子邮件。

我确定解决办法是更改文件“smtpmail.el”中函数“smtpmail-via-smtp”中的以下行:

(setq process (smtpmail-open-stream process-buffer host port))

(let ((coding-system-for-read 'raw-text-unix))
  (setq process (smtpmail-open-stream process-buffer host port)))

这确保在将服务器响应插入“进程缓冲区”时不会发生编码转换。特别是,它确保来自服务器的 220 问候末尾的 CRLF 字符对不会被更改。

通过这一额外的更改,我成功通过 smtp.gmail.com:587 发送了一封测试电子邮件。

我的 Emacs 版本信息是“GNU Emacs 23.3.1 (i386-mingw-nt5.1.2600) of 2011-03-10 on 3249CTO”。

后来我发现我的修复在以下讨论中有所涉及:http://comments.gmane.org/gmane.emacs.devel/140976。该讨论的标题是“更改‘send-mail-function’的默认值”(开始于 2011 年 6 月 26 日)。那里讨论的更改(即修复)已纳入 Emacs 24,但不存在于 Emacs 23.3 或 23.4 中。

答案2

看起来 Emacs 24(目前处于预发布阶段)已经做了一些改进,事情变得简单多了。首先,该smtpmail库现在可以执行普通 SSL。无需 STARTTLS。而且,gmail SMTP 在端口 465 上支持 SSL。

因此,需要进行以下设置:

(setq smtpmail-stream-type 'ssl)
(setq smtpmail-smtp-server "smtp.gmail.com")
(setq smtpmail-smtp-service 465)

身份验证凭据(登录名和密码)应放入文件 ~/.authinfo 或 ~/.authinfo.gpg 中。(它们不能再放入 Emacs 变量中。)在那里,您需要包含一行格式

machine smtp.gmail.com login ..... password ..... port 465

这就是全部内容了。

相关内容