desenv-web-rp.com

A maneira mais simples de enviar e-mails de uma linha via linha de comando usando o gmail?

Usando o Raspbian e o Ubunntu 16.04 LTS, é necessário uma solução Linux genérica.

O requisito é simples:

Preciso de uma maneira de enviar mensagens de email de uma linha a partir da linha de comando.

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

Portanto, agora preciso enviar mensagens de email de uma linha de qualquer lugar (incluindo cron) sem intervenção do usuário.


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

34
SDsolar

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


Instale-o com os seguintes comandos:

Sudo apt-get update
Sudo apt-get install ssmtp

Editar /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, fiel ao * nix, você recebe o prompt de volta em alguns segundos.

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


Isso também funciona bem ao enviar um arquivo, da seguinte 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 trabalhos cron, pode me enviar dados com linhas de assunto indicando o conteúdo.


Isso funcionará com qualquer coisa que prepare uma mensagem que seja canalizada no ssmtp via stdin.


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

Enviar email da linha de comando do Raspberry Pi


Verifique também abaixo a resposta postada por Rui sobre como bloquear o FROM: endereço que pode ser alterado nos arquivos de mensagens formatados, se necessário.


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

36
SDsolar

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 de linha de comando, e todos oferecem um binário chamado sendmail que implementa (pelo menos os recursos básicos) a API de linha de comando tradicional do Sendmail. Mas, falando corretamente, essa mensagem precisa ser uma mensagem RFC822 bem formada. No mínimo, ele deve ter um Subject: cabeçalho.

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

(Com ssmtp, sendmail é apenas um link simbólico para ssmtp. Postfix, Exim e acredito em todos os outros MTA que Provides: mail-transport-agent tem um arranjo semelhante, exceto, é claro, sendmail, em que o binário sendmail é "a coisa real".)

Mais comumente, você pode reunir uma simples mensagem de email com um documento aqui.

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

Here we interpolate the Shell variable $result
____HERE

(O Sendmail -t opção diz para tirar a lista de destinatários dos cabeçalhos da mensagem que você recebe na entrada padrão. O caminho exato 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 [email protected]

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

O desafio aqui não é encontrar um cliente que possa receber uma mensagem de email e tentar enviá-la, é configurá-lo para as especificidades do Gmail, o que exige que o MTA saiba o nome de usuário e a senha a serem usados ​​no servidor remoto para para poder usá-lo como o smarthost de saída.

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

9
tripleee

Adicionando à própria resposta do OP:

Ao configurar ssmtp, você também pode proibir ou permitir que os usuários definam De e também substituir o domínio; convém fazer isso por vários motivos, incluindo a mensagem que não está 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

Observe que, embora o YES possa ser usado em uma framboesa doméstica, pode não ser aconselhável em um sistema multiusuário do ponto de vista da segurança.

8
Rui F Ribeiro

O que há de errado com "correio"?

eco "Olá" | mail -s "Correio importante" [email protected]

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

Funciona no Ubuntu e no FreeBSD também.

5
Edheldil

Eu sou realmente 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]
4
Christopher

Eu uso o sendEmail para enviar e-mails automatizados simples através 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"

Como passo tudo em uma linha, fazer isso em uma linha de comando provavelmente mostrará todos os parâmetros (incluindo a senha smtp) a todos os usuários, se eles executarem um ps -ef enquanto estou executando o comando. Eu o uso dentro de um script do Shell.

2
user684790

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

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

Para mim, essa parece ser a maneira mais simples de enviar um email curto, pois não requer a execução ou a configuração de um servidor ou daemon, e pode ser feita em uma única linha de comando.

A idéia é que uma mensagem simplesmente me avise que um determinado programa gerou um erro, sem revelar nenhuma informação potencialmente confidencial, e então enviarei um 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 eco para interpretar '\ n' e outras fugas.
  • -t diz ao sendmail para obter endereços de destinatários de 'Para:' no cabeçalho da mensagem.
  • Se o correio não chegar, use tail /var/log/maillogpara ver as mensagens de erro.
  • Se estiver enviando para o seu endereço do gmail, faça 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 de manual aqui
1
j77h