¿La forma más sencilla de enviar correo de una línea a través de la línea de comando usando gmail?


32

Usando Raspbian y Ubunntu 16.04 LTS, necesito una solución genérica de Linux.

El requisito es simple:

Necesito una forma de enviar mensajes de correo electrónico de una línea desde la línea de comandos.

He configurado una cuenta de gmail solo para este Rpi3 en particular, con la dirección de rpi3abc@gmail.com, sin 2FA

Así que ahora necesito poder enviar mensajes de correo de una línea desde cualquier lugar (incluido cron) sin intervención del usuario.


También me gustaría poder enviar archivos de texto; básicamente, cualquier cosa de stdin.


¿Desea que su mensaje provenga de esta dirección en particular, rpi3abc@gmail.com o está bien que ese mensaje provenga de your_username @ localhost?
John Smith

Viene de rpi3abc@gmail.com, así que sé que mi computadora se está comunicando conmigo. Lo uso en trabajos cron, principalmente.
SDsolar

Respuestas:


33

La respuesta más simple para enviar mensajes de una línea a través de gmail es usar ssmtp


Instálalo con los siguientes comandos:

sudo apt-get update
sudo apt-get install ssmtp

Editar /etc/ssmtp/ssmtp.confpara verse así:

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

Envíe una línea como esta:

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

o

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

Luego, fiel a * nix, solo obtienes el aviso en unos segundos.

Verifique su cuenta myusername@gmail.com, y listo, ¡está ahí!


Esto también funciona bien al enviar un archivo, así:

cat program.py | ssmtp myotherusername@yahoo.com

Y el programa aparecerá en el buzón

Si el archivo es un archivo de texto, puede tener una primera línea que dice Subject: xxxxxx

Esto se puede usar con varios trabajos cron y puede enviarme datos con líneas de asunto que indican el contenido.


Esto funcionará con cualquier cosa que prepare un mensaje que se canaliza a ssmtp a través de stdin.


Para obtener más detalles, como proteger estos archivos contra otros usuarios, visite este artículo:

Enviar correo electrónico desde la línea de comandos de Raspberry Pi


Asegúrese de mirar también a continuación la respuesta publicada Ruiacerca del bloqueo de la FROM:dirección que podría modificarse en los archivos de mensajes formateados, si es necesario.


Ahora, si solo pudiera descubrir cómo enviar SMS de la misma manera.


1
También lo uso ssmtpen mis máquinas virtuales, muy ligero. +1
Rui F Ribeiro

1
¿Por qué no usar la API sendmail de Python y enviarla directamente entonces?
Rui F Ribeiro

Para llevar esto un paso más allá, aquí hay instrucciones muy simples para incluir un archivo de imagen como archivo adjunto: unix.stackexchange.com/questions/381131/…
SDsolar

Para responder a la pregunta de Rui: sendmailsolo no tiene el MTA - Agente de transporte de correo para comunicarse fuera de la máquina. Por defecto, dado que Unixen es multiusuario por diseño, sendmailenviará mensajes a otros usuarios en el mismo cuadro pero no fuera. ssmtpes el MTA que creo que es más sencillo de configurar para gmail.
SDsolar

1
Pasé una eternidad tratando de configurar Postix, ¡esto funcionó! Una nota para cualquiera que lea esto, la conf tiene un error tipográfico, el parámetro raíz debe ser gmail.com no gmail.
qodeninja

9

ssmtpes solo uno de los muchos envoltorios de Sendmail. Todos estos aceptan un mensaje en la entrada estándar y, opcionalmente, una lista de direcciones como argumentos de línea de comandos, y todos ofrecen un nombre binario sendmailque implementa (al menos las características básicas de) la API tradicional de línea de comandos Sendmail. Pero hablando correctamente, ese mensaje debe ser un mensaje RFC822 bien formado. Como mínimo, debe tener un Subject:encabezado.

ssmtp address@example.com <<<$'Subject: testing 1...2...3'

(Con ssmtp, sendmailes solo un enlace simbólico a ssmtp. Postfix, Exim, y creo que cualquier otro MTA que Provides: mail-transport-agenttenga una disposición similar, excepto, por supuesto, sendmaildonde el sendmailbinario es "lo real").

Más comúnmente, puede armar un mensaje de correo electrónico simple con un documento aquí.

/usr/lib/sendmail -oi -t <<____HERE
Subject: testing
To: recipient@example.net

Here we interpolate the shell variable $result
____HERE

(La -topción Sendmail dice que tome la lista de destinatarios de los encabezados del mensaje que recibe en la entrada estándar. La ruta precisa a Sendmail diferirá entre las plataformas).

Otra variación común es combinar la salida de algunos comandos. Tenga cuidado de tener una línea vacía (un "cuello") entre los encabezados y el cuerpo del mensaje.

