Mailx: mailrc con direttiva "set sendmail="... esotica!

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Mailx: mailrc con direttiva "set sendmail="... esotica!

Messaggio da joe »

Come ho descritto in questo topic sto cercando di mettere in piedi una configurazione diciamo "unix-style" per l'email sfruttando software come esmtp, fetchmail, procmail (o alternative simili).
Per la ricezione ho già sistemato qualcosa di funzionante, mentre per quanto riguarda l'invio della posta ho faticato un po' di più a trovare informaioni per ottenere il comportamento desiderato.
L'idea è piuttosto semplice alla fine:
  • ricevo tutto con fetchmail e passso il malloppo a procmail che smista la posta nelle mailbox stabilite. Fin qui niente di inconsueto e tutto stradocumentato...
  • invio tutto impostando come "sendmail" lo stesso procmail che legge un file di configurazione ~/.procmailoutrc e smista la posta in uscita prima di inviarla. Per l'invio richiamo sendmail/esmtp attraverso una regola impostata proprio in "~/. procmailoutrc".
Il tutto funziona con alcuni MUA cioè con alcuni client di posta, ma ho qualche problema con "mailx".
Premetto che ho in parte capito dove sta il problema ma non so come risolverlo di preciso...
Vediamo cosa funziona, ho fatto qualche test:

1- Invio di un messaggio email richiamando procmail da riga di comando. Il messaggio è scritto su un file di testo chiamato con molta fantasia "messaggio" e contiene gli headers "From:", "To:", "Subject:". Ecco il comando di invio:

Codice: Seleziona tutto

cat messaggio|formail -a "Date: `date -R`" -s /usr/bin/procmail -t -m /home/joe/.procmailoutrc
Formail aggiunge la data al messaggio e richiama procmail. I flag -t e -m sono flag di procmail e in particolare "-m" significa: utilizza il file di configurazione specificato invece del default ~/.procmailrc.
Come vedete al posto di richiamare /usr/bin/sendmail viene richiamato /usr/bin/procmail il quale legge le regole di invio in ~/.procmailoutrc tra le quali ovviamente viene anche richiamato /usr/bin/sendmail che si occuperà dell'invio vero e proprio. Non volevo allegarlo per non fare confusione ma per chiarezza metto anche almeno la regola in procmailoutrc:

Codice: Seleziona tutto

~/.procmailoutrc

Codice: Seleziona tutto

:0:
* ^From.*mioindirizzo@gmail.com
{
        :0 c
        mioindirizzo@gmail.com

        :0
        | sendmail -t
}

:0:
*
$DEFAULT
Di fatto la regola impone a procmail di copiare il messaggio in uscita avente come From il mioindirizzo@gmail.com nella mailbox chiamata "mioindirizzo@gmail.com" e quindi inviare il messaggio con "sendmail -t". Il flag -t fa si che il nostro sendmail (esmtp) legga il destinatario (To:, Cc:, Bcc:) dal messaggio in input, che quindi deve contenerli.

In conclusione: questa semplice configurazione funziona utilizzando il comando soprariportato: il messaggio parte e viene anche copiato nella mbox mioindirizzo@gmail.com.

2- Invio da Mutt.
Anche in questo caso pare fuznionare alla grande. Ho specificato in .muttrc la direttiva:

Codice: Seleziona tutto

set sendmail="/usr/bin/procmail -m /home/joe/.procmailoutrc"
Quindi all'invio mutt richiama procmail e la sua configurazione vista sopra... Tutto funziona come mi aspettavo.

3- Invio da Mailx. Questo è proprio quello che volevo chiedere in questo topic nonostante il prologo lunghissimo.
Anche qui ho configurato il ~/.mailrc in modo analogo:

Codice: Seleziona tutto

set sendmail=/usr/bin/procmail -m /home/joe/.procmailoutrc
Così non funziona e restituisce un errore:

Codice: Seleziona tutto

