[Hack] Raspberry Pi email print server

Problema: Ho la necessita di stampare e/o far stampare documenti quando sono fuori casa. Purtroppo ho l’abitudine di tenere spenta la stampante sulla scrivania e non ho modo di accenderla da remoto. La tempistica di stampa non è importante, non mi importa quando i documenti saranno stampati, ma che i documenti vengano effettivamente stampati.

Soluzione: L’idea è di inviare i documenti da stampare via email a una casella appositamente creata per lo scopo. Il Raspberry Pi (serverino che fa tanti altri lavori ed è quindi sempre acceso) provvederà periodicamente a controllare la posta (diciamo ogni 20 minuti durante la giornata), a salvare gli allegati su una chiavetta USB e a stamparli quando la stampante risulterà effettivamente disponibile.

Ingredienti:
– Raspberry Pi (nel mio caso un model B+);
– pendrive USB;
– account email ad hoc;
– python;
– libreria imaplib;
– stampante.

Procedimento:

  • Apriamo un nuovo account gmail (autentichiamoci e segniamoci le credenziali). Ho scelto Gmail perché mi consente di controllare senza difficoltà via protocollo IMAP le email ricevute e di trattarle a dovere. Volendo si potrebbe utilizzare un altro provider.

  • Creiamo il programma in Python che si occuperà di controllare la casella e di stampare gli allegati ricevuti. La chiave è l’utilizzo della libreria imalib.
    Di seguito qualche stralcio del codice:

    import email, imaplib, os
    
    #Variabili
    ORG_EMAIL   = "@gmail.com"
    FROM_EMAIL  = <account gmail> + ORG_EMAIL
    FROM_PWD    = >password>
    SMTP_SERVER = "imap.gmail.com"
    SMTP_PORT   = 993
    detach_dir = '/.stampe'
    
    #Autenticazione
    mail = imaplib.IMAP4_SSL(SMTP_SERVER)
    mail.login(FROM_EMAIL,FROM_PWD)
    mail.select('inbox')
    
    #Lettura dei messaggi ricevuti ancora da leggere
    for e_id in id_list:
        e_id = e_id.decode('utf-8')
        typ, response = mail.fetch(e_id, '(RFC822)')
        email_message = email.message_from_string(response[0][1])
        email_subject = email_message['Subject']
        email_date = email_message['Date']
        email_from = email.utils.parseaddr(email_message['From'])
        print 'From : ' + str(email_from)
        print 'Data: ' + str(email_date)
        print 'Subject : ' + str(email_subject) + '\n'
    

    Se ci sono nuovi messaggi da leggere, controlliamo se sono presenti allegati e nel caso li salviamo:

                #Controllo se ci sono allegati
                if email_message.get_content_maintype() != 'multipart':
                    continue
    
                for part in email_message.walk():
                    # skippiamo multipart
                    if part.get_content_maintype() == 'multipart':
                        continue
                    # controllo allegati
                    if part.get('Content-Disposition') is None:
                        continue
    
    		data = email_date.replace(' ', '_')
    		data = data.replace (',','')
    		data = data.replace (':','_')
    		data = data.replace ('+','')
    		print 'data: ' + str(data)
    
                    filename = data + '_' + part.get_filename()
                    att_path = os.path.join(detach_dir, filename)
    
                    fp = open(att_path, 'wb')
                    fp.write(part.get_payload(decode=True))
                    fp.close()
    
                    print 'Salvato : ' + filename + '\n'
    

    Questa parte di codice invece si preoccupa di scansionare i file contenuti nella directory da noi definita nel programma e nel caso venga rilevata la disponibilità della stampante (con un semplice ping) si preoccupa di stampare i file e quindi di cancellarli:

    #controllo disponibilità stampante
    var = os.popen('ping 192.168.1.208 -c 1').read()
    l = var.index('received')
    l = l-2
    stampa = '--'
    if var[l] == '1':
       print 'stampante MX525 - raggiungibile\n'
    
    #stampa file
       for dr in dirs:
           nomefile = path + '/' + dr
           print nomefile
    
           try:
               subprocess.check_call(["lp", nomefile])
    	   except OSError:
    	   pass
    
           try:
    	   os.remove(nomefile)
    	   except OSError:
               pass
    
    

    Se siete interessati scrivetemi per ricevere il codice completo.


  • Colleghiamo la stampante al Raspberry Pi con Cups
    Se non l’abbiamo già fatto installiamo cups:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install cups
    

    Diamo all’utente Pi i privilegi per amministrare cups:

    sudo usermod -a -G lpadmin pi
    

    Settiamo cups in maniera tale da potersi collegare da remoto:

    sudo cupsctl --remote-any
    sudo /etc/init.d/cups restart
    

    Ora possiamo raggiungere cups digitando sul proprio browser:

    http://indirizzo_Ip_del_Raspberry_Pi:631
    

    Ad esempio digitando nel mio caso:

    http://192.168.1.223:631
    

    Apriamo cups e procediamo ad installare la stampante selezionando il menù AMMINISTRAZIONE e quindi premendo sul pulsante AGGIUNGI NUOVA STAMPANTE:

    Al termine dell’installazione ricordiamoci di settare la stampante come PREDEFINITA:


  • Scheduliamo i tempi di lavoro con Crontab.
    Avviamo la modifica di Crontab del Raspberry PI:

    crontab -e
    

    E quindi aggiungiamo la seguente riga di comando, con il quale scheduliamo il controllo della casella di posta ogni 20 minuti dalle 8 del mattino alle 23 di sera di ogni giorno:

    */20 8-23 * * * <percorso file python>
    

Aggiunta: Nel mio caso specifico ho voluto fare in modo che il sistema mi comunichi via TELEGRAM circa i documenti salvati e quelli stampati. Inoltre ho modificato il programma in maniera tale che invii una email per ciascuno degli allegati ricevuti indicando nel soggetto del messaggio se la stampante risulta accesa o meno.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

w

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: