[racket] (smtp-send-message ...) with #:tls-encode

From: Greg Hendershott (greghendershott at gmail.com)
Date: Tue Mar 8 21:02:53 EST 2011

If you're wanting to connect to Exchange Server as e.g. hosted by
Microsoft i.e. smtp.mail.microsoftonline.com, then it requires you to
connect on port 587 (not encrypted), then issue STARTTLS to switch to
encryption, then do AUTH LOGIN. (AUTH PLAIN won't work, ergo my mod of
net/smtp's smtp-send-message.)

With such modified smtp-send-message, you want to pass it:

587 for port-no
the default tcp-connect for #:tcp-connect
ports->ssl-ports for #:tls-encode
a valid user and pwd on that Exchange Server, for #:auth-user and #:auth-passwd.

This means connect to port 587 using normal tcp-connect unencrypted,
then use STARTTLS and ports->ssl-ports to switch over to TLS, then
authorize using the name and password.

This should work.

On Tue, Mar 8, 2011 at 3:20 AM, Stephen De Gabrielle
<spdegabrielle at gmail.com> wrote:
> Thanks Greg,
>
> I'll test your patch against the Exchange server I'm wanting to connect to.
> S.
>
> On Mon, Mar 7, 2011 at 9:20 PM, Greg Hendershott <greghendershott at gmail.com>
> wrote:
>>
>> > Does anyone have an example of using #:tls-encode (net/smtp)?
>>
>> No, in fact I'm seeing it fail today with an SMTP server that requires
>> TLS on port 587.
>>
>> The reason seems to be that the server is expecting AUTH LOGIN whereas
>> net/smtp only does AUTH PLAIN.
>>
>> I was able to get it to work (with this particular server) by making a
>> local copy of smtp-send-message from net/smtp-unit.rkt and modifying
>> lines 96-103:
>>
>>    (when auth-user
>>      (log "auth\n")
>>      (fprintf w "AUTH PLAIN ~a"
>>               ;; Encoding adds CRLF
>>               (base64-encode
>>                (string->bytes/latin-1
>>                 (format "~a\0~a\0~a" auth-user auth-user auth-passwd))))
>>      (check-reply r 235 w))
>>
>> to be this instead:
>>
>>    (when auth-user
>>      (if tls-encode
>>          (begin
>>            (log "auth login\n")
>>            (fprintf w "AUTH LOGIN\r\n")
>>            (check-reply r 334 w)
>>            (fprintf w "~a"             ;encoding adds CRLF
>>                     (base64-encode
>>                      (string->bytes/latin-1 auth-user)))
>>            (check-reply r 334 w)
>>            (fprintf w "~a"             ;encoding adds CRLF
>>                     (base64-encode
>>                      (string->bytes/latin-1 auth-passwd)))
>>            (check-reply r 235 w))
>>          (begin
>>            (log "auth plain\n")
>>            (fprintf w "AUTH PLAIN ~a" ;encoding adds CRLF
>>                     (base64-encode
>>                      (string->bytes/latin-1
>>                       (format "~a\0~a\0~a" auth-user auth-user
>> auth-passwd))))
>>            (check-reply r 235 w))))
>>
>> i.e. I tried to keep the AUTH PLAIN case while providing AUTH LOGIN on
>> the assumption it will always be wanted when doing TLS. I don't deeply
>> know the SMTP protocol. This is based on me observing one specific
>> server and guessing what would work. That said, I hope this may help.
>>
>>
>> On Fri, Feb 4, 2011 at 7:51 AM, Stephen De Gabrielle
>> <spdegabrielle at gmail.com> wrote:
>> > Hi,
>> >
>> > Does anyone have an example of using #:tls-encode (net/smtp)?
>> >
>> > Cheers,
>> >
>> > Stephen
>> >
>> > --
>> > Stephen De Gabrielle
>> > stephen.degabrielle at acm.org
>> > Telephone +44 (0)20 85670911
>> > Mobile        +44 (0)79 85189045
>> > http://www.degabrielle.name/stephen
>> >
>> > _________________________________________________
>> >  For list-related administrative tasks:
>> >  http://lists.racket-lang.org/listinfo/users
>
>
>
> --
>
> --
> Stephen De Gabrielle
> stephen.degabrielle at acm.org
> Telephone +44 (0)20 85670911
> Mobile        +44 (0)79 85189045
> http://www.degabrielle.name/stephen
>
>



Posted on the users mailing list.