¿Cómo envío un correo electrónico HTML usando el comando 'mail' de Linux?

66

mail -s "subject" [email protected] <test.html funciona, pero solo para correo electrónico de texto sin formato.

¿Cuál es la forma correcta de enviar correo electrónico HTML usando el comando Linux mail?

pyth0ner
fuente

Respuestas:

61

Hay muchas versiones diferentes de mailalrededor. Cuando va más allá mail -s subject to1@address1 to2@address2 <body(para enviar, eso es todas las garantías POSIX , e incluso -sno existía en los viejos tiempos ), tienden a tener diferentes opciones de línea de comando. Agregar un encabezado adicional no siempre es fácil.

  • Con algunas mailximplementaciones, por ejemplo, a partir mailutilsde Ubuntu o Debianbsd-mailx , es fácil, porque hay una opción para eso.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Con la herencia mailx , no hay una manera conveniente. Una posibilidad para insertar encabezados arbitrarios es establecer editheaders=1y usar un editor externo (que puede ser un script).

    ## Prepare a temporary script that will serve as an editor.
    ## This script will be passed to ed.
    temp_script=$(mktemp)
    cat <<'EOF' >>"$temp_script"
    1a
    Content-Type: text/html
    .
    $r test.html
    w
    q
    EOF
    ## Call mailx, and tell it to invoke the editor script
    EDITOR="ed -s $temp_script" heirloom-mailx -S editheaders=1 -s "Subject" to@address <<EOF
    ~e
    .
    EOF
    rm -f "$temp_script"
    
  • Con un POSIXmailx general , no sé cómo llegar a los encabezados.

Si vas a usar cualquiera mailo mailx, ten en cuenta que

  • Esto no es portátil incluso dentro de una distribución de Linux dada. Por ejemplo, tanto Ubuntu como Debian tienen varias alternativas para maily mailx.
  • Al redactar un mensaje, maily mailxtrata las líneas que comienzan con ~como comandos. Si canaliza texto mail, debe organizar que este texto no contenga líneas que comiencen por ~.

Si va a instalar software de todos modos, también podría instalar algo más predecible que mail/ Mail/ mailx. Por ejemplo, mutt . Con Mutt, puede suministrar la mayoría de los encabezados en la entrada con la -Hopción, pero noContent-Type , que debe configurarse mediante una opción de mutt.

mutt -e 'set content_type=text/html' -s 'hello' 'to@address' <test.html

O puede invocar sendmaildirectamente. Existen varias versiones de sendmailpor ahí, pero todas admiten sendmail -tenviar un correo de la manera más simple, leyendo la lista de destinatarios del correo. (Creo que no todos son compatibles Bcc:). En la mayoría de los sistemas, sendmailno está en lo habitual $PATH, está en /usr/sbino /usr/lib.

cat <<'EOF' - test.html | /usr/sbin/sendmail -t
To: to@address
Subject: hello
Content-Type: text/html

EOF
Gilles 'SO- deja de ser malvado'
fuente
Intenté usar el ejemplo de mutt anterior; sustituyendo valores reales para el nombre del archivo, a la dirección de correo electrónico, etc. pero obtuve "No se especificaron destinatarios" Soy muy nuevo en mutt, @Gilles ¿sabes por qué pudo haber sucedido eso? (osx mountain lion, mutt 1.5.21 instalado a través de homebrew)
Chuck van der Linden
mi segunda línea fue "Para: [email protected]" (perdón por falta de formato, no es posible en una respuesta, el texto real era sin comillas) e incluí una línea en blanco antes de poner el EOF. ¿habría alguna configuración que deba hacer para mutt? antes de probar el ejemplo que diste (con los valores adecuados sustituidos) todo lo que hice fue 'brew install mutt'
Chuck van der Linden
@ChuckvanderLinden Haz una nueva pregunta. Copie y pegue el comando exacto que ejecutó y el mensaje de error completo. Vea si puede enviar un correo electrónico desde mutt usando la interfaz interactiva.
Gilles 'SO- deja de ser malvado'
Pude enviar algo a través de la interfaz 'interactiva', inicialmente se quejó de que faltaba un directorio de correo y se ofreció a crearlo. recordé cuánto odio vim ;-) pero lo envié. Comenzaré una nueva pregunta, ya que es más fácil de formatear, etc. El mensaje de error exacto fue justo lo que dije "No se especificaron destinatarios".
Chuck van der Linden
Nueva pregunta unix.stackexchange.com/questions/83137/…
Chuck van der Linden
13
#!/bin/sh

(
echo "To: [email protected]"
echo "Subject: hello"
echo "Content-Type: text/html"
echo
echo "<html><b><font size='7'>H</font>ello</b></html>"
echo
) | /usr/sbin/sendmail -t
Mejorador de código
fuente
55
Eso no se usa realmente mail.
3
@ user16144 No, pero es una buena alternativa que el OP podría considerar.
trusktr
Sí, no usa el correo, pero funciona en todas partes. Lo he probado, lo que es más de lo que puedo decir para las otras soluciones.
user1683793
Funciona muy bien en Mac también.
Asim Jalis
7