$ echo "Questa prova usa mailx esmtp e procmail in uscita"|mailx -v -r mioindirizzo@gmail.com -s 'Prova procmail in uscita con esmtp' mioindirizzo@gmail.com
procmail: Unrecognised options: "i"
Usage: procmail [-vptoY] [-f fromwhom] [parameter=value | rcfile] ...
   Or: procmail [-toY] [-f fromwhom] [-a argument] ... -d recipient ...
   Or: procmail [-ptY] [-f fromwhom] -m [parameter=value] ... rcfile [arg] ...
   Or: procmail [-toY] [-a argument] ... -z
Processing continued
procmail v3.22 2001/09/10
    Copyright (c) 1990-2001, Stephen R. van den Berg    <srb@cuci.nl>
    Copyright (c) 1997-2001, Philip A. Guenther         <guenther@sendmail.com>

Submit questions/answers to the procmail-related mailinglist by sending to:
        <procmail-users@procmail.org>

And of course, subscription and information requests for this list to:
        <procmail-users-request@procmail.org>

Locking strategies:     dotlocking, fcntl()
Default rcfile:         $HOME/.procmailrc
        It may be writable by your primary group
Your system mailbox:    /var/mail/joe
Non capisco quel flag "-i" che sembra essere passato a procmail...
Ho provato ad aggiungere la direttiva "debug" nel .mailrc ed ecco cosa restituisce questa volta:

Codice: Seleziona tutto

$ echo "Questa prova usa mailx esmtp e procmail in uscita"|mailx -v -r mioindirizzo@gmail.com -s 'Prova procmail in uscita con esmtp' mioindirizzo@gmail.com
Sendmail arguments: "send-mail" "-i" "-v" "-r" "mioindirizzo@gmail.com" "mioindirizzo@gmail.com"
Anche in questo caso compare dal nulla il flag "-i" passato al nostro sendmail, non capisco perchè viene aggiunto automaticamente...

Aggiungendo le virgolette e togliendo il debug:

Codice: Seleziona tutto

set sendmail="/usr/bin/procmail -m /home/joe/.procmailoutrc"
Ottengo un altro errore:

Codice: Seleziona tutto

$ echo "Questa prova usa mailx esmtp e procmail in uscita"|mailx -v -r mioindirizzo@gmail.com -s 'Prova procmail in uscita con esmtp' mioindirizzo@gmail.com
/usr/bin/procmail -m /home/joe/.procmailoutrc: File o directory non esistente
"/home/joe/dead.letter" 11/411
. . . message not sent.
Alla fine sempre er capirci qualcosa, ho provato a fare un piccolo script:

Codice: Seleziona tutto

$ cat mybin/procsendmail.sh 
#!/bin/sh

/usr/bin/procmail -m /home/joe/.procmailoutrc
E l'ho impostato come comando sendmail in mailrc (togliendo sempre l'opzione debug):

Codice: Seleziona tutto

set sendmail=/home/joe/mybin/procsendmail.sh
In questo caso l'invio del messaggio funziona come mi aspettavo, con tanto di copia della mail inviata nella mbox stabilita in ~/.procmailoutrc.

Codice: Seleziona tutto

$ echo "Questa prova usa mailx esmtp e procmail in uscita"|mailx -v -r mioindirizzo@gmail.com -s 'Prova procmail in uscita con esmtp' mioindirizzo@gmail.com
procmail: [4925] Thu Aug 13 13:46:18 2015
procmail: Assigning "PATH=/bin:/sbin:/usr/bin:/usr/sbin"
procmail: Assigning "SHELL=/bin/bash"
procmail: Assigning "MAILDIR=/home/joe/Mail"
procmail: Assigning "LOGFILE=/home/joe/Mail/.procmail.log"
procmail: Opening "/home/joe/Mail/.procmail.log"
Quello che volevo chiedere in questo post (che si è dilungato anche troppo... spero che la cosa non crei confusione invece di chiarire la sistuazione) è:
  1. Perchè mai, mailx non riesce ad utilizzare la direttiva "set sendmail=/usr/bin/procmail -m /home/joe/.procmailoutrc" direttamente?
  2. E invece riesce a riciamare lo script contenente lo stesso comando?
  3. Per quale motivo compare dal nulla quel flag "-i" passato al comando "sendmail" (nel mio caso procmail) che io non ho impostato da nessuna parte?
  4. Come dovrei impostare meglio la direttiva "set sendmail=" nel ~/.mailrc senza ricorrere ad uno script esterno?
