Можно ли отправлять почту скриптом bash через smtp? - PullRequest
8 голосов
/ 03 апреля 2012

У меня есть постфикс + dovecot.Я хочу сделать скрипт bash, который может использовать SMTP для этого.Я не хочу использовать sendmail.

Возможно ли это?Может быть, у кого-то есть примеры кода?

Ответы [ 7 ]

16 голосов
/ 04 апреля 2012

Мальчик, когда эта рукавица брошена, это всегда bash да прямо мне в голову! : -)

#!/bin/sh

function checkStatus {
  expect=250
  if [ $# -eq 3 ] ; then
    expect="${3}"
  fi
  if [ $1 -ne $expect ] ; then
    echo "Error: ${2}"
    exit
  fi
}

MyHost=`hostname`

read -p "Enter your mail host: " MailHost
MailPort=25

read -p "From: " FromAddr

read -p "To: " ToAddr

read -p "Subject: " Subject

read -p "Message: " Message

exec 3<>/dev/tcp/${MailHost}/${MailPort}

read -u 3 sts line
checkStatus "${sts}" "${line}" 220

echo "HELO ${MyHost}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "MAIL FROM: ${FromAddr}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "RCPT TO: ${ToAddr}" >&3

read -u 3 sts line
checkStatus "$sts" "$line"

echo "DATA" >&3

read -u 3 sts line
checkStatus "$sts" "$line" 354

echo "Subject: ${Subject}" >&3
echo "${Message}" >&3
echo "." >&3

read -u 3 sts line
checkStatus "$sts" "$line"
7 голосов
/ 04 апреля 2012

Протестировано с Gmail, и в настоящее время оно работает.

#!/bin/bash
# Use "host -t mx yourispdomain" to find out yourispmailserver
exec 1<>/dev/tcp/yourispmailserver/25
a=$(cat <<"MAILEND"
HELO local.domain.name
MAIL FROM: <me@local.domain.name>
RCPT TO: <you@local.domain.name>
DATA
From: me@local.domain.name
To: you@local.domain.name
Subject: test
send your orders for pizza to the administrator.
.
QUIT
.
MAILEND
)
IFS='
'
declare -a b=($a)
for x in "${b[@]}"
 do
   echo $x
   sleep 1
 done
5 голосов
/ 19 октября 2016

Только что нашли эту крошечную, но замечательную утилиту sendemail (не sendmail).Синтаксис слишком прост для объяснения.

Пример:

SERVER="smtp.company.com"
FROM="sender@company.com"
TO="recepient@company.com"
SUBJ="Some subject"
MESSAGE="Some message"
CHARSET="utf-8"

sendemail -f $FROM -t $TO -u $SUBJ -s $SERVER -m $MESSAGE -v -o message-charset=$CHARSET

Более подробная информация доступна через справку или на сайте автора: http://caspian.dotconf.net/menu/Software/SendEmail/.

2 голосов
/ 03 апреля 2012

Вы хотите bash напрямую общаться с SMTP-сервером? Это на самом деле не произойдет. технически может быть возможно с использованием поддержки сетевой связи, доступной в bash, но на самом деле вы не хотите идти по этому пути.

Это означает, что вам действительно нужно вызвать внешнюю программу, которая будет принимать за вас SMTP. Как правило, это будет sendmail, но если вы пытаетесь избежать этого, есть много других альтернатив, в том числе:

Оба из них могут обрабатывать связь с удаленным SMTP-сервером без использования sendmail.

1 голос
/ 22 августа 2016

Вы можете использовать SSMTP. Может быть, этот тоже помогает:

http://tecadmin.net/send-email-smtp-server-linux-command-line-ssmtp/

1 голос
/ 04 апреля 2012

Мне непонятно, когда вы говорите, что не хотите использовать sendmail.Может быть, вы не хотите использовать процесс sendmail.

Postfix имеет исполняемый файл под названием «sendmail», и, возможно, вы захотите его использовать, потому что я не могу понять, почему вы не должны.

#/bin/bash

FROM='from@test.com'
TO='to@test.com'
SUBJECT='This is a test message'

BODY="This is a test mail message body.
Hi there.
"

printf "From: <%s>\nTo: <%s>\nSubject: %s\n\n%s" "$FROM" "$TO" "$SUBJECT" "$BODY" | sendmail -f "$FROM"
0 голосов
/ 09 октября 2017
  • Установите sSMTP, например:

    apt-get install ssmtp

  • Настройте ssmtp:

    sudo nano /etc/ssmtp/ssmtp.conf

    · Сервер: mailhub=smtp.1und1.de:587

    · Имя хоста: hostname=subdomain.domain.com

    · Пользователь: AuthUser=user@domain.com

    · Пропуск: AuthPass=your_password

Затем в файле sh сделайте то, что вам нужно, и отправьте его по почте, например:

#!/bin/bash du -sh | mail -s "Disk usage report" user@domain.com

ИЛИ

#!/bin/bash echo "Today's DB backup is ok." | mail -s "DB daily backup alert" user@domain.com

...