Hatred's Log Place

DON'T PANIC!

Mar 18, 2011 - 2 minute read - linux

Примитивный SMTP клиент

Про SMTP протокол знают все: текстовый, простой, можно почту отослать и при помощи telnet. Собственно, при помощи оного и сделан скрипт ниже.

smtpHost="Сервер"
smtpPort="25"
smtpLogin="Логин"
smtpPass="Пароль"
smtpConnectTime="3" # -- таймаут перед началом посылки команд
smtpDelay="1"       # -- таймаут между посылками команд


# Простой SMTP клиент для отправки почты через удалённый сервер
simpleMailClient()
{
   to="$1"
   local subject=""
   for subjectLine in `echo -n "$2" | /usr/bin/env base64`
   do
      if [ x"$subject" = x"" ]; then
         subject="=?UTF-8?B?$subjectLine?="
      else
         subject="$subject<br/>n =?UTF-8?B?$subjectLine?="
      fi
   done
   subject=`echo -e "$subject"`

   plainLoginString=`echo -e -n "dc<br/>0$smtpLogin<br/>0$smtpPass" | /usr/bin/env base64`

    (
      sleep $smtpConnectTime
      echo "EHLO localhost.localdomain"
      sleep $smtpDelay
      echo "AUTH PLAIN $plainLoginString"
      sleep $smtpDelay
      echo "MAIL FROM:<$smtpLogin>"
      sleep $smtpDelay
      echo "RCPT TO:<$to>"
      sleep $smtpDelay
      echo "DATA"
      sleep $smtpDelay
      echo "Date:" `LANG=C date -R`
      echo "From: $smtpLogin"
      echo "To: $to"
      echo "Subject: $subject"
      echo "MIME-Version: 1.0"
      echo "Content-Type: text/plain; charset=UTF-8"
      echo "Content-Transfer-Encoding: base64"
      echo
      cat | /usr/bin/env base64
      echo "."
      sleep $smtpDelay
    ) | telnet $smtpHost $smtpPort
}

По сути даже не скрипт, а только bash-функция. Пример использования:

echo "ТЕЛО ПИСЬМА В UTF-8" | simpleMailClient кому@куда "Тема письма в UTF-8"

Игра идёт в одни ворота, т.е. ответы от сервера не обрабатываются, что вынуждает подтачивать скрипт под каждый конкретный. Но, обычно это нужно когда не целесообразно настраивать локальный MTA и сделать можно быстро.

Для работы нужна утилита base64.