Nonostante abbia cercato molto sul web non sono riuscito a trovare un caso analogo... E mi sono arreso a postare qui una richiesta d'aiuto (come al solito! :) ).
Grazie mille in anticipo!

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3974
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: Mailx: mailrc con direttiva "set sendmail="... esotica!

Messaggio da Paoletta »

ciao, da: http://www.cs.fsu.edu/general/mail/mailrc.html
sendmail=shell-command
Alternate command for delivering messages.
Note: in addition to the expected list of
recipients, mail also passes the -i and -m,
flags to the command. Since these flags are
not appropriate to other commands, you may
have to use a shell script that strips them
from the arguments list before invoking the
desired command.

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Mailx: mailrc con direttiva "set sendmail="... esotica!

Messaggio da joe »

Grazie Paoletta!
Alla fine avevo chiesto sulla mailing list di mailx.
E a quanto pare il problema è proprio l'aggiunta in automatico delle opzioni -i ed -m al comando richiamato.
La cosa non è aggirabile in modo "pulito" aggiungendo un qualche flag apposito per evitare quel comportamento. Sembrerebbe proprio che l'opzione "sendmail" voglia semplicemente il percorso di un eseguibile... senza ulteriori opzioni specificate. E inoltre tale eseguibile deve essere compatibile con le opzioni del sendmail storico (-i e -m in particolare... "man sendmail" spiega cosa significano).
La scappatoia che anche io avevo sperimentato, cioè inglobare il comando desiderato in uno script in modo da richiamare solamente un "eseguibile" senza opzioni e spazi sembra una buona scelta. Forse come citavi sopra serve un attimo più attenzione a "strip them from the arguments list before invoking the desired command".

Già che ci siamo allego la risposta ricevuta sulla mailing list nail-devel:
Martin Neitzel ha scritto: Hi Joe,

> set sendmail=/usr/bin/procmail -m /home/joe/.procmailoutrc

First the relevant quote from the nail(1) manpage:

sendmail
To use an alternate mail delivery system, set this option to the
full pathname of the program to use. This should be used with
care.

The idea is to give users some tweaking to make nail find the MTA binary.
For example, the classic place of sendmail(8) used to be /usr/lib/sendmail
while the more modern location is /usr/sbin/sendmail. Also, most later
alternative MTA implementations such as qmail, postfix, or exim either
grok the most important classic sendmail options in the same way or
come with a compatibility wrapper which does. nail(1) will simply
run the program you specify using the "sendmail" setting and provide
it with further options and arguments (such as "-i").

As the manual says: you can just spec the pathname; no additional
options.

Providing a shell script as you did is fine. It allows you to
invoke whatever you like with whatever options. However, you
must take care that nail still invokes your script with the
original options, and those may well signify special actions.

For example, the "-i" means to sendmail(8):

-i Ignore dots alone on lines by themselves in incoming messages.
This should be set if you are reading data from a file.

This happens to be the default behaviour of procmail so you are safe
to just ignore this option.

You'd have to check the nail sources, though, to find out what other
options might be used in what circumstances. (Sending an email,
"forwarding" it, setting "from=" for an alternate sender address, ...)

Last remark:

Yes, you have to use quotes for any variable values with spaces in them.

set sendmail=/usr/bin/procmail -m /home/joe/.procmailoutrc

sets 3 variables:

sendmail (to the value /usr/bin/procmail), which has a specific
meaning to nail,

-m which is a funny name and has no specific meaning to nail

/home/joe/.procmailoutrc which is a funny name and has no
specific meaning to nail, again.

The latter to variables are just "set", in a boolean sense.

set sendmail="/usr/bin/procmail -m /home/joe/.procmailoutrc"

