Отправка почты из сценария оболочки linux


120

Я хочу отправить электронное письмо из сценария Linux Shell. Какая стандартная команда используется для этого и нужно ли мне устанавливать какие-либо специальные имена серверов?


8
Попробуйте спросить на Superuser [ superuser.com ] или, еще лучше, в Unix и Linux SE [ unix.stackexchange.com ].
Дэн Молдинг

Ответы:


119

Если сервер правильно настроен, например, у него есть работающий MTA, вы можете просто использовать команду mail.

Например, чтобы отправить содержимое файла, вы можете сделать это:

$ cat /path/to/file | mail -s "your subject" your@email.com

man mail Больше подробностей.


7
Что здесь означает «мта», есть ли здесь полное имя или ссылка? Как новичок, это то, что я хочу знать. Поскольку у меня нет опыта для этого.
Zen

5
@Zen MTA расшифровывается как агент доставки почты. postfix, sendmail, qmail и т. д.
Francesco Laurita

@Zen по большей части можно рассматривать как MTA как SMTP или IMAP сервер.
user151841

1
Если вы не знаете, как установить / настроить и используете Ubuntu: sudo apt-get install mailutilsи выберите Интернет-сайт: почта отправляется и принимается напрямую через SMTP. ,
user1717828

86

Если вам нужен чистый и простой подход в bash, и вы не хотите использовать cat, echoи т. Д., Самым простым способом будет:

mail -s "subject here" email@address.com <<< "message"

<<<используется для перенаправления стандартного ввода. Он долгое время был частью bash.


6
echo -e "Несколько строк и табуляция \ t msg" | mail -s "subject" your@email.com
Pipo

cat << END...END | mail -s "subject" test@example.com
ulidtko

Эй, у меня отлично сработало, спасибо! Как мне указать несколько адресов для доставки?
E.Owen 06

1
@ E.Owen. Вы можете использовать опцию -t для отправки на несколько адресов, разделенных пробелами,
Джон

25

Если запущены и exim, и ssmtp, у вас могут возникнуть проблемы. Поэтому, если вы просто хотите запустить простой MTA, просто чтобы иметь простой SMTP-клиент для отправки уведомлений по электронной почте с просьбой о настойчивости, вы должны сначала очистить предварительно установленный MTA, например exim или postfix, и переустановить ssmtp.

Тогда это довольно просто, настраивая только 2 файла (revaliases и ssmtp.conf) - см. Ssmtp doc -, и использование в вашем сценарии bash или bourne похоже:

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

Очевидно, не забудьте открыть выход вашего брандмауэра на порт smtp (25).


Где я могу изменить номер порта в этом скрипте? На моем сервере порт smtp работает через 8181.
Manix 01

Я бы не стал этого делать в этой оболочке, иначе вы рано или поздно застрянете. Вы можете сделать это в файле конфигурации: см. Unix.stackexchange.com/a/132731
hornetbzz

1
Почему вводятся символы новой строки, если я делаю простое эхо $ MAIL_TXT?
KernelPanic

1
@Marko: Пожалуйста, посмотрите man echo с опцией -e: включить интерпретацию
escape-символов с

Извините, я
пропустил

10

Другой вариант для сценария bash:

mailbody="Testmail via bash script"
echo "From: info@myserver.test" > /tmp/mailtest
echo "To: john@mywebsite.test" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • Файл /tmp/mailtestперезаписывается каждый раз при использовании этого сценария.
  • Расположение sendmail может отличаться в зависимости от системы.
  • При использовании этого в сценарии cron вы должны использовать абсолютный путь для команды sendmail.

1
проголосовано против, поскольку сценарий может вызывать одновременно несколько процессов. Это может привести к повреждению / неправильному файлу tmp. Кроме того, файл / tmp не перезаписывается каждый раз, когда он используется - он фактически увеличивается с каждым электронным письмом, содержащим все предыдущие электронные письма внутри. Не хорошо.
Taterhead

1
Первая запись в / tmp / mailtest - это перезапись, поэтому она удалит все, что было там ранее. Тем не менее, этот метод не идеален по другим причинам, которые вы описали.
Саймон

8

Как правило, вы хотите использовать mailкоманду для отправки своего сообщения с помощью локального MTA (который либо доставит его с помощью SMTP в пункт назначения, либо просто пересылает его на какой-нибудь более мощный SMTP-сервер, например, у вашего интернет-провайдера). Если у вас нет локального MTA (хотя для UNIX-подобных систем его пропускать немного необычно), вы можете использовать какой-нибудь минималистичный MTA, например ssmtp .

ssmtpдовольно легко настроить. По сути, вам просто нужно указать, где находится SMTP-сервер вашего провайдера:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Другой вариант заключается в использовании одного из мириадов сценариев , которые просто подключиться к SMTP - серверу напрямую и попытаться отправить сообщение там, например, SMTP-AUTH-Email-Script , SMTP-кли , SendEmail и т.д.


«ssmtp» был установлен на машине, поэтому мне не удалось его попробовать, но все равно спасибо
appshare.co 01

5

Признав, что вы хотите использовать какой-то smtp-сервер, вы можете:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Измените somehost, someportи someaccount@somedomainна фактические значения, которые вы бы использовали. В этом примере не выполняется ни шифрование, ни аутентификация.


А что делать, если mailxне устанавливается?
nalply

2