Con Heirloom mailx, la forma conveniente es

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" [email protected] < /tmp/htmlmail.txt

Gracias, Amigo
Probado en Fedora 17, y trabajó

daniel
fuente
1
Fresco. Me gusta. : -]
Alastair Irvine
1
Tenga en cuenta que esta solución puede conducir al correo electrónico que tiene tanto "Content-Type: text / html" y "Content-Type: text / plain", y las posibles incoherencias si se utiliza esta forma de especificar charset.
Skippy le Grand Gourou
5

Deberá agregar un Content-Typeencabezado a su correo electrónico para que esto suceda.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" [email protected]

trabajará

Noufal Ibrahim
fuente
2
mail: opción ilegal - a
pyth0ner
¿Tiene usted mailx? Eso podría tener la opción. Si eso no funciona. Si eso no funciona, puede considerar usar mutt, aunque no sé de antemano cuáles son los cambios de la línea de comando para hacerlo.
Noufal Ibrahim
1
si el correo no corta la mostaza, use python ... docs.python.org/library/email-examples.html ejemplos es el tercero o # 6 que se adapte a sus necesidades.
sdolgy
Python requerirá que escriba (y mantenga) un script. Una línea de comando one liner tiene diferentes ventajas.
Noufal Ibrahim
Tengo mailx, pero la "opción -a" no funciona, todavía se muestra: mail: opción ilegal - a
pyth0ner
3

Con heirloom-mailx puede cambiar el programa sendmail a su script de enlace, reemplazar los encabezados allí y luego usar sendmail.

El script que uso ( ~/bin/sendmail-mailx-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail $@

Este script cambia los valores en el encabezado del correo de la siguiente manera:

  • Content-Type: a text/html; charset=utf-8
  • Content-Transfer-Encoding:a 8bit(no estoy seguro si esto es realmente necesario).

Para enviar un correo electrónico HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" [email protected] < test.html

Este método es más efectivo que el propuesto por @Gilles porque no crea archivos temporales y simplemente arregla la transmisión sobre la marcha.

loentar
fuente
1

He utilizado los siguientes scripts para suceder

#!/bin/ksh

(
echo "To: [email protected]"
echo "Subject: Job Status"
echo "Content-Type: text/html"
echo
echo "<html>
<head>
<title>Status of the jobs during the day</title>
<style>
table, th, td {
    border: 1px solid blue;
    border-collapse: collapse;
}
th, td {
    padding: 5px;
}
</style>
</head>
<body>
<table style='width:100%'>
<tr bgcolor='#808080'>
    <th>Job Name</th>
    <th>System name</th>
    <th>Status</th>
  </tr>
  <tr>
    <td>Job-1</td>
    <td>Sys</td>
    <td>Sucess</td>
  </tr>
  <tr>
    <td>Job-2</td>
    <td>sys</td>
    <td>Failure</td>
  </tr>
  <tr>
    <td>Job-3</td>
    <td>sys</td>
    <td>Sucess</td>
  </tr>
 </table>
</body></html>"
echo
) | /usr/sbin/sendmail -t
Bhabatosh
fuente
0

Para mí, necesitaba especificar una variable como el servidor SMTP, por lo que el comando de correo funcionó de la siguiente manera. Busqué en muchas publicaciones y encontré la propiedad a continuación para convertir el cuerpo en texto / html. Ahora el correo electrónico que recibo está en formato HTML.

Disposición de contenido: en línea

Versión Unix: Red Hat Enterprise Linux Server versión 6.6 (Santiago)

Primero. Cree la información necesaria en un script (testSql.sh)

echo "<html><body><pre>"
mysql -u USERNAME -pPASSWORD -P PORTNUMBER -h HOSTNAME DBNAME --table -e "select columns from tablename where member in ('value1','value2')"
echo "</pre></body></html>"

Segundo. Canalice esa secuencia de comandos al comando de correo

./testSql.sh  | mail -v -S smtp=smtp://IP:PORTNUMBER -s "$(echo -e "This is the subject\nContent-Type: text/ht ml\nMIME-Version: 1.0\nContent-Disposition: inline")" [email protected]

Al hacer esto, obtengo la información que se muestra a continuación en el correo electrónico:

Disposición del contenido: en línea ID del mensaje: Agente de usuario: Heirloom mailx 12.4 29/7/08 Versión MIME: 1.0 Tipo de contenido: texto / sin formato; charset = us-ascii Content-Transfer-Encoding: 7bit

Valor1 Valor2

Value1 y Value2 según el etiquetado HTML realizado en testSql.sh

Vaibhav
fuente
-5
cat htmlfile.html | mail -s "subject" [email protected]

fuente
55
No. Esto enviará un correo electrónico de texto con HTML en el cuerpo.
Noufal Ibrahim