yields a single definition but, as you noticed, there's no such
"full pathname of the program to use" as would be required on your
filesystem.

Martin
Ok, c'è poco da aggiungere: mailx non supporta un valore della variabile sendmail settato ad un comando articolato con opzioni varie e contenente spazi. Quindi serve uno script da usare come binario "sendmail", con l'accortezza di pretrattare le opzioni -i e -m con cui verrà invocato da mailx. Questo è il succo.

Siccome sto mettendo in piedi una configurazione mail che vorrebbe essere indipendente dal MUA utilizzato, mi scoccia un po' dover aggiungere al puzzle anche uno script esterno, ma non vedo alternative per rendere la configurazione sfruttabile anche con mailx.

Aggiungo infine che con Mutt non ci sono problemi, anche lì si setta la variabile "sendmail" con una direttiva simile, nel mio caso alla fine ho messo nel ~/.muttrc:

Codice: Seleziona tutto

set sendmail="/usr/bin/formail -s /usr/bin/procmail -t -m ~/.procmailoutrc"
E pare che la cosa funzioni, quindi nessun problema con le opzioni di formail o di procmail... in questo gli spazi e il double quoting funzionano come ci si aspetterebbe.

Grazie intanto della risposta e del suggerimento, quella pagina mi era sfuggita e non ti dico quanto ho cercato... #-o
Per quel che riguarda la configurazione finale aggiornerò il topic linkato in primo post.

Di nuovo grazie! Buona giornata!
Alla prossima! :D

Avatar utente
joe
Iper Master
Iper Master
Messaggi: 3288
Iscritto il: ven 27 apr 2007, 11:21
Slackware: 14.2
Kernel: 4.4.38
Desktop: KDE-4.14.21

Re: Mailx: mailrc con direttiva "set sendmail="... esotica!

Messaggio da joe »

Aggiungo una nota che scrive l'autore del MUA s-nail, un derivato di mailx (AKA nail), impiegato di default anche da arch-linux.
Steffen Nurpmeso ha scritto: I'm adding the cents of S-nail here:

sendmail
To use an alternate mail transport agent (MTA), set this
option to the full pathname of the program to use. It may be
necessary to set sendmail-progname[415] in addition.

The MTA will be passed command line arguments from several
possible sources: from the variable sendmail-arguments[414] if
set, from the command line if given and the variable
expandargv[368] allows their use. It'll always be passed the
‘-i’ option, the option ‘-m’ only if the metoo[310] variable,
and ‘-v’ only if the verbose[344] variable are set. In con‐
junction with the -r[57] command line option S-nail may pass
‘-f‘ as well as ‘-F‘. Option processing of the MTA will be
terminated via a ‘--’ separator.

sendmail-arguments
Arguments to pass through to the Mail-Transfer-Agent can be
given via this option. The content of this variable will be
split up in a vector of arguments which will be joined onto
other possible MTA options:

set sendmail-arguments='-t -X "/tmp/my log"'

sendmail-progname
Many systems use a so-called mailwrapper(8)[538] environment
to ensure compatibility with sendmail(1)[539]. This works by
inspecting the name that was used to invoke the mail delivery
system. If this variable is set then the mailwrapper (the
program that is actually executed when calling “sendmail”)
will treat its contents as that name. The default is
‘sendmail’.

So you will never get around -i even with S-nail. I think i'll
add a *sendmail-no-default-arguments* option for v14.8.5,
hopefully coming late September.
Ciao,

--steffen
In particolare l'ultima battuta:
So you will never get around -i even with S-nail. I think i'll
add a *sendmail-no-default-arguments* option for v14.8.5,
hopefully coming late September.
Ciao,
In pratica in s-nail verrà aggiunta una nuova opzione tipo "sendmail-no-default-arguments" che permetterà di configurare il comando send-mail per richiamare il MTA o chi per esso senza troppi patemi.
Potrebbe essere l'occasione per proporre l'aggiunta di una simile opzione anche per il nostro heirloom mailx (nail) preinstallato su slackware. Provo... chiedere non costa nulla! ;)

Rispondi