やるきなし

2015/08/27 18:11 / Wanderlust SMTP Auth Fail

何かの拍子に Wanderlust でメールが送れなくなった.*Message* には

Invalid response: AUTH PLAIN <文字列>

とあって,送信している情報を受信情報と勘違いしているらしい.SMTP なので,Wanderlust というか FLIM でコケているわけだが,ということで該当箇所は smtp.el の中.

いろいろ試していると,たまに送れる場合もあって,どうやらサーバのレスポンスが若干悪いか,その付近の同期処理(そもそも実装されてる?)に問題があるらしい (それ以上は調べられず).

追記(2015/8/28)

これ,どうやら AUTH PLAIN を送る前にコケているような気がしてきた.サーバー側の問題なような気がするが,icedove 等を使うと送信できるので良くわからない.

Process SMTP connection broken by remote peer
EHLO smtp.example.org
250-mail1.example.org
250-PIPELINING
250-SIZE 52428800
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
421 4.7.0 mail1.example.org Error: too many errors
AUTH PLAIN <文字列>

追記(2015/8/28)

たまに送れるのは,smtp 側で load balancer が動いているらしく,smtp.example.org から mail1.example.org に送られる場合は OK で mail2.example.org の場合は NG という,なんとも感じ悪い状況.

追記(2015/8/28)

この手の STARTTLS を使った SMTP を手動で送るやり方を見つけたのでメモ.

% gnutls-cli --crlf --x509cafile /etc/ssl/certs/ca-certificates.crt --port 587 --starttls-proto=smtp smtp.example.org
Processed 180 CA certificate(s).
Resolving 'smtp.example.org'...
Connecting to 'XXX.XX.X.XXX:587'...
- Certificate type: X.509
- Got a certificate list of 2 certificates.
- Certificate[0] info:
略
- Certificate[1] info:
略
- Status: The certificate is trusted.
- Description: (TLS1.2)-(RSA)-(AES-128-GCM)
- Session ID: 略
- Version: TLS1.2
- Key Exchange: RSA
- Cipher: AES-128-GCM
- MAC: AEAD
- Compression: NULL
- Options: safe renegotiation,
- Handshake was completed

- Simple Client Mode:

EHLO smtp.example.org
250-mail1.example.org
250-PIPELINING
250-SIZE 52428800
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH PLAIN 略
235 2.7.0 Authentication successful
MAIL FROM:<myn@example.org>
250 2.1.0 Ok
RCPT TO:<myn@example.org>
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
To: myn@example.org
From: myn@example.org
Subject: test

test

--myn

.
250 2.0.0 Ok: queued as 略
quit
221 2.0.0 Bye
- Peer has closed the GnuTLS connection

追記(2015/8/28)

ちなみに AUTH PLAIN の後の文字列は以下のようにユーザ名とパスワードから作る.

echo -n '\0username\0password' | base64
AHVzZXJuYW1lAHBhc3N3b3Jk

デコードするには base64 -d に pipe で送ればいい.