Надсилання пошти зі скрипту оболонки Linux


120

Я хочу надіслати електронний лист із сценарію оболонки Linux. Яка стандартна команда для цього і чи потрібно мені встановлювати якісь спеціальні імена сервера?


8
Спробуйте запитати у Superuser [ superuser.com ] або, ще краще, Unix та Linux SE [ unix.stackexchange.com ].
Дан Ліплення

Відповіді:


119

Якщо сервер добре налаштований, наприклад, він має запущений MTA, ви можете просто скористатися командою пошти.

Наприклад, щоб надіслати вміст файлу, ви можете зробити це:

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

man mail для отримання детальної інформації.


7
Що тут означає «mta», чи є повне ім’я чи посилання? Як початківець, це те, що я хочу знати. Тому що мені не вистачає досвіду для цього.
Дзен

5
@Zen MTA розшифровується як агент поштового транспорту. postfix, sendmail, qmail тощо
Francesco Laurita

@Zen здебільшого, ви можете вважати, що MTA означає SMTP або IMAP-сервер.
користувач151841

1
Якщо ви не знаєте, як встановити / налаштувати, і ви перебуваєте на Ubuntu: sudo apt-get install mailutilsі виберіть Інтернет-сайт: Пошта надсилається та приймається безпосередньо за допомогою SMTP. .
користувач1717828

86

Якщо ви хочете , чистий і простий підхід в БАШЕЄВ, і ви не хочете використовувати cat, echoі т.д., найпростіший спосіб буде:

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

<<<використовується для переадресації стандартного вводу. Це було давно частиною басу.


6
Відлуння -e "Деякі \ nMultiline і табуляція \ т ТЗД" | пошта -s "предмет" your@email.com
Pipo

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

Гей, це чудово працювало для мене, дякую! Як я можу вказати кілька адрес для доставки?
E.Owen

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

25

Якщо запущені і exim, і ssmtp, ви можете виникнути проблеми. Отже, якщо ви просто хочете запустити простий MTA, просто щоб простий клієнт smtp надсилав сповіщення електронною поштою на стійкість, вам слід очистити зрештою попередньо встановлений MTA, наприклад exim або postfix спочатку і перевстановити ssmtp.

Тоді це досить прямо вперед, конфігуруючи лише два файли (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

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

1
Чому нові рядки інгуруються, якщо я роблю простий ехо $ MAIL_TXT?
KernelPanic

1
@Marko: Pls бачити людину відлуння з -e варіант: включити інтерпретацію зворотної косої риски
hornetbzz

Вибачте,
помилився

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-cli , SendEmail тощо.


"ssmtp" встановлений на машині, тому я не зміг його спробувати, але все одно дякую
appshare.co

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

1
Це частина вашої локальної конфігурації агента передачі пошти, наприклад, Sendmail або Postfix.
DarkDust

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

/ etc / postfix. Створіть або відредагуйте файл пароля:

vim /etc/postfix/sasl_passwd

я за допомогою vim u може використовувати будь-який редактор файлів, як нано, кіт .....

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

додайте це

де користувач замінить своїм іменем пошти та паролем ваш пароль gmail

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

Збережіть і закрийте файл і зробіть його доступним лише під корінь: надайте його чутливий вміст, який містить пароль ур

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

Збережіть і зробіть це доступним лише під корінь:

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

модифікувати

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

модифікувати

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

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

якщо це не працює, перевірте всі кроки ще раз і перевірте, чи увімкніть " менш безпечний додаток" у вашій пошті

потім перезапустіть постфікс, якщо ви щось змінюєте в цьому

для скрипту оболонки створіть .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%).


Чи не повинно назва цієї відповіді бути "НАДІСЛИТИ ПОШУК З ЛІНЮКСУ на recever@domain.com VIA 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 "Не забудьте видалити невикористані теми ons!" | пошта -s "відходи теми" -a a.txt developer@xxx.com #send груповому користувачеві "developer@xxxx.com"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.