Come posso inviare un file come allegato e-mail usando la riga di comando di Linux?


289

Ho creato uno script che viene eseguito ogni notte sul mio server Linux che utilizza mysqldumpper eseguire il backup di ciascuno dei miei database MySQL in file .sql e li comprime come file compresso .tar. Il prossimo passo che voglio compiere è inviare quel file tar tramite e-mail a un server e-mail remoto per tenerlo al sicuro. Sono stato in grado di inviare un'email allo script non elaborato nel corpo eseguendo il piping del file di testo di backup in questo mailxmodo:

$ cat mysqldbbackup.sql | mailx backup@email.com

catfa eco al testo del file di backup che viene reindirizzato nel mailxprogramma con l'indirizzo e-mail del destinatario passato come argomento.

Mentre questo soddisfa ciò di cui ho bisogno, penso che potrebbe essere un passo migliore, c'è qualche modo, usando script di shell o altro, per inviare il file .tar compresso a un messaggio di posta elettronica in uscita come allegato ? Ciò batterebbe dover affrontare messaggi di posta elettronica molto lunghi che contengono dati di intestazione e spesso presentano problemi di avvolgimento delle parole, ecc.


1
Puoi condividere lo script che esegue il backup dei tuoi database MySQL?
Almino Melo,

Scusa, non lo faccio da un po 'di tempo. So che comportava l'invocazione mysqldumpe quindi il collegamento dell'output a un'e-mail (con mutt). Potrei anche aver avuto un passaggio che ha compresso l'output in un file zip / tar.gz ...
Kit Roed

1
Puramente curioso, perché inviare i backup tramite e-mail o scp o sincronizzarli?
jchook,

Risposte:


298

Nessuno dei mutt ha funzionato per me. Pensava che l'indirizzo e-mail facesse parte dell'attacco. Doveva fare:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

1
Sto usando mutt 1.5.21 (2010-09-15) e richiede -a un parametro per essere dopo l'email del destinatario
nurettin

Ha funzionato per me usando Mutt 1.5.24 (30-08-2015) su openSUSE Leap 42.1.
Antonio Vinicius Menezes Medei,

3
@fugitive significa "fine delle opzioni". Dai un'occhiata a unix.stackexchange.com/questions/11376/…
rynop

Esiste un modo per verificare le eccezioni e riprovare l'invio?
ti034

79

Oppure, in mancanza di mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com

26
Ciò invia la parte codificata in linea in linea e non come allegato . Molti client di posta riconoscono ciò e mostrano la parte codificata come allegato.
FuePi,

4
Non usare uuencode al giorno d'oggi. MIME è leggermente più complesso ma molto più intuitivo.
tripleee,

