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

Uda*_*ddy 11 gmail email emacs smtp tls

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

它询问应该如何在 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 我使用 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)))
    
    Run Code Online (Sandbox Code Playgroud)

我使用的描述来自:http : //obfuscatedcode.wordpress.com/2007/04/26/configuring-emacs-for-gmails-smtp/

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

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

'Process SMTP exited abnormally with code 53'
Run Code Online (Sandbox Code Playgroud)

这并没有告诉我任何有用的东西。

Uda*_*ddy 13

看起来 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)
Run Code Online (Sandbox Code Playgroud)

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

machine smtp.gmail.com login ..... password ..... port 465
Run Code Online (Sandbox Code Playgroud)

这就是它的全部内容。


Ala*_*ann 4

以下是引发当前问题的建议。该建议由 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)))
Run Code Online (Sandbox Code Playgroud)

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

starttls option (-s)
Run Code Online (Sandbox Code Playgroud)

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

Bug #7789,在新闻组 gnu.emacs.bug 中讨论,报告了 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))
Run Code Online (Sandbox Code Playgroud)

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

这确保了当服务器响应插入“进程缓冲区”时不会发生编码转换。特别是,它确保来自服务器的 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的讨论涵盖了我的修复。该讨论的总标题是“更改‘发送邮件功能’的默认值”(于 2011 年 6 月 26 日开始)。此处讨论的更改(进行修复)已纳入 Emacs 24,但在 Emacs 23.3 或 23.4 中不存在。