Linux kabuk komut dosyasından posta gönderme


120

Bir Linux Shell komut dosyasından bir e-posta göndermek istiyorum. Bunu yapmak için standart komut nedir ve herhangi bir özel sunucu adı belirlemem gerekir mi?


8
Superuser [ superuser.com ] veya daha iyisi Unix ve Linux SE [ unix.stackexchange.com ] üzerinden sormayı deneyin .
Dan Molding

Yanıtlar:


119

Sunucu iyi yapılandırılmışsa, örneğin çalışır durumda bir MTA'ya sahipse, sadece mail komutunu kullanabilirsiniz.

Örneğin, bir dosyanın içeriğini göndermek için şunu yapabilirsiniz:

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

man mail daha fazla ayrıntı için.


7
Burada 'mta' ne anlama geliyor, tam ad veya bağlantı var mı? Yeni başlayan biri olarak bilmek istediğim şey bu. Bunu yapmak için deneyimim olmadığı için.
Zen

5
@ Zen MTA, Posta taşıma aracısı anlamına gelir. postfix, sendmail, qmail vb.
Francesco Laurita

@Zen çoğunlukla, MTA'nın SMTP veya IMAP sunucusu anlamına geldiğini düşünebilirsiniz.
user151841

1
Nasıl yükleneceğinden / yapılandırılacağından emin değilseniz ve Ubuntu'daysanız: sudo apt-get install mailutilsve İnternet sitesini seçin : Posta doğrudan SMTP kullanılarak gönderilir ve alınır. .
user1717828

86

Eğer bash temiz ve basit bir uygulamasını isteyenler ve kullanmak istemiyorsanız cat, echovb basit şekilde olacaktır:

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

<<<standart girişi yeniden yönlendirmek için kullanılır. Uzun zamandır bash'ın bir parçası.


6
echo -e "Bazı \ nMultiline ve sekme \ t msg" | mail -s "konu" your@email.com
Pipo

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

Hey, bu benim için harika çalıştı, teşekkürler! Gönderilecek birden fazla adresi nasıl belirtebilirim?
E.Owen

1
@ E.Owen Boşluklarla ayrılmış birden çok adrese göndermek için -t seçeneğini kullanabilirsiniz
Jon

25

Hem exim hem de ssmtp çalışıyorsa, sıkıntılara girebilirsiniz. Bu nedenle, sadece basit bir MTA çalıştırmak istiyorsanız, sadece ısrar için e-posta bildirimleri gönderecek basit bir smtp istemcisine sahip olmak istiyorsanız, önce exim veya postfix gibi önceden yüklenmiş MTA'yı temizlemeli ve ssmtp'yi yeniden yüklemelisiniz.

O zaman oldukça basittir, yalnızca 2 dosyayı yapılandırmak (revaliases ve ssmtp.conf) - ssmtp belgesine bakın - ve bash veya bourne betiğinizdeki kullanım şuna benzer:

#!/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 $?  

Açıkçası güvenlik duvarı çıktınızı smtp portuna (25) açmayı unutmayın.


Bu komut dosyasında bağlantı noktası numarasını nereden değiştirebilirim? Sunucumda smtp portu 8181 üzerinde çalışıyor.
manix

Bunu bu kabukta yapmazdım, yoksa er ya da geç sıkışıp kalacaksınız. Bunu yapılandırma dosyasında yapabilirsiniz: Bkz. Unix.stackexchange.com/a/132731
hornetbzz

1
$ MAIL_TXT gibi basit bir yankı yaparsam neden yeni satırlar yazılıyor?
Kernel Panic

1
@Marko: Pls -e seçeneğiyle adam yankısını görün: ters eğik çizgi kaçışlarının yorumlanmasını etkinleştir
hornetbzz

Üzgünüm, -e parametresini yanlış mı
KernelPanic

10

Bir bash komut dosyası için başka bir seçenek:

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/mailtestBu komut dosyası her kullanıldığında dosyanın üzerine yazılır.
  • Sendmail'in yeri sisteme göre farklılık gösterebilir.
  • Bunu bir cron betiğinde kullanırken, sendmail komutu için mutlak yolu kullanmanız gerekir.