@DavidGiven: vedi ad esempio (a colpo d'occhio) tutte le altre risposte a questa domanda.
tripleee

6
Nessuno di loro usa la posta!
David Dato il

Quindi ad es. Stackoverflow.com/questions/3317174/… e sostituirlo text/htmlcon qualunque tipo MIME abbia senso per il proprio allegato. (Per questo esempio concreto, suppongo application/gzip.)
Tripleee

43

A seconda della versione di Linux, potrebbe essere chiamato mail. Per citare @ David sopra:

mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

o anche:

cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com 

@ KarelBílek: che ne dici dell'altra opzione?
Nathan Fellman,

Entrambe le soluzioni non funzionano per me. Ho ricevuto l'e-mail con Outlook 2013 e la posta contiene solo il nome file
nickel715,

2
la mia manpage recita:-a, --append=HEADER: VALUE append given header to the message being sent
exhuma,

2
Nathan, sembra che la tua citazione di David sia sbagliata - non ha usato il muttcomando mail. Inoltre, come altri hanno sottolineato, ora mutt sembra richiedere una --discussione prima dell'indirizzo. E vedo che @exhuma e in realtà siamo d'accordo su ciò che fa l' -aopzione mail- mi sono confuso lì per un minuto;)
nealmcb

7
invece di -a dovresti usare -A: -a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE
Victor Perov il

41

Da guardare man mailx, mailx non ha un'opzione per allegare un file. Puoi usare un altro programma come mutt.

echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com

Le opzioni della riga di comando per mutt possono essere visualizzate con mutt -h.


Grazie! Questo ha funzionato, stavo avendo problemi a convincere Mutt a fare l'azione in silenzio.
Kit Roed

10
Vedi la risposta sotto ( stackoverflow.com/a/9524359/10608 ) perché apparentemente la sintassi è cambiata per mutt che ora richiede un --.
Alexander Bird,

29

Uso SendEmail, creato per questo scenario. È confezionato per Ubuntu, quindi presumo sia disponibile

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail/


Credo che dovrebbe essere "sendEmail" anziché "sendemail" nel tuo esempio.
Davit,

1
Sì e no - il sorgente (caspian) usa una E maiuscola, mentre questa è una strategia di denominazione non comune per gli strumenti da riga di comando (nel mondo Unix), almeno il pacchetto Ubuntu di questo software fornisce sia sendemaile sendEmaildentro /usr/bin/.
Fredrik Wendt,

Il mio Xubuntu 14.04.3 non è installatoSendEmail
Vitaly Zdanevich,

3
"sudo apt install sendemail" per installare sendemail e aggiungere "-f oblig@email.com" un campo obbligatorio per il comando. sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip
Sailendra Pinupolu,

28

Uso mpack.

mpack -s subject file user@example.com

Sfortunatamente mpack non riconosce '-' come alias per stdin. Ma il seguente lavoro, e può essere facilmente racchiuso in un alias (shell) o in uno script:

mpack -s subject /dev/stdin loser@example.com < file

Questo potrebbe funzionare in bash per stdin. Non ho mpack, quindi non ho provato:mpack -s subject /dev/stdin loser@example.com <(stdout_generating_program)
thomasa88

23
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

4
Questa dovrebbe essere la risposta accettata. Utilizza mailx predefinito e funziona perfettamente. Mutt v1.5.21 rifiuta di inviare> 1 MB di allegati quando si utilizza cron.
Joseph,

Stavo cercando qualcosa che funzioni in EC2 e questo ha funzionato bene.
singolarità,

6
mailxnon è adeguatamente standardizzato. Qualsiasi risposta che lo consiglia dovrebbe indicare questo avvertimento. Ci sono almeno tre varianti incompatibili nell'uso comune.
tripla

13

Una volta ho scritto questa funzione per ksh su Solaris (usa Perl per la codifica base64):

# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
    to="$1"
    cc="$2"
    subject="$3"
    body="$4"
    filename="${5:-''}"
    boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
    {
        print -- "To: $to"
        print -- "Cc: $cc"
        print -- "Subject: $subject"
        print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
        print -- "Mime-Version: 1.0"
        print -- ""
        print -- "This is a multi-part message in MIME format."
        print -- ""
        print -- "--$boundary"
        print -- "Content-Type: text/plain; charset=ISO-8859-1"
        print -- ""
        print -- "$body"
        print -- ""
        if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
            print -- "--$boundary"
            print -- "Content-Transfer-Encoding: base64"
            print -- "Content-Type: application/octet-stream; name=$filename"
            print -- "Content-Disposition: attachment; filename=$filename"
            print -- ""
            print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
            print -- ""
        fi
        print -- "--${boundary}--"
    } | /usr/lib/sendmail -oi -t
}

8
Su GNU / Linux, si può usare base64command invece di perl per la codifica
MestreLion

12

Puoi usare mutt per inviare l'e-mail con l'allegato

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

2
Almeno a partire da mutt 1.5.21 (Ubuntu fidato), è necessario inserire l' -aopzione dopo il destinatario: mutt -s "Backup" backup@email.com -a mysqldbbackup.sql < message.txtoppure utilizzare l' --opzione prima del destinatario come mostrato nella risposta di rynop.
nealmcb,

10

Invia un'e-mail di testo in chiaro con un allegato in chiaro con mailx:

(
  /usr/bin/uuencode attachfile.txt myattachedfilename.txt; 
  /usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com

Di seguito è riportato lo stesso comando di cui sopra, senza le nuove righe

( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com

Assicurati di avere un file /home/el/attachfile.txtdefinito con questo contenuto:

<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's information free, while bankers that pilfer 
trillions in citizens assets through systematic inflation get the nod and 
walk free among us.
</body></html>

Se non hai uuencode leggi questo: /unix/16277/how-do-i-get-uuencode-to-work

Su Linux, Invia e-mail corpo HTML con un allegato PDF con sendmail:

Assicurati di aver installato ksh: yum info ksh

Assicurati di aver installato e configurato sendmail.

Assicurati di avere uuencode installato e disponibile: /unix/16277/how-do-i-get-uuencode-to-work

Crea un nuovo file chiamato test.sh e inseriscilo nella tua home directory:/home/el

Inserisci il seguente codice in test.sh:

#!/usr/bin/ksh
export MAILFROM="el@defiant.com"
export MAILTO="youremail@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID

(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/plain; charset=ISO-8859-1"
 echo "You need to enable HTML option for email"
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html; charset=ISO-8859-1"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "--$MAILPART_BODY--"

 echo "--$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: uuencode"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 echo ""
 uuencode $ATTACH $(basename $ATTACH)
 echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

Modifica le variabili di esportazione nella parte superiore di test.sh per riflettere il tuo indirizzo e i nomi dei file.

Scarica un documento pdf di prova e inseriscilo in /home/elpdf-test.pdf

Crea un file chiamato /home/el/email_body.htm e inserisci questa riga:

<html><body><b>this is some bold text</b></body></html>

Assicurarsi che il file pdf disponga di 755 autorizzazioni sufficienti.

Esegui lo script ./test.sh

Controlla la tua casella di posta elettronica, il testo deve essere in formato HTML e il file pdf deve essere automaticamente interpretato come un file binario. Fai attenzione a non utilizzare questa funzione più di 15 volte al giorno, anche se invii le e-mail a te stesso, i filtri antispam in Gmail possono inserire nella blacklist un dominio che spunta e-mail senza darti la possibilità di farle passare. E scoprirai che non funziona più, o lascia passare solo l'allegato, o l'e-mail non arriva affatto. Se devi fare molti test su questo, distribuiscili per giorni o verrai etichettato come spammer e questa funzione non funzionerà più.


1
Per me ha funzionato al contrario. (echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com
Vicky,

uuencodenon è propriamente un allegato. Incorpora semplicemente una chiazza di testo leggibile da un computer nel mezzo di qualche altro testo. Funzionava bene quando non c'erano meccanismi migliori, ma era 20+ anni fa.
tripla

9

Ci sono diverse risposte qui che suggeriscono mailomailx meno questo è più uno sfondo per aiutarti a interpretarle nel contesto.

Note storiche

Le origini di Unix mailrisalgono alle nebbie della storia antica di Bell Labs Unix ™ (1969?), E probabilmente non possiamo sperare di entrare nella sua genealogia completa qui. Basti dire che ci sono molti programmi che ereditano o reimplementano il codice (o ereditano il codice da una reimplementazione di) maile che non esiste una base di codice unica che possa essere identificata inequivocabilmente come "il" mail.

Tuttavia, uno dei contendenti a quella posizione è sicuramente "Berkeley Mail" che originariamente veniva chiamato Mailcon una M maiuscola in 2BSD (1978); ma in 3BSD (1979), ha sostituito anche il mailcomando minuscolo , portando a una nuova confusione. SVR3 (1986) includeva un derivato chiamato mailx. È xstato presumibilmente aggiunto per renderlo unico e distinto; ma anche questo ora è stato copiato, reimplementato e mutilato in modo che non ci sia una singola versione individuale che sia definitiva.

Ai tempi, lo standard di fatto per l'invio di file binari attraverso la posta elettronica era uuencode. Esiste ancora, ma presenta numerosi problemi di usabilità; se possibile, dovresti invece inviare allegati MIME, a meno che tu non ti sforzi specificatamente di comunicare con la fine degli anni '80.

Il MIME è stato introdotto nei primi anni '90 per risolvere diversi problemi con la posta elettronica, incluso il supporto per vari tipi di contenuti diversi dal semplice testo in un singolo set di caratteri che è davvero adatto solo per un sottoinsieme di inglese (e, ci viene detto, hawaiano ). Ciò ha introdotto il supporto per messaggi multipart, internazionalizzazione, tipi di contenuto avanzato, ecc. E ha rapidamente guadagnato trazione negli anni '90.

(Le note Heirloom mail/ mailxhistory sono state di grande aiuto durante la composizione di questo, e sicuramente meritano una lettura se ti piacciono queste cose.)

Offerte attuali

A partire dal 2018, Debian ha tre pacchetti che includono un comando mailo mailx. (Puoi cercareProvides: mailx .)

debian$ aptitude search ~Pmailx
i   bsd-mailx                       - simple mail user agent
p   heirloom-mailx                  - feature-rich BSD mail(1)
p   mailutils                       - GNU mailutils utilities for handling mail

(Non sto selezionando Debian come una raccomandazione; è quello che uso, quindi ne ho familiarità; e fornisce un modo per distinguere in modo inequivocabile le varie alternative facendo riferimento ai rispettivi nomi dei pacchetti. Ovviamente è anche la distro che Ubuntu ottiene questi pacchetti.)

  • bsd-mailxè un metodo relativamente semplice mailxche non sembra supportare l'invio di allegati MIME. Vedi i suoi pagina di manuale e nota che questo è quello che ti aspetteresti di trovare su un sistema * BSD, incluso MacOS, per impostazione predefinita.
  • heirloom-mailxviene ora chiamato s-naile ha il supporto invio di allegati MIME con -a. Vedi la sua pagina di manuale e più in generale il progetto Heirloom
  • mailutilsaka GNU mailutils include un mail/ mailxinvolucro compatibilità che fa supporta l'invio di allegati MIME con-A

Con queste preoccupazioni, se hai bisogno che il tuo codice sia portatile e possa dipendere da un pacchetto un po 'complesso, il modo semplice per inviare in modo portabile gli allegati MIME è usare mutt.


Originariamente ho postato questa come una risposta a una moderatamente popolare duplicato domanda stackoverflow.com/questions/902591/...
tripleee

4

Un'altra alternativa - Swaks (Swiss Army Knife for SMTP).

swaks -tls \
    --to ${MAIL_TO} \
    --from ${MAIL_FROM} \
    --server ${MAIL_SERVER} \
    --auth LOGIN \
    --auth-user ${MAIL_USER} \
    --auth-password ${MAIL_PASSWORD} \
    --header "Subject: $MAIL_SUBJECT" \
    --header "Content-Type: text/html; charset=UTF-8" \
    --body "$MESSAGE" \
    --attach mysqldbbackup.sql

2

metamail ha lo strumento metasend

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b

Questo era installato quasi ovunque, ma quasi mai usato. Poiché non è stato mantenuto per lungo tempo (ed è ancora AFAIK) è stato rimosso dal set di strumenti standard di fatto su molte piattaforme.
Tripleee

2

ero solito

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

e questo ha funzionato bene per me ....


1

Di solito uso solo il comando mail su RHEL. Ho provato Mailx ed è abbastanza efficiente.

mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com

This is the content of my msg.

.

1

il modo più breve per me è

file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address

quindi per il tuo esempio lo sarà

file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com

la parte buona è che posso richiamarlo con Ctrl + r per inviare un altro file ...


Le parentesi graffe non ti faranno molto bene ma per essere completamente portatile dovresti usare doppie virgolette attorno alle variabili. Vedere anche stackoverflow.com/questions/10067266/...
tripleee

1

Dalla macchina di origine

mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com

Sulla macchina di destinazione. Salvare il corpo della posta ricevuta come db.sql.gz.b64 ; poi..

base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf

0

Solo per aggiungere i miei 2 centesimi, scriverei il mio script PHP:

http://php.net/manual/en/function.mail.php

Esistono molti modi per eseguire l'allegato negli esempi in quella pagina.


2
PHP potrebbe non essere installato su tutti i server. Se vuoi davvero andare nel percorso "scrivi il tuo script", allora perl o python sono molto più adatti in quanto sono normalmente disponibili di default.
exhuma,

shè ancora più onnipresente. Ci sono domande duplicate con risposte con buoni esempi; ecco il mio.
tripla il

0

mailxnon avere una -apossibilità ora per gli allegati.


2
L'opzione "-a" è per le intestazioni
Yves Martin,

man mail [x], versione 12.5 del 09/10/10 (qualche anno fa) dice chiaramente -a file Allega il file dato al messaggio.`
fche

4
alcune versioni di mailxdo. Credo che ci siano due implementazioni. Uno -aè per gli allegati, dall'altro è per le intestazioni.
exhuma,

1
La versione di mailx in Ubuntu proviene da GNU e quindi -a significa aggiungere un'intestazione. manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.html Quale sistema e quale mailx fa un allegato?
nealmcb,

3
Nella nuova implementazione "-a" è per le intestazioni e "-A" è per gli attacchi
Avi Mehenwal,

0

Non è un metodo per inviare e-mail, ma è possibile utilizzare un server Git online (ad esempio Bitbucket o un servizio simile).

In questo modo, è possibile utilizzare i git pushcomandi e tutte le versioni verranno archiviate in modo compresso e organizzato.


0

Ecco come sto facendo con un file di registro di grandi dimensioni in CentOS:

MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    cd ${LOGDIR}
    # This works too. The message content will be taken from text file below
    # echo 'Hello!' >/root/scripts/audit_check.sh.txt
    # echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    /bin/rm "${LOGDIR}/${LOGNAME}.log"
fi

Perché stai definendo WHOAMIe HOSTNAME due volte?
David C. Rankin

Questo ha diversi errori di stile di codifica della shell. shellcheck.net ne indicherà alcuni, ma non tutti.
tripla

0

Se il file è di testo, puoi inviarlo più facilmente nel corpo come:

sendmail recipient@example.com < message.txt

1
Questo non lo invia come allegato o anche come corpo del messaggio. Sendmail si aspetta che il suo input sia un messaggio di posta elettronica RFC5322 completo e ben formato e, in caso contrario, potrebbe non riuscire in modi interessanti.
tripla

0

usando il comando mailx

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com

usando sendmail

#!/bin/ksh

fileToAttach=data.txt

`(echo "To: user@company.com"
  echo "Cc: user@company.com"
  echo "From: Application"
  echo "Subject: your subject"
  echo  your body
  uuencode $fileToAttach $fileToAttach
  )| eval /usr/sbin/sendmail -t `;

1
sendmail è un bell'esempio, felice di averlo trovato qui.
Honza P.

Nota che hai bisogno di una riga vuota all'inizio del "tuo corpo", altrimenti il ​​corpo scomparirà nelle intestazioni o potrebbe spezzare completamente il messaggio. Vedi anche altrove note su come evitare uuencodea favore del MIME.
Tripleee

E i mostruosi evale misteriosi ritagli attorno all'intero aggeggio sono del tutto inutili qui.
Tripleee

0

Mailutils lo rende un gioco da ragazzi

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file allega un file
  • -M abilita MIME, in modo da poter avere un allegato e un corpo in testo normale.

Se non ancora installato, eseguire

sudo apt install mailutils

0

A seconda delle opzioni del tuo comando di posta (controlla con man mail) e della versione che potresti fare

echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com


Questo sembra duplicare le risposte esistenti senza aggiungere nulla di nuovo, in particolare l' -Aopzione è specifica per la mailutilsversione GNU di mailcome è stato sottolineato nella mia risposta e in quella di @ rumpel
tripleee

-1

Se mutt non funziona o non è installato, prova questo-

*#!/bin/sh

FilePath=$1
FileName=$2
Message=$3
MailList=$4

cd $FilePath

Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*
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.