Come posso inviare e-mail HTML usando il comando 'mail' di Linux?


66

mail -s "subject" xxxxx@gmail.com <test.html funziona, ma solo per e-mail in chiaro.

Qual è il modo corretto di inviare e-mail HTML utilizzando il comando Linux mail?

Risposte:


61

Esistono diverse versioni di mailaround. Quando vai oltre mail -s subject to1@address1 to2@address2 <body(per l'invio, sono tutte le garanzie POSIX - e persino -snon esistevano ai vecchi tempi ), tendono ad avere diverse opzioni della riga di comando. L'aggiunta di un'intestazione aggiuntiva non è sempre facile.

  • Con alcune mailximplementazioni, ad esempio da mailutilsUbuntu o Debianbsd-mailx , è facile, perché c'è un'opzione per questo.

    mailx -a 'Content-Type: text/html' -s "Subject" to@address <test.html
    
  • Con Heirloom mailx , non c'è modo conveniente. Una possibilità per inserire intestazioni arbitrarie è quella di impostare editheaders=1e utilizzare un editor esterno (che può essere uno 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 generale , non so come arrivare alle intestazioni.

Se hai intenzione di usare uno mailo mailx, tienilo a mente

  • Questo non è portatile nemmeno all'interno di una determinata distribuzione Linux. Ad esempio, sia Ubuntu che Debian hanno diverse alternative per maile mailx.
  • Quando si compone un messaggio, maile mailxgestisce le linee che iniziano con ~come comandi. Se si reindirizza il testo mail, è necessario disporre che questo testo non contenga righe che iniziano con ~.

Se hai intenzione di installare software comunque, potresti anche installare qualcosa di più prevedibile di mail/ Mail/ mailx. Ad esempio, mutt . Con Mutt, puoi fornire la maggior parte delle intestazioni nell'input con l' -Hopzione, ma nonContent-Type , che deve essere impostata tramite un'opzione mutt.

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

Oppure puoi invocare sendmaildirettamente. Esistono diverse versioni di sendmaillà fuori, ma tutte supportano sendmail -tl'invio di una posta nel modo più semplice, leggendo l'elenco dei destinatari dalla posta. (Penso che non tutti supportino Bcc:.) Nella maggior parte dei sistemi, sendmailnon è nel solito $PATH, è in /usr/sbino /usr/lib.

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

EOF

Ho provato usando l'esempio mutt sopra; sostituendo i valori reali per il nome del file, per l'indirizzo e-mail, ecc. ma ho ottenuto "Nessun destinatario specificato" Sono molto nuovo con Mutt, @Gilles sai perché potrebbe essere successo? (osx mountain lion, mutt 1.5.21 installato via homebrew)
Chuck van der Linden,

la mia seconda riga era "A: myaddress@mycompany.com" (scusate per la mancanza di formattazione, impossibile in una risposta, il testo effettivo era senza virgolette) e ho inserito una riga vuota prima di inserire l'EOF. ci sarebbe configurazione che devo fare per mutt? prima di provare l'esempio che hai dato (con i valori corretti sostituiti) tutto quello che ho fatto è stato "brew install mutt"
Chuck van der Linden,

@ChuckvanderLinden Fai una nuova domanda. Copia e incolla il comando esatto che hai eseguito e il messaggio di errore completo. Vedi se riesci a inviare un'email da mutt usando l'interfaccia interattiva.
Gilles 'SO- smetti di essere malvagio' il

Sono stato in grado di inviare qualcosa tramite l'interfaccia "interattiva", inizialmente si è lamentato della mancanza di una directory di posta e mi ha offerto di crearla. mi ha ricordato quanto odio vim ;-) ma ce l'ho da inviare. Inizierò una nuova domanda in quanto è più facile da formattare ecc. Il messaggio di errore esatto era proprio quello che ho detto "Nessun destinatario specificato".
Chuck van der Linden,


13
#!/bin/sh

(
echo "To: me@example.com"
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

5
Questo non usa acutamente mail.

3
@ user16144 No, ma è una valida alternativa che l'OP potrebbe prendere in considerazione.
Trusktr,

Sì, non utilizza la posta ma funziona ovunque l'ho provato, il che è più di quanto possa dire per le altre soluzioni.
user1683793,

Funziona magnificamente anche su Mac.
Asim Jalis,

7

Con Heirloom mailx, il modo più conveniente è

mailx -s "$(echo -e "Newsletter issue 3\nContent-Type: text/html")" user@server.com < /tmp/htmlmail.txt

Grazie, amico
Testato su Fedora 17, e ha funzionato


1
Cheeky. Mi piace. : -]
Alastair Irvine,

1
Attenzione che questa soluzione può portare alla email avere sia "Content-Type: text / html" e "Content-Type: text / plain", e potenziali incongruenze se si utilizza questo metodo per specificare set di caratteri.
Skippy le Grand Gourou,

5

Dovrai aggiungere l' Content-Typeintestazione alla tua e-mail per farlo accadere.

echo "<html><b>Hello</b></html>" | mail -a "Content-type: text/html;" -s "Testing" me@example.com

funzionerà


2
mail: opzione illegale - a
pyth0ner

Hai mailx? Potrebbe avere l'opzione. Se ciò non funziona. Se ciò non funziona, puoi prendere in considerazione l'uso di mutt anche se non so a mano a che cosa passa la riga di comando per farlo.
Noufal Ibrahim,

1
se la posta non sta tagliando la senape, usa python ... docs.python.org/library/email-examples.html esempi è il terzo o il n. 6 che si adatta alle tue esigenze.
sdolgy,

Python richiederà di scrivere (e mantenere) uno script. Un liner a riga di comando ha diversi vantaggi.
Noufal Ibrahim,

Ho mailx, ma "opzione -a" non funziona, mostra ancora: mail: opzione illegale - a
pyth0ner

3

Con heirloom-mailx puoi cambiare il programma sendmail nello script hook, sostituire lì le intestazioni e quindi usare sendmail.

Lo script che 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 $@

Questo script modifica i valori nell'intestazione della posta come segue:

  • Content-Type: per text/html; charset=utf-8
  • Content-Transfer-Encoding:a 8bit(non sono sicuro se questo è davvero necessario).

Per inviare e-mail HTML:

mailx -Ssendmail='~/bin/sendmail-mailx-hook' -s "subject" xxxxx@gmail.com < test.html

Questo metodo è più efficace di quanto proposto da @Gilles perché non crea file temporanei e corregge il flusso al volo.


1

Ho usato gli script seguenti per accadere

#!/bin/ksh

(
echo "To: yourmail@domain.com"
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

0

Per me avevo bisogno di specificare una variabile come il server SMTP, quindi il comando mail funzionava nel modo seguente. Ho cercato in molti post e ho trovato sotto la proprietà per convertire il corpo in text / html. Ora l'e-mail che ricevo è in formato HTML.

Disposizione del contenuto: in linea

Versione Unix: Red Hat Enterprise Linux Server versione 6.6 (Santiago)

Primo. Crea qualsiasi informazione sia necessaria in uno 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>"

Secondo. Installa lo script sul comando mail

./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")" userid@email.com

In questo modo ottengo informazioni come di seguito nell'e-mail:

Disposizione del contenuto: inline ID messaggio: User-Agent: Heirloom mailx 12.4 29/07/08 Versione MIME: 1.0 Tipo di contenuto: text / plain; charset = us-ascii Codifica trasferimento contenuto: 7 bit

Valore1 Valore2

Valore1 e Valore2 secondo la codifica HTML eseguita in testSql.sh


-5
cat htmlfile.html | mail -s "subject" xx@example.com

5
No. Questo invierà un'e-mail di testo con HTML nel corpo.
Noufal Ibrahim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.