![如何配置 Emacs smtp 以使用安全服务器(gmail)](https://linux22.com/image/1307944/%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AE%20Emacs%20smtp%20%E4%BB%A5%E4%BD%BF%E7%94%A8%E5%AE%89%E5%85%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88gmail%EF%BC%89.png)
这个问题最初是在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
这就是全部内容了。