A maneira mais simples de enviar uma linha de email via linha de comando usando o gmail?

29

Usando o Raspbian e o Ubunntu 16.04 LTS, precisamos de uma solução genérica do Linux.

O requisito é simples:

Eu preciso de uma maneira de enviar mensagens de e-mail de uma linha a partir da linha de comando.

Eu configurei uma conta do Gmail apenas para esse Rpi3 específico, com o endereço [email protected] - sem 2FA

Então, agora eu preciso ser capaz de enviar mensagens de uma linha de qualquer lugar (incluindo o cron) sem a intervenção do usuário.

Eu também gostaria que fosse capaz de enviar arquivos de texto; basicamente, qualquer coisa de stdin .

    
por SDsolar 09.05.2017 / 04:19

7 respostas

28

A resposta mais simples ao envio de mensagens de uma linha via gmail é usar o ssmtp

Instale-o com os seguintes comandos:

sudo apt-get update
sudo apt-get install ssmtp

Edite /etc/ssmtp/ssmtp.conf para ficar assim:

[email protected]
mailhub=smtp.gmail.com:465
FromLineOverride=YES
[email protected]
AuthPass=testing123
UseTLS=YES

Envie uma linha como esta:

echo "Testing...1...2...3" | ssmtp [email protected]

ou

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp [email protected]

Então, true para * nix, você acabou de receber o aviso de volta em alguns segundos.

Verifique sua conta [email protected] e voila, está lá!

Isso também funciona bem ao enviar um arquivo, desta forma:

cat program.py | ssmtp [email protected]

E o programa aparecerá na caixa de correio

Se o arquivo for um arquivo de texto, ele pode ter uma primeira linha que diz Subject: xxxxxx

Isso pode ser usado com vários cron jobs podem me enviar dados com linhas de assunto indicando o conteúdo.

Isso funcionará com qualquer coisa que prepare uma mensagem canalizada para o ssmtp via stdin.

Para mais detalhes, como proteger esses arquivos contra outros usuários, consulte este artigo:

Envie e-mail da linha de comando do Raspberry Pi

Certifique-se também de consultar abaixo a resposta postada por Rui sobre o bloqueio do endereço FROM: que pode ser alterado nos arquivos de mensagem formatados, se necessário.

Agora, se eu pudesse descobrir como enviar SMS da mesma maneira.

    
por 09.05.2017 / 04:19
8

Adicionando à resposta do OP:

Ao configurar ssmtp , você também pode proibir ou permitir que os usuários definam o De e também anule o domínio; você pode querer fazer isso por vários motivos, incluindo a mensagem não cair na pasta Spam.

Você pode adicionar a /etc/ssmtp/ssmtp.conf :

# Where will the mail seem to come from?
rewriteDomain=my_internet_domain.uk

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

Por favor, note que enquanto YES pode ser usado em uma casa framboesa, pode não ser aconselhável em um sistema multi-usuário do ponto de vista da segurança.

    
por 09.05.2017 / 04:34
8

ssmtp é apenas um dos muitos wrappers do Sendmail. Todos eles aceitam uma mensagem na entrada padrão e, opcionalmente, uma lista de endereços como argumentos da linha de comando, e todos eles oferecem um binário chamado sendmail , que implementa (pelo menos os recursos básicos da) API de linha de comando Sendmail tradicional. Mas propriamente falando, essa mensagem precisa ser uma mensagem RFC822 bem formada. No mínimo, ele deve ter um cabeçalho Subject: .

ssmtp [email protected] <<<$'Subject: testing 1...2...3'

(Com ssmtp , sendmail é apenas um link simbólico para ssmtp . Postfix, Exim e eu acreditamos que todos os outros MTAs que Provides: mail-transport-agent têm uma disposição semelhante, exceto, é claro, sendmail em que sendmail binário é "a coisa real".)

Mais comumente, você pode juntar uma simples mensagem de e-mail com um documento aqui.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: [email protected]

