在 emacs 中发送邮件时出现“SMTP 协议错误”

在 emacs 中发送邮件时出现“SMTP 协议错误”

我正在尝试配置 emacs 通过 SMTP 服务器发送邮件,但到目前为止,我还没有成功。这是我得到的输出:

220 __SMTP.SERVER__ ESMTP Sendmail 8.14.4+UW11.03/8.14.4+UW13.09; Wed, 15 Jan 2014 13:16:39 -0800
250-__SMTP.SERVER__ Hello __LOCAL.DOMAIN__ [__IP.ADDRESS__], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE 60000000
250-DSN
250-AUTH GSSAPI
250-STARTTLS
250-DELIVERBY
250 HELP
250 2.0.0 Verbose mode
250 2.1.0 <__USER@DOMAIN__>... Sender ok
530 5.7.1 Relaying denied. Proper authentication required.
smtpmail-send-it: Sending failed; SMTP protocol error

相关的初始化文件设置如下:

(setq send-mail-function 'smtpmail-send-it)
(setq smtpmail-smtp-server "__SMTP.SERVER__")
(setq smtpmail-smtp-service 587)
(setq smtpmail-stream-type 'ssl)
(setq smtpmail-debug-info t)
(setq smtpmail-debug-verb t)

也存在.authinfo文件内容如下:

machine __SMTP.SERVER__ port 587 login __USER__ password *

对于我遗漏了什么或者做错了什么,您有什么想法吗?


编辑1

@techie007 我与服务器管理员进行了交谈,他告诉我服务器应该允许在身份验证后进行中继;现在我想知道我是否错误地设置了身份验证。我知道服务器使用 TLS 加密,并且我知道我已配置了smtpmail-stream-type 'ssl'tls但 emacs 文档让我相信'ssl适用于 SSL 和 TLS 连接(http://www.gnu.org/software/emacs/manual/html_mono/smtpmail.html#Encryption)这有错吗?

此外,SMTP 服务器确实可以与其他客户端协同工作;只是我在建立这个特定的连接时遇到了麻烦。


编辑2

重组初始化文件现内容如下:

 (setq message-send-mail-function 'smtpmail-send-it
      smtpmail-starttls-credentials '(("__SMPT.SERVER__" 587 nil nil))
      smtpmail-auth-credentials '(("__SMTP.SERVER" 587 "__USER__" nil))
      smtpmail-default-smtp-server "__SMTP_SERVER__"
      smtpmail-smtp-server "__SMTP.SERVER__"
      smtpmail-smtp-service 587
      smtpmail-local-domain "__LOCAL.DOMAIN__")

这就不再需要.authinfo文件。完整日志包括尝试发送邮件:

Loading 00debian-vars...done
Loading /etc/emacs/site-start.d/50autoconf.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)...done
Loading /etc/emacs/site-start.d/50psvn.el (source)...done
Loading /etc/emacs23/site-start.d/50vm-init.el (source)...done
For information about GNU Emacs and the GNU system, type C-h C-a.
goto-history-element: Beginning of history; no preceding item
Quit
Loading /home/__USER__/.xemacs/init.el (source)...done
Loading /home/__USER__/.xemacs/custom.el (source)...done
/usr/bin/mail is not an executable. Setting mail-interactive to t.
Adding vm-rfaddons-option `check-recipients'.
Adding vm-rfaddons-option `check-for-empty-subject'.
Adding vm-rfaddons-option `encode-headers'.
VM-RFADDONS: VM is now infected.
ispell.el is already loaded
Sending...
Added to /home/__USER__/vm-folders/SentMail
sendmail-send-it: Sending...failed with exit value 1

编辑3

我设法取得了一些进展!在首次启动 Emacs 时,我使用 启动 VM C-x m,如果我尝试发送消息,则会在第一个输出中遇到失败 - smtpmail-send-it: Sending failed; SMTP protocol error。但是,如果我C-x C-f ~/.emacs打开文件然后输入M-x eval-buffer,我就可以返回 VM 并完美地发送消息。.emacs配置如下:

(setq message-send-mail-function 'smtpmail-send-it
      send-mail-function 'smtpmail-send-it
      smtpmail-default-smtp-server "__SMTP.SERVER__"
      smtpmail-smtp-server "__SMTP.SERVER__"
      smtpmail-smtp-service 587
      smtpmail-stream-type 'ssl
      smtpmail-auth-credentials '(("__SMTP.SERVER__" 587 "__USER__" "__PASSWORD__"))
)

.emacs有人知道我怎样才能消除在每次 Emacs 会话开始时进行评估的需要吗?


最终编辑

成功了!为了结束,让我在这里发布我的最终工作配置。

(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/vm/")
(require 'vm-autoloads)
(load "/usr/local/share/emacs/site-lisp/vm/vm-reply")
(setq message-send-mail-function 'smtpmail-send-it
      send-mail-function 'smtpmail-send-it
      user-mail-address "__USER.MAIL.ADDRESS__"
      smtpmail-default-smtp-server "__SMTP.SERVER__" 
      smtpmail-smtp-server "__SMTP.SERVER__"
      smtpmail-smtp-service 587
      smtpmail-stream-type 'ssl
      smtpmail-smtp-user "__USER__"
      smtpmail-starttls-credentials '(("__SMTP.SERVER__" 587 "__USER__" nil)))
      starttls-use-gnutls t 
      starttls-gnutls-program "gnutls-cli"
      starttls-extra-arguments nil
)

放入'load-path'vm-autoloads似乎有助于解决几个“函数定义无效”错误,手动加载是vm-replyVM 8.2.0b 中发现的一个错误的解决方法,该错误由缺少自动加载组成;否则,它会导致无效的定义vm-select-recipient-from-sender。我也回到使用 .authinfo 文件进行身份验证,因为我意识到它与变量冲突smtpmail-auth-credentialssmtpmail-smtp-user与 .authinfo 一起使用,如净水器的建议。user-mail-address解决了我遇到的所有剩余的身份验证错误。

谢谢大家的帮助和建议!

答案1

设置smtpmail-smtp-usersmtpmail需要它在文件中查找凭证authinfo

答案2

问题顶部的 SMTP 输出有两点奇怪:

250-STARTTLS

STARTTLS尽管您已设置smtpmail-stream-type为,因此应该已经具有加密连接,但服务器仍建议ssl。我不确定如何检查是否是这种情况,如果不是,如何解决这个问题。

这里有一些术语混淆:SSL 和 TLS 是实际上基本上是同一件事。 SSL 版本 3.0 和 TLS 版本 1.0 是非常相似的协议,您很少需要关心它们之间的区别。 STARTTLS 是一种设置加密连接的方法:连接不是从一开始就加密,而是从不加密开始,服务器提供加密,客户端接受加密,然后他们协商加密连接。但是,出于某种原因,几乎所有邮件客户端都使用“SSL”来指代非 STARTTLS 加密连接(SSL 或 TLS),使用“TLS”来指代 STARTTLS 加密连接。 Emacs 不是这样,所以可能值得尝试设置smtpmail-stream-typestarttls

250-AUTH GSSAPI

服务器建议GSSAPI使用唯一的身份验证方法,但smtpmail仅支持PLAINLOGINCRAM-MD5。除非服务器在加密连接上建议使用其他身份验证方法,否则尝试通过此服务器从 Emacs 发送电子邮件似乎很不走运。

相关内容