Enviando um email a partir de um script shell linux

120

Quero enviar um email de um script do Shell do Linux. Qual é o comando padrão para fazer isso e preciso configurar nomes de servidores especiais?

appshare.co
fonte
8
Tente perguntar no Superusuário [ superuser.com ] ou, melhor ainda, no Unix e Linux SE [ unix.stackexchange.com ].
Dan Molding
3
Possível duplicata do script
Ciro Santilli

Respostas:

119

Se o servidor estiver bem configurado, por exemplo, com um MTA instalado e em execução, você pode apenas usar o comando mail.

Por exemplo, para enviar o conteúdo de um arquivo, você pode fazer o seguinte:

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

man mail para mais detalhes.

Francesco Laurita
fonte
7
O que significa 'mta' aqui, existe um nome completo ou um link? Como iniciante, é isso que eu quero saber. Como eu tenho falta de experiência para fazer isso.
Zen
5
@Zen MTA significa agente de transporte de correio. postfix, sendmail, qmail, etc #
Francesco Laurita 24/10
@ Zen, na maioria das vezes, você pode considerar MTA como servidor SMTP ou IMAP.
user151841
1
Se você não tem certeza de como instalar / configurar e está no Ubuntu: sudo apt-get install mailutilse selecione o site da Internet: o correio é enviado e recebido diretamente usando SMTP. .
user1717828
86

Se você quer uma abordagem limpa e simples no bash, e você não quiser usar cat, echoetc., a maneira mais simples seria:

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

<<<é usado para redirecionar a entrada padrão. Faz parte do bash há muito tempo.

Peter O.
fonte
6
echo -e "Alguns \ nMultiline e tab \ t msg" | mail -s "subject" [email protected]
Pipo
cat << END...END | mail -s "subject" [email protected]
ulidtko
Ei, isso funcionou muito bem para mim, obrigado! Como especificaria vários endereços para entrega?
E.Owen
1
@ E.Owen Você pode usar a opção -t para enviar para vários endereços separados por espaços
Jon
25

Se o exim e o ssmtp estiverem em execução, você poderá entrar em problemas. Portanto, se você deseja executar um MTA simples, apenas para que um cliente smtp simples envie notificações por e-mail por insistência, limpe o MTA eventualmente pré-instalado como exim ou postfix primeiro e reinstale o ssmtp.

Então é bastante simples, configurando apenas 2 arquivos (revaliases e ssmtp.conf) - consulte ssmtp doc -, e o uso em seu script bash ou bourne é como:

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

Obviamente, não esqueça de abrir a saída do firewall para a porta smtp (25).

hornetbzz
fonte
Onde posso alterar o número da porta neste script? Na minha porta do servidor SMTP funciona através de 8181.
manix
Eu não faria isso neste shell, caso contrário você será preso mais cedo ou mais tarde. Você pode fazê-lo no arquivo de configuração: Veja unix.stackexchange.com/a/132731
hornetbzz
1
Por que as novas linhas estão sendo introduzidas se eu fizer eco simples $ MAIL_TXT?
kernel panic
1
@Marko: Pls ver o homem eco com a opção -e: permitir a interpretação de fugas barra invertida
hornetbzz
Desculpe, fiz mal o parâmetro -e
KernelPanic
10

Outra opção para um script bash:

mailbody="Testmail via bash script"
echo "From: [email protected]" > /tmp/mailtest
echo "To: [email protected]" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • O arquivo /tmp/mailtesté substituído sempre que esse script é usado.
  • A localização do sendmail pode variar de acordo com o sistema.
  • Ao usar isso em um script cron, você deve usar o caminho absoluto para o comando sendmail.
SPRBRN
fonte
1
recusou porque mais de um processo poderia chamar o script ao mesmo tempo. Isso pode causar arquivo tmp corrompido / incorreto. Além disso, o arquivo / tmp não é sobrescrito toda vez que é usado - ele realmente cresce a cada email contendo todos os emails anteriores. Não é bom.
Taterhead
1
A primeira gravação em / tmp / mailtest é uma substituição, para remover o que estava lá anteriormente. Ainda assim, esse método não é ideal pelos outros motivos que você descreveu.
Simon
8

Geralmente, você deseja usar o mailcomando para enviar sua mensagem usando o MTA local (que a entrega usando SMTP para o destino ou apenas a encaminha para um servidor SMTP mais poderoso, por exemplo, no seu ISP). Se você não possui um MTA local (embora seja um pouco incomum um sistema semelhante ao UNIX omitir um), você pode usar algum MTA minimalista como ssmtp .

ssmtpé bastante fácil de configurar. Basicamente, você só precisa especificar onde está o servidor SMTP do seu provedor:

# 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

Outra opção é usar um dos inúmeros scripts que apenas se conectam diretamente ao servidor SMTP e tentar postar uma mensagem lá, como Smtp-Auth-Email-Script , smtp-cli , SendEmail etc.

GreyCat
fonte
"ssmtp" foi instalado na máquina para que eu era incapaz de experimentar, mas obrigado de qualquer maneira
appshare.co
5

