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


9

这是最初在2010-04-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)
  • 我用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'

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

Answers:


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)))

根据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(aka 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版本信息是“ 3249CTO上2011-03-10的GNU Emacs 23.3.1(i386-mingw-nt5.1.2600)”。

后来我发现http://comments.gmane.org/gmane.emacs.devel/140976上的讨论涵盖了我的修复程序。该讨论的总标题为“更改“发送邮件功能”的默认设置”(开始于11/6/26)。此处讨论的更改(进行了修复)将其纳入Emacs 24,但在Emacs 23.3或23.4中不存在。


在研究如何通过smtp.gmail.com从Emacs发送电子邮件时,另一个解决方案是使用Cygwin的“隧道”,就像VM使用它来连接到POP服务器一样。我修改了“ smtpmail.el”中的“ smtpmail-via-smtp”功能,使其以这种方式使用“ stunnel”,并成功通过“ smtp.gmail.com:465”发送了测试邮件。有关参考,请参阅[ stackoverflow.com/q/9694912/1264870](使用安全服务器(Gmail)从Emacs VM读取电子邮件[关闭])。
艾伦·韦曼

11

看起来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

这就是全部。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.