1
Aynı anda birden fazla işlem komut dosyasını çağırabileceğinden, olumsuz oy verildi. Bu, bozuk / yanlış tmp dosyasına neden olabilir. Ayrıca / tmp dosyası her kullanıldığında üzerine yazılmaz - aslında içindeki tüm önceki e-postaları içeren her e-posta ile büyür. İyi değil.
Taterhead

1
/ Tmp / mailtest'e ilk yazma bir üzerine yazmadır, bu nedenle daha önce orada olanları kaldıracaktır. Yine de bu yöntem, tarif ettiğiniz diğer nedenler için ideal değildir.
Simon

8

Genel olarak, mailmesajınızı yerel MTA kullanarak göndermek için komutu kullanmak istersiniz (bu, onu hedefe SMTP kullanarak teslim eder veya sadece daha güçlü bir SMTP sunucusuna, örneğin ISS'nize iletir). Yerel bir MTA'nız yoksa (UNIX benzeri bir sistemin bir tanesini atlaması biraz alışılmadık olsa da), ssmtp gibi minimalist bir MTA kullanabilirsiniz .

ssmtpyapılandırması oldukça kolaydır. Temel olarak, sağlayıcınızın SMTP sunucusunun nerede olduğunu belirtmeniz yeterlidir:

# 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

Diğer bir seçenek ise, doğrudan SMTP sunucusuna bağlanan ve orada Smtp-Auth-Email-Script , smtp-cli , SendEmail vb. Gibi bir mesaj göndermeye çalışan sayısız komut dosyasından birini kullanmaktır .


Makineye "ssmtp" yüklendi, bu yüzden deneyemedim ama yine de teşekkürler
appshare.co

5

Bir smtp sunucusu kullanmak istediğinizi kabul ederek şunları yapabilirsiniz:

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

Değişim somehost, someportve someaccount@somedomaingerçek değerlere Kullanmak söyledi. Bu örnekte şifreleme ve kimlik doğrulama yapılmamaktadır.


Ve mailxkurulu değilse ne yapmalı ?
nalply

2

mailKomutu (kim ;-) tahmin ederdi bunu yapmaz. Kabuğunuzu açın ve mevcut tüm seçenekler man mailiçin mailkomutun kılavuz sayfasını almak için girin .


2
Bunu yaptım ama kullanılacak bir sunucu belirtme seçeneği yok
appshare.co

1
Bu, yerel posta aktarım aracısı yapılandırmanızın bir parçasıdır, örneğin Sendmail veya Postfix.
DarkDust

2

Bir MTA'ya bile ihtiyacınız yok. SMTP protokolü, doğrudan SMTP sunucunuza yazacak kadar basittir. OpenSSL paketini yüklediyseniz, SSL / TLS üzerinden bile iletişim kurabilirsiniz. Bu gönderiyi kontrol edin: https://33hops.com/send-email-from-bash-shell.html

Yukarıdaki metin / html e-postalarının kutudan nasıl çıkarılacağına dair bir örnek. Ek eklemek istiyorsanız, bu şey biraz daha karmaşık hale gelebilir, ikili dosyaları base64 kodlamanız ve sınırlar arasına gömmeniz gerekir. Burası araştırmaya başlamak için iyi bir yerdir: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


2

Linux'ta, "-a" seçeneği ile e- posta programı eklenti göndermek için kullanılabilir. Seçenek hakkında bilgi almak için man sayfalarına gidin. Örneğin aşağıdaki kod bir ek gönderecektir:

mail -s "BU KONU" -a ek.txt name@domain.com <<< "Merhaba Dostum, Lütfen hata raporlarını bulun."


SO'ya hoş geldiniz. Cevap gönderdiğiniz için teşekkürler. Lütfen iyi bir cevabın nasıl yazılacağı ve buna göre nasıl değişiklik yapılacağı hakkındaki bilgileri okuyun . SO ;-)
ZF007

2

LINUX'TAN GMAIL'E MAIL GÖNDER

POSTFIX KULLANIMI

1: yazılımı yükleyin

Debian ve 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

yapılandırmada SASL desteğini seçin

make install clean

pkg install mailx

2. Gmail'i yapılandırın

/ Etc / sonek. Parola dosyasını oluşturun veya düzenleyin:

vim /etc/postfix/sasl_passwd

vim kullanıyorum u nano, cat gibi herhangi bir dosya düzenleyiciyi kullanabilirsiniz .....

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

bunu ekle

kullanıcı, posta adınız ve şifrenizle değiştirildiğinde , Gmail şifrenizdir

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

Dosyayı kaydedin ve kapatın ve sadece root tarafından erişilebilir hale getirin: şifrenizi içeren hassas bir içerik olduğundan dolayı

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

> FreeBSD:

dizin / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Satırı ekleyin:

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

Kaydedin ve yalnızca root tarafından erişilebilir hale getirin:

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

3. Sonek yapılandırması

yapılandırma dosyası main.cf

Postfix'te ayarlamamız gereken 6 parametre

Ubuntu, Arch Linux, Debian:

Düzenle

 vim /etc/postfix/main.cf

aşağıdaki değerleri değiştirin:

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 , yapılandırmada Gmail ile uyumlu olmayan güvenlik seçeneklerinin olmamasını sağlamak için boş olarak ayarlanacak kullanılmamasını .

kaydet ve kapat

olduğu gibi

OpenSUSE:

vim /etc/postfix/main.cf

Değiştirme

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

ayrıca master.cf dosyasının yapılandırılmasını gerektirir

değiştirin:

vim /etc/postfix/master.cf

bu satırın açıklamasını kaldırarak olduğu gibi (kaldır #)

#tlsmgr unix - - n 1000? 1 tlsmg

kaydet ve kapat

Fedora, CentOS:

vim /etc/postfix/main.cf

Değiştirme

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

değiştirin:

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

kaydet ve kapat bunu

4. Parola Dosyasını İşle:

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

postmap /etc/postfix/sasl_passwd

için FreeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Postfix'i yeniden başlatın

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

systemctl restart postfix.service

için FreeBSD:

service postfix onestart
nano /etc/rc.conf

Ekle

postfix_enable=YES

kaydet ve başlamak için çalıştır

service postfix start

5. Aşağıdaki bağlantı yardımıyla Gmail'de "Daha Az Güvenli Uygulamalar" ı etkinleştirin

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

6. Test E-postası Gönderin

mail -s "subject" recever@domain.com

Enter tuşuna basın

posta gövdesini dilediğiniz gibi ekleyin enter tuşuna basın ve ardından ctrl + d tuşlarına basın ve uygun sonlandırma için

çalışmıyor eğer tüm adımları kontrol tekrar kontrol u "etkinleştirirsem az güvenli bir uygulama" senin gmail içinde

sonra herhangi bir şeyi değiştirirseniz postfix'i yeniden başlatın

kabuk komut dosyası için .sh dosyasını oluşturun ve gereksiniminiz olarak 6 adımlı komut ekleyin

örneğin sadece bir örnek için

#!/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

Disk kullanımı THRESHOLD varialbe (burada% 80) tarafından belirtilen yüzdenin üzerine çıktığında komut dosyası bir e-posta gönderir.


Bu cevabın adı "LINUX'TAN recever@domain.com'A GMAIL ÜZERİNDEN MAIL GÖNDER" olması gerekmez mi?
Cameron Hudson

1

'email' veya 'emailx' komutunu kullanabilirsiniz.

(1) $ vim /etc/mail.rc # veya # 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

Çünkü yetkili bir hesaptan gönderilmezse, e-posta önemsiz posta listesine ulaşacaktır.

(2) $ echo "Lütfen kullanılmayan konuları kaldırmayı unutmayın!" | mail -s "atık konuları" -a a.txt developer@xxx.com # grup kullanıcısına gönder 'developer@xxxx.com'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.