Admitindo que você deseja usar algum servidor smtp, você pode:

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

Mudança somehost, someporte someaccount@somedomainpara valores reais que você usaria. Nenhuma criptografia e autenticação são executadas neste exemplo.

Germano
fonte
E o que fazer se mailxnão estiver instalado?
nalply
2

O mailcomando faz isso (quem teria adivinhado ;-). Abra seu shell e digite man mailpara obter a página de manual do mailcomando para todas as opções disponíveis.

DarkDust
fonte
2
Eu fiz isso, mas não há nenhuma opção para especificar um servidor para uso
appshare.co
1
Isso faz parte da configuração do seu agente local de transferência de mensagens, por exemplo, Sendmail ou Postfix.
DarkDust
2

Você nem precisa de um MTA. O protocolo SMTP é simples o suficiente para gravá-lo diretamente no servidor SMTP. Você pode até se comunicar via SSL / TLS se tiver o pacote OpenSSL instalado. Verifique esta publicação: https://33hops.com/send-email-from-bash-shell.html

O exemplo acima é um exemplo de como enviar e-mails de texto / html que funcionarão imediatamente. Se você deseja adicionar anexos, a coisa pode ficar um pouco mais complicada, você precisará codificar base64 os arquivos binários e incorporá-los entre os limites. Este é um bom lugar para começar a investigar: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP

Daniel J.
fonte
2

No linux, o utilitário de correio pode ser usado para enviar anexos com a opção "-a". Acesse as páginas do manual para ler sobre a opção. Por exemplo, o seguinte código enviará um anexo:

mail -s "ISSO ESTÁ SUJEITO" - um anexo.txt nome@domínio.com <<< "Olá amigo, encontre relatórios de falha."

krish___na
fonte
Bem-vindo ao SO. Obrigado por postar uma resposta. Leia as informações sobre como escrever uma boa resposta e modificá-la de acordo. Desfrute SO ;-)
ZF007
2

ENVIAR CORREIO DE LINUX PARA GMAIL

USANDO O POSTFIX

1: instalar software

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

na configuração, selecione suporte SASL

make install clean

pkg install mailx

2. Configure o Gmail

/ etc / postfix. Crie ou edite o arquivo de senha:

vim /etc/postfix/sasl_passwd

estou usando o vim u pode usar qualquer editor de arquivos como nano, cat .....

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

Adicione isso

onde o usuário substitui pelo seu nome de email e senha é a sua senha do Gmail

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

Salve e feche o arquivo e torne-o acessível apenas pela raiz: por ser um conteúdo sensível que contém sua senha

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

> FreeBSD:

diretório / usr / local / etc / postfix.

vim /usr/local/etc/postfix/sasl_passwd

Adicione a linha:

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

Salve e torne acessível apenas pela raiz:

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

3. Configuração do Postfix

arquivo de configuração main.cf

6 parâmetros que devemos definir no Postfix

Ubuntu, Arch Linux, Debian:

editar

 vim /etc/postfix/main.cf

modifique os seguintes valores:

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 que na configuração serão definidas como vazias , para garantir que não haja opções de segurança incompatíveis com o Gmail seja usada.

salvar e fechar

como para

OpenSUSE:

vim /etc/postfix/main.cf

modificar

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

também requer a configuração do arquivo master.cf

modificar:

vim /etc/postfix/master.cf

descomentando esta linha (remova #)

#tlsmgr unix - - n 1000? 1 tlsmg

salvar e fechar

Fedora, CentOS:

vim /etc/postfix/main.cf

modificar

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

modificar:

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

salve e feche isso

4. Processar arquivo de senha:

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

postmap /etc/postfix/sasl_passwd

para freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Reinicie o postfix

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

systemctl restart postfix.service

para o FreeBSD:

service postfix onestart
nano /etc/rc.conf

adicionar

postfix_enable=YES

salve e corra para começar

service postfix start

5. Ative "Aplicativos menos seguros" no Gmail usando a ajuda do link abaixo

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

6. Envie um email de teste

mail -s "subject" recever@domain.com

pressione Enter

adicione o corpo do e-mail conforme desejado, pressione enter e pressione ctrl + d para finalizar corretamente

se não funcionar, verifique todas as etapas novamente e verifique se você habilita " aplicativo menos seguro" no seu gmail

reinicie o postfix se você modificar algo

para shell script, crie o arquivo .sh e inclua o comando 6 step como seu requisito

por exemplo, apenas para uma amostra

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

O script envia um email quando o uso do disco ultrapassa a porcentagem especificada pela varialbe THRESHOLD (80% aqui).

chandan A
fonte
O nome desta resposta não deve ser "ENVIAR CORREIO DO LINUX PARA [email protected] VIA GMAIL"?
Cameron Hudson
1

você pode usar o comando 'email' ou 'emailx'.

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

Como se não for enviado de uma conta autorizada, o email chegará à lista de lixo eletrônico.

(2) $ echo "Lembre-se de remover tópicos não utilizados!" | mail -s "tópicos de desperdício" -a a.txt [email protected] #send ao usuário do grupo '[email protected]'

TINGTING WANG
fonte