Это mailделает команда (кто бы мог подумать ;-). Откройте оболочку и введите, man mailчтобы получить страницу руководства для mailкоманды со всеми доступными параметрами.


2
Я сделал это, но нет возможности указать сервер для использования
appshare.co 01

1
Это часть конфигурации вашего локального агента передачи почты, например, Sendmail или Postfix.
DarkDust 01

2

Вам даже не нужен MTA. Протокол SMTP достаточно прост, чтобы напрямую записать его на ваш SMTP-сервер. Вы даже можете общаться через SSL / TLS, если у вас установлен пакет OpenSSL. Проверьте это сообщение: https://33hops.com/send-email-from-bash-shell.html

Выше приведен пример того, как отправлять текстовые / html-сообщения электронной почты, которые будут работать сразу после установки. Если вы хотите добавить вложения, все может стать немного сложнее, вам нужно будет кодировать двоичные файлы base64 и вставлять их между границами. Это хорошее место для начала расследования: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

В Linux для отправки вложения можно использовать почтовую утилиту с опцией «-a». Просмотрите страницы руководства, чтобы прочитать об этой опции. Например, следующий код отправит вложение:

mail -s "ЭТО ТЕМА" -a attachment.txt name@domain.com <<< "Привет, дружище, пожалуйста, найдите отчеты об ошибках."


Добро пожаловать в SO. Спасибо за ответ. Пожалуйста, прочтите информацию о том, как написать хороший ответ, и внесите соответствующие изменения. Наслаждайтесь ТАК ;-)
ZF007

2

ОТПРАВИТЬ ПОЧТУ ИЗ LINUX В GMAIL

ИСПОЛЬЗОВАНИЕ POSTFIX

1: установить программное обеспечение

Debian и Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Fedora:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

в конфигурации выберите поддержку SASL

make install clean

pkg install mailx

2. Настройте Gmail.

/ И т.д. / постфикса. Создайте или отредактируйте файл паролей:

vim /etc/postfix/sasl_passwd

Я использую vim, вы можете использовать любой редактор файлов, например, nano, cat ...

> Ubuntu, Fedora, CentOS, Debian, OpenSUSE, Arch Linux:

Добавь это

где пользователь заменяет ваше имя почты, а пароль - ваш пароль Gmail

[smtp.gmail.com]:587    user@gmail.com:password

Сохраните и закройте файл и сделайте его доступным только для root: потому что это конфиденциальный контент, который содержит ваш пароль

chmod 600 /usr/local/etc/postfix/sasl_passwd

> FreeBSD:

каталог / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Добавьте строку:

[smtp.gmail.com]:587    user@gmail.com:password

Сохраните и сделайте доступным только root:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Конфигурация Postfix

файл конфигурации main.cf

6 параметров, которые мы должны установить в Postfix

Ubuntu, Arch Linux, Debian:

редактировать

 vim /etc/postfix/main.cf

измените следующие значения:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options, который в конфигурации будет пустым , чтобы гарантировать, что не используются несовместимые с Gmail параметры безопасности .

сохранить и закрыть

как и для

OpenSUSE:

vim /etc/postfix/main.cf

Modify

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

также требуется настройка файла master.cf

изменить:

vim /etc/postfix/master.cf

как раскомментируя эту строку (удалите #)

#tlsmgr unix - - n 1000? 1 tlsmg

сохранить и закрыть

Fedora, CentOS:

vim /etc/postfix/main.cf

Modify

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

изменить:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

сохраните и закройте это

4. Обработать файл паролей:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

postmap /etc/postfix/sasl_passwd

для freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Перезапустить постфикс

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux, Debian:

systemctl restart postfix.service

для FreeBSD:

service postfix onestart
nano /etc/rc.conf

Добавить

postfix_enable=YES

сохранить, затем запустить, чтобы начать

service postfix start

5. Включите "менее безопасные приложения" в Gmail, используя ссылку ниже.

https://support.google.com/accounts/answer/6010255

6. Отправьте тестовое электронное письмо.

mail -s "subject" recever@domain.com

нажмите Ввод

добавьте тело письма по вашему желанию, нажмите Enter, затем нажмите ctrl + d для правильного завершения

если он не работает, проверьте все шаги еще раз и проверьте, включено ли " менее безопасное приложение" в вашем Gmail

затем перезапустите постфикс, если вы измените что-либо в этом

для сценария оболочки создайте файл .sh и добавьте команду из 6 шагов в качестве требования

например только для образца

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' mailid@domainname.com << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

Сценарий отправляет электронное письмо, когда использование диска превышает процент, указанный параметром THRESHOLD (здесь 80%).


Разве имя этого ответа не должно быть «ОТПРАВИТЬ ПОЧТУ С LINUX НА Recever@domain.com ЧЕРЕЗ GMAIL»?
Кэмерон Хадсон,

1

вы можете использовать команду «email» или «emailx».

(1) $ vim /etc/mail.rc # или # vim /etc/nail.rc

set from = xxx@xxx.com #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = xxx@xxx.com #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Потому что, если оно не будет отправлено с авторизованной учетной записи, электронное письмо попадет в список нежелательной почты.

(2) $ echo "Пожалуйста, не забудьте удалить неиспользуемые темы!" | mail -s "ненужные темы" -a a.txt developer@xxx.com # отправить пользователю группы 'developer@xxxx.com'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.