smtp
Этот модуль реализует протокол SMTP-клиента, как определено в RFC 5321. Он может использоваться для отправки почты любому SMTP-серверу.
Этот модуль также реализует протокол, используемый для форматирования сообщений, как определено в RFC 2822.
Пример использования gmail:
var msg = createMessage("Hello from Nim's SMTP",
"Hello!.\n Is this awesome or what?",
@["foo@gmail.com"])
let smtpConn = newSmtp(useSsl = true, debug=true)
smtpConn.connect("smtp.gmail.com", Port 465)
smtpConn.auth("username", "password")
smtpConn.sendmail("username@gmail.com", @["foo@gmail.com"], $msg)
Пример для использования startTls:
var msg = createMessage("Hello from Nim's SMTP",
"Hello!.\n Is this awesome or what?",
@["foo@gmail.com"])
let smtpConn = newSmtp(debug=true)
smtpConn.connect("smtp.mailtrap.io", Port 2525)
smtpConn.startTls()
smtpConn.auth("username", "password")
smtpConn.sendmail("username@gmail.com", @["foo@gmail.com"], $msg)
Для поддержки SSL этот модуль полагается на OpenSSL. Если вы хотите включить SSL, компилируйте с -d:ssl.
Импорты
- net, strutils, strtabs, base64, os, strutils, asyncnet, asyncdispatch, parsecfg
Типы
Message = object msgTo: seq[string] msgCc: seq[string] msgSubject: string msgOtherHeaders: StringTableRef msgBody: string
- Исходный код Изменить
ReplyError = object of IOError
- Исходный код Изменить
Smtp = SmtpBase[Socket]
- Исходный код Изменить
AsyncSmtp = SmtpBase[AsyncSocket]
- Исходный код Изменить
Процедуры
proc debugSend(smtp: AsyncSmtp; cmd: string): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect].}-
Отправляет
cmdпо сокету, подключенному к SMTP-серверу.Если объект
smtpбыл создан с включеннымdebug, debugSend вызоветecho("C:" & cmd)перед отправкой.Это процедура более низкого уровня, и обычно ее вызывать не нужно при использовании этого модуля. Исключением является реализация расширений SMTP.
Исходный код Изменить proc debugSend(smtp: Smtp; cmd: string) {...}{.raises: [SslError, OSError], tags: [WriteIOEffect].}- Исходный код Изменить
proc debugRecv(smtp: AsyncSmtp): Future[TaintedString] {...}{. raises: [Exception, ValueError], tags: [RootEffect].}-
Получает строку данных из сокета, подключенного к SMTP-серверу.
Если объект
smtpбыл создан с включеннымdebug, debugRecv вызоветecho("S:" & result.string)после получения данных.Это процедура более низкого уровня, и обычно ее вызывать не нужно при использовании этого модуля. Исключением является реализация расширений SMTP.
См. checkReply(reply).
Исходный код Изменить proc debugRecv(smtp: Smtp): TaintedString {...}{. raises: [TimeoutError, OSError, SslError], tags: [ReadIOEffect, TimeEffect].}- Исходный код Изменить
proc createMessage(mSubject, mBody: string; mTo, mCc: seq[string]; otherHeaders: openArray[tuple[name, value: string]]): Message {...}{. raises: [], tags: [].}-
Создает новый MIME-совместимый сообщение.
Необходимо убедиться, что
Исходный код ИзменитьmSubject,mToиmCcне содержат символов новой строки. В противном случае будет возбуждено исключениеAssertionDefect. proc createMessage(mSubject, mBody: string; mTo, mCc: seq[string] = @[]): Message {...}{. raises: [], tags: [].}-
Альтернативная версия вышеперечисленного.
Необходимо убедиться, что
Исходный код ИзменитьmSubject,mToиmCcне содержат символов новой строки. В противном случае будет возбуждено исключениеAssertionDefect. proc `$`(msg: Message): string {...}{.raises: [], tags: [].}- stringify для
Message. Исходный код Изменить proc newSmtp(useSsl = false; debug = false; sslContext: SslContext = nil): Smtp {...}{. raises: [OSError, SslError, Exception, LibraryError, IOError], tags: [RootEffect, ReadDirEffect, ReadEnvEffect].}- Создает новый экземпляр
Smtp. Исходный код Изменить proc newAsyncSmtp(useSsl = false; debug = false; sslContext: SslContext = nil): AsyncSmtp {...}{. raises: [OSError, Exception, SslError, LibraryError, IOError], tags: [RootEffect, ReadDirEffect, ReadEnvEffect].}- Создает новый экземпляр
AsyncSmtp. Исходный код Изменить proc checkReply(smtp: AsyncSmtp; reply: string): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect].}-
Вызывает debugRecv и проверяет, что полученные данные начинаются с
reply. Если полученные данные не начинаются сreply, то на SMTP-сервер будет отправлена командаQUIT, и будет возбуждено исключениеReplyError.Это процедура более низкого уровня, и обычно ее вызывать не нужно при использовании этого модуля. Исключением является реализация расширений SMTP.
Исходный код Изменить proc checkReply(smtp: Smtp; reply: string) {...}{. raises: [TimeoutError, OSError, SslError, ReplyError], tags: [ReadIOEffect, TimeEffect, WriteIOEffect].}- Исходный код Изменить
proc helo(smtp: AsyncSmtp): owned(Future[void]) {...}{.raises: [Exception], tags: [RootEffect].}- Исходный код Изменить
proc helo(smtp: Smtp) {...}{.raises: [SslError, OSError, TimeoutError, ReplyError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect].}- Исходный код Изменить
proc connect(smtp: AsyncSmtp; address: string; port: Port): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect].}- Устанавливает соединение с SMTP-сервером. Может завершиться ошибкой ReplyError или ошибкой сокета. Исходный код Изменить
proc connect(smtp: Smtp; address: string; port: Port) {...}{. raises: [OSError, SslError, TimeoutError, ReplyError], tags: [ReadIOEffect, TimeEffect, WriteIOEffect].}- Исходный код Изменить
proc startTls(smtp: AsyncSmtp; sslContext: SslContext = nil): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect, ReadDirEffect, ReadEnvEffect].}- Переводит SMTP-соединение в режим TLS (Transport Layer Security). Может завершиться ошибкой ReplyError. Исходный код Изменить
proc startTls(smtp: Smtp; sslContext: SslContext = nil) {...}{.raises: [SslError, OSError, TimeoutError, ReplyError, Exception, LibraryError, IOError], tags: [ WriteIOEffect, ReadIOEffect, TimeEffect, RootEffect, ReadDirEffect, ReadEnvEffect].}- Исходный код Изменить
proc auth(smtp: AsyncSmtp; username, password: string): owned(Future[void]) {...}{. raises: [Exception], tags: [RootEffect].}- Отправляет команду AUTH на сервер, чтобы войти как
usernameс использованиемpassword. Может завершиться ошибкой ReplyError. Исходный код Изменить proc auth(smtp: Smtp; username, password: string) {...}{. raises: [SslError, OSError, TimeoutError, ReplyError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect].}- Исходный код Изменить
proc sendMail(smtp: AsyncSmtp; fromAddr: string; toAddrs: seq[string]; msg: string): owned(Future[void]) {...}{.raises: [Exception], tags: [RootEffect].}-
Отправляет
msgизfromAddrна адреса, указанные вtoAddrs. Сообщения могут быть сформированы с использованиемcreateMessage, преобразуя Message в строку.Необходимо убедиться, что
Исходный код ИзменитьfromAddrиtoAddrsне содержат символов новой строки. В противном случае будет возбуждено исключениеAssertionDefect. proc sendMail(smtp: Smtp; fromAddr: string; toAddrs: seq[string]; msg: string) {...}{. raises: [SslError, OSError, TimeoutError, ReplyError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect].}- Исходный код Изменить
proc close(smtp: AsyncSmtp): owned(Future[void]) {...}{.raises: [Exception], tags: [RootEffect].}- Отключается от SMTP-сервера и закрывает сокет. Исходный код Изменить
proc close(smtp: Smtp) {...}{.raises: [SslError, OSError, Exception, LibraryError], tags: [WriteIOEffect, RootEffect].}- Исходный код Изменить
Экспорт
- Порт
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/smtp.html