Maneira mais simples de enviar e-mail de uma linha via linha de comando usando o gmail?


32

Usando Raspbian e 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 rpi3abc@gmail.com - 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 stdin.


Deseja que sua mensagem venha deste endereço específico, rpi3abc@gmail.com ou se está certo que a mensagem venha de your_username @ localhost?
John Smith

Ele vem de rpi3abc@gmail.com, então eu sei que meu computador está se comunicando comigo. Eu o uso em trabalhos cron, principalmente.
SDSolar 10/09/2017

Respostas:


33

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

Edite /etc/ssmtp/ssmtp.confpara ficar assim:

root=rpi3abc@gmail.com
mailhub=smtp.gmail.com:465
FromLineOverride=YES
AuthUser=rpi3abc@gmail.com
AuthPass=testing123
UseTLS=YES

Envie uma linha como esta:

echo "Testing...1...2...3" | ssmtp myusername@gmail.com

ou

printf "Subject: Test\n\nTesting...1...2...3" | ssmtp myusername@gmail.com

Então, fiel ao * nix, você recebe o prompt de volta em alguns segundos.

Verifique sua conta myusername@gmail.com e pronto, ela está lá!


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

cat program.py | ssmtp myotherusername@yahoo.com

E o programa aparecerá na caixa de correio

Se o arquivo é 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 para o 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 Ruisobre o bloqueio do FROM:endereço que pode ser alterado nos arquivos de mensagens formatadas, se necessário.


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


11
Eu também uso ssmtpnas minhas VMs, muito leve. +1
Rui F Ribeiro

11
Por que não usar a API sendmail do Python e enviá-la diretamente então?
Rui F Ribeiro

Para levar isso um passo adiante, aqui estão instruções muito simples para a inclusão de um arquivo de imagem como um anexo: unix.stackexchange.com/questions/381131/...
SDsolar

Para responder à pergunta de Rui: sendmailsozinho, não há o MTA - Mail Transport Agent para se comunicar fora da máquina. Por padrão, como o Unixen é multiusuário por design, sendmailenviará mensagens para outros usuários na mesma caixa, mas não fora. ssmtpé o MTA que eu acho mais simples de configurar para o gmail.
SDsolar

11
gasto para sempre tentando configurar o postix, isso funcionou! uma observação para quem lê isso, o conf tem um erro de digitação, o parâmetro raiz deve ser gmail.com e não gmail.
Qodeninja 26/08/19

9

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 nomeado sendmailque 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 address@example.com <<<$'Subject: testing 1...2...3'

(With ssmtp, sendmailé apenas um link simbólico para ssmtp. Postfix, Exim, e acredito que todos os outros MTA que Provides: mail-transport-agenttenham um arranjo semelhante, exceto, é claro, sendmailonde o sendmailbinário é "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: recipient@example.net

Here we interpolate the shell variable $result
____HERE

(A -topção Sendmail diz para retirar 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 elsewhere@example.org

Para qualquer coisa além de mensagens ASCII muito simples, somente texto, você precisa entender como compor uma mensagem MIME adequada; nesse ponto, geralmente faz mais sentido usar uma ferramenta como essa mutt. Algumas plataformas possuem mailou mailxsabem 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 e-mail 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 gosta mutt, mailxetc. geralmente apenas rodam sendmailnos bastidores para transmitir a mensagem ao sistema.


Não tenho muita sorte em usar o sendmail diretamente; portanto, voltando-se para ssmtp. Voto a favor para sua resposta A propósito, para enviar imagens como anexos, achei a maneira mais simples possível. Eu nem preciso pensar no MIME. Eu apenas uso o mpack, conforme descrito aqui: unix.stackexchange.com/questions/381131/…
SDsolar

8

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.


Voto a favor. Excelente informação.
SDsolar

5

O que há de errado com "correio"?

eco "Olá" | mail -s "Correio importante" user@example.com

"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 a partir de scripts cron, por exemplo.

Funciona também no Ubuntu e no FreeBSD.


3
mailxé apenas um front end. Requer que algum MTA seja configurado para realmente tirar a mensagem do sistema local. Existem várias versões incompatíveis em uso comum, embora se sua plataforma de destino for apenas o Debian, você poderá confiar no comportamento BSD razoavelmente recente.
Tripleee

4

Eu sou realmente parcial em usar mailxisso:

echo "Message body." | mailx -s "Subject line" -a /path/attachment.txt -r "Sender's Name<sender@email.com>" -c recipient2@email.com recipient1@email.com

11
Várias das opções aqui não estarão disponíveis em muitos sistemas não-Debian / não-BSD. A -aopção em particular seria maravilhosa se fosse universalmente suportada, mas apenas navegue pelas mailxperguntas aqui para ver que esse certamente não é o caso.
Tripleee

2

Eu uso o sendEmail para enviar e-mails automatizados simples através do servidor SMTP de um provedor externo:

sendEmail -q -f "me@mail.com" -u "mySubject" -t "someone@mail.org" -s "my.smtp.com" -o tls=yes -xu "mySmtpUser" -xp "mySmtpPw" -m "myMessage"

Eu passo tudo em uma linha, portanto, 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 algum ps -eftempo enquanto eu estiver executando o comando. Eu o uso dentro de um script de shell.


11
Esta não é uma instalação padrão e há vários clientes com esse nome. Eu acho que você está se referindo a en.wikipedia.org/wiki/SendEmail . Está disponível como um pacote Debian?
Tripleee

Bom pensamento sobre o shell script, como em um sistema multiusuário. Gosto que minha senha esteja em um arquivo bem no fundo da máquina. Gostaria apenas de poder armazenar uma senha com hash em vez de texto não criptografado.
SDsolar

Eu estava me referindo a este pacote: packages.debian.org/search?keywords=sendemail
user684790

11
Não vejo esta resposta demonstrando que funciona com o gmail, conforme especificado na pergunta original.
precisa saber é o seguinte

Isso funciona com o gmail, por exemplo: -s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

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: you@whatever\nTo: you@gmail.com\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 email curto, pois não requer a execução ou 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 informa ao sendmail para obter os endereços dos destinatários de 'Para:' no cabeçalho da mensagem.
  • Se o email 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

11
O sistema deve ter um MTA instalado que está trabalhando com sendmail - mas não vejo esta resposta demonstrando que ele funciona com o Gmail como especificado na pergunta original ...
SDsolar

@SDsolar Você está certo. O Postfix está sendo executado no meu servidor e eu não sabia. Parece que é padrão com uma instalação do Centos; talvez a DigitalOcean tenha configurado. Não está escutando em um porto público. Quanto ao envio pelo gmail, o que quero dizer é que você não precisa, pode enviar diretamente do seu servidor, se estiver enviando apenas para si mesmo. (Eu poderia pedir a minha própria pergunta e mover esta resposta sobre, se ele não se encaixa aqui.)
j77h
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.