Here we interpolate the shell variable $result
____HERE

(A opção Sendmail -t diz para levar a lista de destinatários dos cabeçalhos da mensagem que você recebe na entrada padrão. O caminho preciso para o Sendmail será diferente entre as plataformas.)

Outra variação comum é combinar a saída de alguns comandos. Tome cuidado para ter uma linha vazia (um "pescoço") entre os cabeçalhos e o corpo da mensagem.

( printf "Subject: random number\n\n"
  dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -D -An ) |
sendmail

Para qualquer coisa além de mensagens de texto ASCII simples, você precisa entender como compor uma mensagem MIME adequada, em que geralmente faz mais sentido usar uma ferramenta como mutt . Algumas plataformas têm um mail ou mailx que sabe como enviar anexos e textos não ASCII, mas isso não é totalmente portátil.

O desafio aqui não é encontrar um cliente que possa receber uma mensagem de e-mail e tentar enviá-la, mas configurá-la para os detalhes do Gmail, o que exige que o MTA saiba o nome de usuário e a senha a serem usados pelo controle remoto servidor, a fim de ser capaz de usá-lo como o smarthost de saída.

Nos bastidores, a maioria dos clientes, como mutt , mailx etc, normalmente executa sendmail nos bastidores para tirar a mensagem do sistema.

    
por 09.05.2017 / 07:27
6

O que há de errado com "mail"?

echo "Hi there" | mail -s "Important mail" [email protected]

"mail" sendo / etc / link alternativo para / usr / bin / bsd-mailx do pacote bsd-mailx. Eu acredito que está lá por padrão. Ótimo utilitário para enviar e-mails de scripts cron, por exemplo.

Funciona no Ubuntu e no FreeBSD também.

    
por 09.05.2017 / 15:51
4

Eu sou muito parcial em usar mailx para isso:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<[email protected]>" -c [email protected] [email protected]
    
por 09.05.2017 / 12:18
2

Eu uso o sendEmail para enviar e-mails automatizados simples por meio do servidor SMTP de um provedor externo:

sendEmail -q -f "[email protected]" -u "mySubject" -t "[email protected]" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Eu passo tudo em uma linha, então fazer isso em uma linha de comando provavelmente mostrará todos os parâmetros (incluindo a senha smtp) para todos os usuários, se eles executarem um ps -ef enquanto eu estiver executando o comando. Eu uso em um script de shell.

    
por 09.05.2017 / 21:50
1

Meu servidor é CEntOS 7 e tem sendmail mas não mailx etc. Em vez de instalar um novo programa, testei usando o sendmail diretamente e descobri que isso funciona:

echo -e "From: you@whatever\nTo: [email protected]\nSubject: this is the subject\n\nThis is the body,\nwith multiple lines." | sendmail -t

Para mim, esta parece ser a maneira mais simples de enviar um e-mail curto, já que ele não requer a execução ou configuração de um servidor ou daemon, e pode ser feito em uma única linha de comando.

A ideia é que uma mensagem simplesmente me avise que determinado programa emitiu um erro, sem revelar informações potencialmente confidenciais, e então eu vou enviar o SSH ao servidor para inspecionar seus logs. Dessa forma, não há necessidade de se preocupar com complicações, como anexar arquivos ou criptografar o transporte.

Notas:

  • -e diz ao echo para interpretar '\ n' e outras fugas.
  • -t diz ao sendmail para obter os endereços dos destinatários de 'Para:' no cabeçalho da mensagem.
  • Se o e-mail não chegar, use tail /var/log/maillog para ver as mensagens de erro.
  • Se enviar para o seu endereço do Gmail, crie um filtro no gmail para mantê-los fora da pasta de lixo eletrônico.
  • Este sendmail é na verdade 'sendmail.postfix' (o que pode ser normal); há uma página man aqui
por 21.03.2018 / 08:33