Skip to content

Commit

Permalink
smtp: Fix STARTTLS, request HELO once TLS is established (#15032)
Browse files Browse the repository at this point in the history
  • Loading branch information
mildred committed Jul 22, 2020
1 parent 911e393 commit 503c5e0
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions lib/pure/smtp.nim
Expand Up @@ -60,6 +60,7 @@ type

SmtpBase[SocketType] = ref object
sock: SocketType
address: string
debug: bool

Smtp* = SmtpBase[Socket]
Expand Down Expand Up @@ -225,15 +226,19 @@ proc checkReply*(smtp: Smtp | AsyncSmtp, reply: string) {.multisync.} =
if not line.startswith(reply):
await quitExcpt(smtp, "Expected " & reply & " reply, got: " & line)

proc helo*(smtp: Smtp | AsyncSmtp) {.multisync.} =
# Sends the HELO request
await smtp.debugSend("HELO " & smtp.address & "\c\L")
await smtp.checkReply("250")

proc connect*(smtp: Smtp | AsyncSmtp,
address: string, port: Port) {.multisync.} =
## Establishes a connection with a SMTP server.
## May fail with ReplyError or with a socket error.
smtp.address = address
await smtp.sock.connect(address, port)

await smtp.checkReply("220")
await smtp.debugSend("HELO " & address & "\c\L")
await smtp.checkReply("250")
await smtp.helo()

proc startTls*(smtp: Smtp | AsyncSmtp, sslContext: SSLContext = nil) {.multisync.} =
## Put the SMTP connection in TLS (Transport Layer Security) mode.
Expand All @@ -245,6 +250,7 @@ proc startTls*(smtp: Smtp | AsyncSmtp, sslContext: SSLContext = nil) {.multisync
getSSLContext().wrapConnectedSocket(smtp.sock, handshakeAsClient)
else:
sslContext.wrapConnectedSocket(smtp.sock, handshakeAsClient)
await smtp.helo()
else:
{.error: "SMTP module compiled without SSL support".}

Expand Down

0 comments on commit 503c5e0

Please sign in to comment.