Inviare mail attraverso server SMTP diversi



Io per leggere e scrivere le email uso mutt che, essendo un client, si appoggia a programmi esterni per eseguire l'invio e la ricezione della posta.

Tipicamente in mutt si imposta la variabile sendmail con il programma che si intende utilizzare per l'invio della posta. Ad esempio se si ha una installazione standard di debian wheezy dovremo impostare la variabile in questo modo:

set sendmail="/usr/sbin/sendmail -oem -oi"

e avremo che la posta verrà smistata da exim4.

Tutti ormai hanno account di posta su provider diversi: gmail e yahoo sono forse i più noti, ma anche chi ci fornisce l'adsl quasi sempre ci dà un indirizzo personale da poter utilizzare.

Nel caso di un solo server di posta exim4 può essere impostato in modalità smarthost in modo che rendirizzi la posta verso i server smtp di gmail invece che direttamente verso i destinatari. La cosa si complica un po' se invece si hanno server di posta diversi.

Senza perdermi nei meandri della configurazione di exim4 ho deciso di provare e alla fine di utilizzare stabilmente msmtp.

Msmtp è un client SMTP che trasmette le mail ad un server che poi si occupa dell'instradamento. La particolarità è che msmtp prevede di poter inviare a più server, scegliendo il server in base al valore del campo From della mail.

La configurazione di msmtp sta tutta nel file ~/.mstprc che, nel mio caso, ha la seguente struttura:

# Gmail
account        gmail
host           smtp.gmail.com
port           587
auth            on
tls             on
tls_starttls    on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
from           me@gmail.com
user           me@gmail.com
password       XXXXXXXX
 
# Postecert
account         postecert
host            mail.postecert.it
port            465
auth            on
tls             on
# postecert non funziona se questa opzione è commentata
tls_starttls    off                     
tls_trust_file /etc/ssl/certs/ca-certificates.crt
from            me@postecert.it
user            me@postecert.it
password        YYYYYYYYYYY

Come si può vedere sono definiti due server di posta: per ognuno è descritto il campo From che msmtp userà per decidere verso quale server inviare la mail.

A questo punto non resta che configurare mutt in modo che usi msmtp e che ci permetta di modificare il campo From:

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="Your Name"
set from=you@example.com
set envelope_from=yes

La prima opzione imposta msmtp come programma per l'invio delle mail, la seconda indica a mutt di generare il campo From mentre l'ultima indica a mutt di impostare l'opzione -f quando richiama msmtp: con questa opzione msmtp userà il campo From per decidere verso che server indirizzare la mail.

A questo punto quando siamo nella modalità Compose di mutt, con ESC-f andremo a modificare il From a seconda del server smtp che vogliamo usare.

In un prossimo post vedremo come condfigurare mutt in modo da leggere mail da account di posta diversi.

Programmazione: 

Limitare l'uso della cpu con cpulimit



Mi capita spesso di eseguire processi che impegnano molto la cpu. In situazioni di questo tipo il rischio è che la macchina diventi di fatto inutilizzabile fintantoché il processo che sta occupando la cpu non finisce.

Altro rischio è che la cpu si surriscaldi eccessivamente portando il kernel a segnalazioni del tipo:

Jan 21 16:34:04 gundam kernel: [353615.424063] CPU1: Core temperature above threshold, cpu clock throttled (total events = 1)
Jan 21 16:34:04 gundam kernel: [353615.424084] CPU0: Core temperature above threshold, cpu clock throttled (total events = 1)
Jan 21 16:34:04 gundam kernel: [353615.425063] CPU0: Core temperature/speed normal
Jan 21 16:34:04 gundam kernel: [353615.425069] CPU1: Core temperature/speed normal
Jan 21 16:35:29 gundam kernel: [353699.988038] [Hardware Error]: Machine check events logged

Per porre rimedio a questo problema esiste un piccolo programmino da riga di comando il cui nome dice già tutto: cpulimit.

Questo programma agisce sul processo che si vuole limitare fermandolo e riattivandolo in modo che il carico sulla cpu non superi mai la percentuale stabilita.

Se ad esempio stiamo usando ffmpeg, che è notoriamente un programma che usa la cpu in modo intenso, per limitarne l'utilizzo della cpu al 50% eseguiremo:

# cpulimit -P `which ffmpeg` -l 50
Warning: no target process found. Waiting for it...
Process 7468 detected

Come si può vedere non è necessario che il processo (identificato dal suo fullpath) sia già attivo, appena cpulimit ne individua uno inizia a limitarlo.

Il processo da limitare può essere indicato tramite il fullpath, il nome oppure il pid.

gtrev@gundam:~$ cpulimit -h
CPUlimit version 1.7
Usage: cpulimit TARGET [OPTIONS...]
   TARGET must be exactly one of these:
      -p, --pid=N        pid of the process
      -e, --exe=FILE     name of the executable program file
                         The -e option only works when
                         cpulimit is run with admin rights.
      -P, --path=PATH    absolute path name of the
                         executable program file
   OPTIONS
      -b  --background   run in background
      -c  --cpu=N        override the detection of CPUs on the machine.
      -l, --limit=N      percentage of cpu allowed from 1 up.
                         Usually 1 - 200, but can be higher
                         on multi-core CPUs (mandatory)
      -v, --verbose      show control statistics
      -z, --lazy         exit if there is no suitable target process,
                         or if it dies
      -h, --help         display this help and exit
gtrev@gundam:~$

Per installare cpulimit in debian wheezy è sufficiente usare apt:

 # apt-get install cpulimit

Programmazione: 

Analizzare i log di apache



Analizzare manualmente i log di apache è un'operazione lunga e noiosa. Esistono vari strumenti che ci vengono in aiuto come ad esempio awstats.

Uno strumento meno conosciuto ma che ha il pregio per me di funzionare solo da riga di comando è goaccess.

Goaccess permette di fare analisi in real time sui log di apache e nginx, fornendo l'output direttamente a riga di comando oppure in formato html, csv o json.

Goaccess è presente nei repository di debian quindi per installarlo è sufficiente fare un :

  $ apt-get install goaccess

L'inconveniente principale è che la versione presente ad oggi nei repository di debian è la 0.5, mentre l'ultima upstream ufficiale è la 0.8.5. Se si vuole quindi essere bleeding edge si possono utilizzare i repository ufficiali di goaccess come descritto qui.

Una volta installato gli si deve spiegare come sono strutturati i log di apache. Nel mio caso ho definito un file nella mia home che si chiama .goaccessrc con il seguente contenuto:

  date_format %d/%b/%Y
  log_format %h %^[%d:%^] "%r" %s %b "%R" "%u"

A questo punto, per avere un dettaglio giornaliero possiamo usare il comando:

  zcat -f /var/log/apache2/access.log* | grep "$(date +%d/%b/%Y)" | goaccess -a -p ~/.goaccessrc

Se invece vogliamo il dettaglio mensile:

  zcat -f /var/log/apache2/access.log* | grep "$(date +/%b/%Y)" | goaccess -a -p ~/.goaccessrc

Infine se vogliamo il dettaglio in html in modo da poterlo navigare in un browser:

  zcat -f /var/log/apache2/access.log* | goaccess -a -p ~/.goaccessrc > /tmp/report.html

Programmazione: 

Pagine