src/smtp
nimble install 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.
Типы
AsyncSmtp = SmtpBase[AsyncSocket]
Message = object
ReplyError = object of IOError
Smtp = SmtpBase[Socket]
Процедуры
proc `$`(msg: Message): string {....raises: [], tags: [], forbids: [].}- Преобразование в строку для
Message. proc auth(smtp: AsyncSmtp; username, password: string): owned(Future[void]) {. ...stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}- Отправляет команду AUTH на сервер для входа в систему как
usernameиспользуяpassword. Может завершиться ошибкой ReplyError. proc auth(smtp: Smtp; username, password: string) {. ...raises: [SslError, OSError, TimeoutError, ReplyError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect], forbids: [].}proc checkReply(smtp: AsyncSmtp; reply: string): owned(Future[void]) {. ...stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}-
Вызывает debugRecv и проверяет, что полученные данные начинаются с
reply. Если полученные данные не начинаются сreply, то на SMTP-сервер будет отправлена командаQUIT, и будет возбуждено исключениеReplyError.Это процедура низкого уровня и обычно не требует вызова при использовании данного модуля. Исключением является реализация расширений SMTP.
proc checkReply(smtp: Smtp; reply: string) {. ...raises: [TimeoutError, OSError, SslError, ReplyError], tags: [ReadIOEffect, TimeEffect, WriteIOEffect], forbids: [].}proc close(smtp: AsyncSmtp): owned(Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}- Отключается от SMTP-сервера и закрывает сокет.
proc close(smtp: Smtp) {....raises: [SslError, OSError, LibraryError, Exception], tags: [WriteIOEffect, RootEffect], forbids: [].}proc connect(smtp: AsyncSmtp; address: string; port: Port): owned( Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}- Устанавливает соединение с SMTP-сервером. Может завершиться ошибкой ReplyError или ошибкой сокета.
proc connect(smtp: Smtp; address: string; port: Port) {. ...raises: [OSError, SslError, TimeoutError, ReplyError], tags: [ReadIOEffect, RootEffect, TimeEffect, WriteIOEffect], forbids: [].}proc createMessage(mSubject, mBody: string; mTo, mCc: seq[string] = @[]): Message {. ...raises: [], tags: [], forbids: [].}-
Альтернативная версия выше.
Необходимо убедиться, что
mSubject,mToиmCcне содержат символов новой строки. В противном случае будет возбуждено исключениеAssertionDefect. proc createMessage(mSubject, mBody: string; mTo, mCc: seq[string]; otherHeaders: openArray[tuple[name, value: string]]): Message {. ...raises: [], tags: [], forbids: [].}-
Создает новое сообщение, совместимое с MIME.
Необходимо убедиться, что
mSubject,mToиmCcне содержат символов новой строки. В противном случае будет возбуждено исключениеAssertionDefect. proc debugRecv(smtp: AsyncSmtp): Future[string] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}-
Получает строку данных из сокета, подключенного к SMTP-серверу.
Если объект
smtpбыл создан с включённымdebug, debugRecv вызоветecho("S:" & result.string)после получения данных.Это процедура низкого уровня и обычно не требует вызова при использовании данного модуля. Исключением является реализация расширений SMTP.
См. checkReply(reply).
proc debugRecv(smtp: Smtp): string {....raises: [TimeoutError, OSError, SslError], tags: [ReadIOEffect, TimeEffect], forbids: [].}proc debugSend(smtp: AsyncSmtp; cmd: string): owned(Future[void]) {. ...stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}-
Отправляет
cmdпо сокету, подключенному к SMTP-серверу.Если объект
smtpбыл создан с включённымdebug, debugSend вызоветecho("C:" & cmd)перед отправкой.Это процедура низкого уровня и обычно не требует вызова при использовании данного модуля. Исключением является реализация расширений SMTP.
proc debugSend(smtp: Smtp; cmd: string) {....raises: [SslError, OSError], tags: [WriteIOEffect], forbids: [].}proc ehlo(smtp: AsyncSmtp): Future[bool] {....stackTrace: false, raises: [Exception, ValueError], tags: [RootEffect], forbids: [].}- Отправляет запрос EHLO.
proc ehlo(smtp: Smtp): bool {....raises: [SslError, OSError, TimeoutError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect], forbids: [].}proc helo(smtp: AsyncSmtp): owned(Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}proc helo(smtp: Smtp) {....raises: [SslError, OSError, TimeoutError, ReplyError], tags: [WriteIOEffect, ReadIOEffect, TimeEffect], forbids: [].}proc newAsyncSmtp(useSsl = false; debug = false; sslContext: SslContext = nil): AsyncSmtp {. ...raises: [OSError, SslError, LibraryError, Exception, IOError], tags: [RootEffect, ReadDirEffect, ReadEnvEffect, ReadIOEffect], forbids: [].}- Создаёт новый экземпляр
AsyncSmtp. proc newSmtp(useSsl = false; debug = false; sslContext: SslContext = nil): Smtp {. ...raises: [OSError, SslError, LibraryError, Exception, IOError], tags: [RootEffect, ReadDirEffect, ReadEnvEffect, ReadIOEffect], forbids: [].}- Создаёт новый экземпляр
Smtp. proc sendMail(smtp: AsyncSmtp; fromAddr: string; toAddrs: seq[string]; msg: string): owned(Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect], forbids: [].}-
Отправляет
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], forbids: [].}proc startTls(smtp: AsyncSmtp; sslContext: SslContext = nil): owned( Future[void]) {....stackTrace: false, raises: [Exception], tags: [RootEffect, ReadDirEffect, ReadEnvEffect, ReadIOEffect], forbids: [].}- Переводит 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], forbids: [].}
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/smtp.html