( 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 cualquier cosa más allá de los mensajes de texto ASCII muy simples, debe comprender cómo redactar un mensaje MIME adecuado, momento en el que generalmente tiene más sentido usar una herramienta como mutt. Algunas plataformas tienen un mailo mailxque sabe cómo enviar archivos adjuntos y texto que no es ASCII, pero esto no es totalmente portátil.

El desafío aquí no es encontrar un cliente que pueda tomar un mensaje de correo electrónico e intentar enviarlo, es configurarlo para los detalles específicos de Gmail, lo que requiere que el MTA conozca el nombre de usuario y la contraseña para usar en el servidor remoto. para poder usarlo como el smarthost saliente.

Detrás de escena, a la mayoría de los clientes les gusta mutt, mailxetc., normalmente solo se ejecutan sendmaildetrás de escena para sacar el mensaje del sistema.


No quiero tener mucha suerte con el uso de sendmail directamente; por lo tanto, recurriendo a ssmtp. Vota por tu respuesta. Por cierto, para enviar imágenes como archivos adjuntos, encontré la forma más simple posible. Ni siquiera tengo que pensar en MIME. Solo uso mpack, como se describe aquí: unix.stackexchange.com/questions/381131/…
SDsolar

8

Agregando al OP propia respuesta:

Al configurar ssmtp, también puede prohibir o permitir que los usuarios definan From, y también anular el dominio; es posible que desee hacerlo por varias razones, incluido el mensaje que no cae en la carpeta Spam.

Puedes agregar 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

Tenga en cuenta que si bien YES se puede usar en una frambuesa casera, es posible que no sea aconsejable en un sistema multiusuario desde el punto de vista de la seguridad.


Voto a favor. Excelente informacion.
SDsolar

5

¿Qué hay de malo con el "correo"?

echo "Hola" | mail -s "Correo importante" usuario@ejemplo.com

"mail" es / etc / enlace alternativo a / usr / bin / bsd-mailx del paquete bsd-mailx. Creo que está ahí por defecto. Gran utilidad para enviar correo desde scripts cron, por ejemplo.

Funciona también en Ubuntu y FreeBSD.


3
mailxes solo un front end. Requiere que se configure algo de MTA para que el mensaje salga del sistema local. Existen múltiples versiones incompatibles de uso común, aunque si su plataforma de destino es solo Debian, puede confiar en un comportamiento BSD razonablemente reciente.
tripleee

4

Estoy realmente interesado en usar mailxesto:

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

1
Varias de las opciones aquí no estarán disponibles en muchos sistemas que no sean Debian / BSD. La -aopción en particular sería maravillosa si fuera universalmente compatible, pero solo examine las mailxpreguntas aquí para ver que ciertamente este no es el caso.
tripleee

2

Utilizo sendEmail para enviar correos electrónicos automáticos simples a través del servidor SMTP de un proveedor 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"

Paso todo en una línea, por lo que hacer esto en una línea de comando probablemente muestre todos los parámetros (incluida la contraseña smtp) a todos los usuarios, si se ejecutan un ps -eftiempo, estoy ejecutando el comando. Lo uso dentro de un script de shell.


1
Esta no es una instalación estándar, y hay varios clientes con este nombre. Supongo que te refieres a en.wikipedia.org/wiki/SendEmail . ¿Está disponible como un paquete Debian?
tripleee

Pensar bien en el script de shell, como en un sistema multiusuario. Me gusta que mi contraseña esté en un archivo en las entrañas de la máquina. Solo desearía poder almacenar una contraseña hash en lugar de texto claro.
SDsolar


1
No veo esta respuesta que demuestre que funciona con gmail como se especifica en la pregunta original.
SDsolar

Esto funciona con gmail, por ejemplo: `-s smtp.gmail.com -o tls = yes -xp your_gmail_password -s smtp.gmail.com: 587`
rogerdpack

1

Mi servidor es CEntOS 7 y tiene sendmail pero no mailx, etc. En lugar de instalar un nuevo programa, probé usando sendmail directamente y descubrí que esto 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 mí, esta parece ser la forma más sencilla de enviar un correo electrónico corto, ya que no requiere ejecutar o configurar un servidor o demonio, y puede hacerse en una sola línea de comando.

La idea es que un mensaje simplemente me alertará de que cierto programa arrojó un error, sin revelar ninguna información potencialmente confidencial, y luego enviaré SSH al servidor para inspeccionar sus registros. De esta manera, no hay necesidad de molestarse con complicaciones como adjuntar archivos o cifrar el transporte.

Notas:

  • -e le dice a echo que interprete '\ n' y otros escapes.
  • -t le dice a sendmail que obtenga las direcciones de los destinatarios de 'Para:' en el encabezado del mensaje.
  • Si el correo no llega, utilícelo tail /var/log/maillogpara ver mensajes de error.
  • Si envía a su dirección de gmail, haga un filtro en gmail para mantenerlos fuera de la carpeta de correo no deseado.
  • Este sendmail es en realidad 'sendmail.postfix' (que podría ser normal); hay una página man aquí

1
Su sistema debe tener un MTA instalado que funcione sendmail , pero no veo esta respuesta que demuestre que funciona con gmail como se especifica en la pregunta original ...
SDsolar

@SDsolar Tienes razón. Postfix se está ejecutando en mi servidor, y no lo sabía. Parece que es estándar con una instalación de Centos; tal vez DigitalOcean lo configuró. No está escuchando en un puerto público. En cuanto al envío a través de gmail, mi punto es que no es necesario, puede enviar directamente desde su propio servidor, si solo lo está enviando a usted mismo. (Podría hacer mi propia pregunta y mover esta respuesta, si no encaja aquí.)
j77h
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.