Webmail PEC Ordine Ingegneri Caserta non raggiungibile

La webmail della PEC dell’Ordine degli Ingegneri di Caserta risulta non raggiungibile e non funziona quando si tenta di accedere alla pagina web si vede solo “loading …”.? Accedi tramite SMTP/IMAP con il tuo client di posta elettronica (thunderbird, mail app, outlook eccetera)

Oggi non riuscivo ad accedere alla webmail di gestione della PEC dell’Ordine degli Ingegneri di Caserta, per questo ho cercato una soluzione alternativa, che fin’ora non avevo esplorato.

Ho verificato che fosse un problema non relativo a Firefox, ho notato che ci fosse un problema in qualche libreria esterna (lato server) con tutta probabilità relazionato ad un aggiornamento software (sempre lato loro) che ha innescato un bug.

Era arrivato il momento di configurare Thunderbird per ricevere/inviare PEC direttamente dal client di posta, senza cioè navigare con il browser sulla pagina web postacertificata.ordingce.it.

Ovviamente non sono riuscito a reperire nessuna informazione circa la configurazione necessaria a scaricare ed inviare la posta, in particolare non riuscivo a reperire IMAP ed SMTP di accesso.

Ebbene, dopo un poco di prove scimmia, in cui cercavo di beccare l’host SMTP e l’host IMAP ho provato ad usare la testa e vedere cosa succedeva.

forse non sapevi che
In precedenza per poter usare la PEC con il client di posta (della Mozilla nel mio caso) c’era bisogno di un’estensione, Thunderpec, per poter usare la PEC, oggigiorno a quanto pare no…

La soluzione

La webmail di ordingce è offerta da Infocert, pertanto ho cercato “ordingce pec thunderbird” su Google, ho trovato questo post, su help.infocert.it, dove spiegano come configurare una casella legalmail PEC. Ho usato esattamente le stesse configurazioni e ha funzionato magistralmente. Ecco le configurazioni:

Le informazioni richieste definiscono i dati di connessione del server. In particolare:

    Server posta in arrivo: mbox.cert.legalmail.it
    Server posta in uscita: sendm.cert.legalmail.it

Le porte da utilizzare sono, rispettivamente:

    Server posta in arrivo (IMAP): 993
    Server posta in uscita (SMTP): 465

Per entrambi i server seleziono la modalità crittografica SSL/TLS e scelgo l'opzione Password normale nella sezione autenticazione.

Spero di essere stato utile, se non riesci a configurare la tua casella prova a scrivere nei commenti.

Come eliminare tutti i prodotti da woocommerce senza impazzire?

Minimo sforzo massima resa, in questo post spiego come ho fatto a risolvere il problema che un mio cliente aveva generato per errore. Oltre alla soluzione troverete anche l’iter che mi ci ha portato.

A seguito di un’importazione sbagliata, un mio cliente aveva riempito il suo e-commerce (woocommerce) di 2000 prodotti vuoti! Fortunatamente si trattava di un ambiente di pre-produzione e quindi non ha avuto alcun impatto sull’esperienza utente.

Tuttavia si era reso necessario un intervento massivo su tutti i prodotti, in quanto andavano eliminati del tutto dal sito internet.

Il mio cervello ha pensato subito a scrivere un poco di codice per creare uno script da lanciare in batch attraverso di un plugin ad hoc, che avrebbe dovuto esporre una pagina con un pulsante di distruzione di massa, quindi esporre un avviso per chiedere all’utente se fosse sicuro di quello che stava facendo … ma sono troppo pigro, per cui, il secondo pensiero è stato gugolare un poco (anche se in realtà uso perlopiù duckduckgo, ve lo consiglierò prima o poi assieme ad altri tool per la vostra privacy).

Dalla ricerca che ho usato wordpress how to delete all products è venuto fuori (ovviamente) la qualunque … focalizzerò l’attenzione su 2 delle soluzioni che ho trovato.

1. Aumento numero prodotti visualizzati

Parte superiore della pagina prodotti di wordpress/woocommerce

Alcuni consigliano di visualizzare più prodotti sulla stessa pagina e cancellarli massivamente

Ma questa soluzione, mostrando un numero considerevole di prodotti (anche 300), è veramente sconsigliata per tanti motivi:

  • è maledettamente lenta;
  • prevede dei tempi morti perfino lato client (javascript ci mette un po’ a spuntare tutte le checkbox!);
  • anche se il processo di cancellazione massiva viene gestito in batch, ottimizzando l’uso della memoria RAM, vi ritroverete comunque a consumare molte risorse e ad aspettare molto tempo prima che la nuova pagina venga ricaricata e possiate lanciare un altro cancella tutti.

Questa soluzione per me è quindi SCONSIGLIATA. Passiamo alla prossima

2. Query diretta al database che rimuove tutto

Non male come idea. Una bella query, fatta bene che va a togliere non solo i prodotti, ma tutte le sue relazioni con le altre risorse BASE di wordpress.

Quel “BASE” non è maiuscolo per caso. Quello che intendo impropriamente dire con risorse BASE, significa che se per qualche motivo il vostro prodotto è collegato a qualche altra risorsa introdotta da un plugin o da software di terze parti, rischiate seriamente di perdervi pezzi per strada.

Uno screenshot della soluzione così come riportata su Store App org.

Il sito storeapps.org, propone una soluzione basata su questa query:

DELETE relations.*, taxes.*, terms.*
FROM wp_term_relationships AS relations
INNER JOIN wp_term_taxonomy AS taxes
ON relations.term_taxonomy_id=taxes.term_taxonomy_id
INNER JOIN wp_terms AS terms
ON taxes.term_id=terms.term_id
WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));

DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');

Ma ad ogni modo, lo stesso autore dopo questa query dice:

However, this is not the best way to bulk delete products

Dal sito storeapps.org

Anche se loro sconsigliano l’approccio query based, perché vogliono vendervi un plugin che fa cose, quella che dicono è una grande verità.

Troppo rischioso lanciare query nel database senza alcuna pietà. Potresti ritrovarvi con più problemi di quando avete iniziato.

Se scegliete questo approccio che io SCONSIGLIO, abbiate almeno il buon cuore di effettuare una copia di backup del database (ho scritto anche io un poco a riguardo).

3. WP CLI

La WP CLI è un software portabile scritto in PHP che vi consentirà di lanciare dei comandi sulla console per ottenere quello che volete.

Non sai di che parlo? Fidati di me, usa il metodo 1.

Il comando che ho lanciato e che ha funzionato come un incantesimo è stato quello suggerito da Ryan Steven sul suo blog.

Provare per credere:

wp post list --field=ID --post_type=product --posts_per_page=2000 | xargs wp post delete --force
Il comando che ho lanciato sul terminale dell’hosting in questione. Come è possibile vedere ho usato direttamente il file .phar.

Se avete il sito su hosting che non ha accesso alla console sappiate che potete usare lo stesso la cli, ma facendo un accrocchio che spero di avere modo di illustrarvi in qualche altro post in futuro.

Conclusioni

Se siete utenti smaliziati, dovete avere a che fare con operazioni ripetitive, containers, orchestratori (tipo kuberneetes), allora vi consiglio di studiare l’uso della CLI (proposta come migliore soluzione, la numero 3).

Se non siete utenti esperti state lontano come la peste dalle query (soluzione 2) e lanciatevi sulla soluzione 1, specie se la cancellazione massiva è da fare una tantum.

Dokan woocommerce, where is {site_name} in email placeholder

Sometimes can happen that the email sent through woocommerce have incorrect data. Where are placeholders data stored, for instance {site_name}, {site_address}, {order_number}, used in Dokan email templates? And, how to modifify {site_name} placeholder?

In my case {site_name} placeholder value was referring to an old site name, still present after a migration, due to this I bumped into the necessity of change placeholder value.

Uno screenshot del file wp-config.php dove è presente il prefisso del nome delle tabelle del database.
A screenshot WordPress wp-config.php file, where the database table prefix is defined.

To get the job done I was obliged to do the modification at mariadb/mysql database level. More specifically “{site_name}” was defined in “PREFIX_options” table, where PREFIX is your database table prefix defined in wp-config.php file at installation time.

The option to find out in my case was “woocommerce_email_from_name“, that represents {site_name} placeholder in Dokan email templates.

I came across it through phpmyadmin search functionality, searching for the name, the wrong one I want to replace, appearing on the email sent to users.

HINT!

The aim of this post is to explain how to replace Dokan email template placeholders ({site_name}), if you are trying to customize Dokan email templates, you can check out this link: https://wedevs.com/docs/dokan/tutorials/customize-e-mail-template/

An example of how Dokan is translating placeholder into bare text is the method trigger, defined in plugins/dokan-pro/modules/rma/includes/emails/class-dokan-rma-send-coupin-email.php php file:

<?php
/**
     * Trigger the sending of this email.
     *
     * @param int $product_id The product ID.
     * @param array $postdata.
     */
    public function trigger( $coupon, $data ) {
        if ( ! $this->is_enabled() || ! $this->get_recipient() ) {
            return;
        }

        $this->object = $coupon;

        if ( $data ) {
            $coupon_id      = isset( $data['request_id'] ) ? $data['request_id'] : '';
            $vendor_id      = isset( $data['refund_vendor_id'] ) ? $data['refund_vendor_id'] : '';
            $vendor         = dokan()->vendor->get( $vendor_id );
            $customer_email = $coupon->get_email_restrictions();
            $customer_email = is_array( $customer_email ) ? $customer_email[0] : $customer_email;
        }

        $this->find['site_name']      = '{site_name}';
        $this->find['vendor_name']    = '{vendor_name}';

        $this->replace['site_name']   = $this->get_from_name();
        $this->replace['vendor_name'] = $vendor->get_name();
        $this->replace['coupon_id']   = $coupon_id;

        $this->setup_locale();
        $this->send( "{$customer_email}, {$this->get_recipient()}", $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
        $this->restore_locale();
    }

In particoular, pay attention at these two lines:

...
$this->find['site_name']      = '{site_name}';
...
$this->replace['site_name']   = $this->get_from_name();
...

The get_from_name method is defined in a superclass and is the function in which the substitution is done.

I strongly suggest you to explore source code through Visual Studio Code or an equivalent product, to better understand how your specific case works.

Fell free to post a comment to submit your case.

Dump calendars from Zimbra command line

An easy php snippet to produce the commands necessary to backup Zimbra calendars

Recently I bumped into a migration from Zimbra to another mail system provider; this migration regarded all accounts including, of course, them calendars, contacts and task.

We decided to use a tool named Transend that was among the suggested by AWS support, but for non interesting reasons, we also needed to get the calendars out of Zimbra.

Via zimbra cli it is very easy to do that:

/opt/zimbra/bin/zmmailbox -z -m yourmail@example.com getRestURL "/Calendar/?fmt=ics" > /tmp/Calendars/youremail.ics

But … I had a lot accounts to care about, nevertheless I am normally very lazy in repeating dummy commands.
So I decided to write this little PHP snippet to produce the rows I need and than copy and past the result on zimbra cli.

The Script

Take a look at the following example with 4 accounts:

<?php

/**
 * You can of course use a simpler array,
 * but the file name with a @ is not the best you can have in your life.
 *  
 * */
$accounts = [
'peter.pan'=>'peter.pan@example.com',
'bruce.banner'=>'bruce.banner@example.com',
'clark.kent'=>'clark.kent@example.com',
'mario.merola'=>'mario.merola@example.com',
];

foreach($accounts as $account => $email){
	echo "/opt/zimbra/bin/zmmailbox -z -m $email getRestURL \"/Calendar/?fmt=ics\" > /tmp/Calendars/$account.ics" . "\n";
}

the result will be:

/opt/zimbra/bin/zmmailbox -z -m peter.pan@example.com getRestURL "/Calendar/?fmt=ics" > /tmp/Calendars/peter.pan.ics
/opt/zimbra/bin/zmmailbox -z -m bruce.banner@example.com getRestURL "/Calendar/?fmt=ics" > /tmp/Calendars/bruce.banner.ics
/opt/zimbra/bin/zmmailbox -z -m clark.kent@example.com getRestURL "/Calendar/?fmt=ics" > /tmp/Calendars/clark.kent.ics
/opt/zimbra/bin/zmmailbox -z -m mario.merola@example.com getRestURL "/Calendar/?fmt=ics" > /tmp/Calendars/mario.merola.ics

Now I am ready to copy and paste those lines on my Zimbra terminal and say “have a good week-end!” to the world.

Apache2 certificates does not match

If your Apache2 is blocked (status inactive) because of SSL certificates’ issue, this article can be the solution you are looking for.

You can occasionally stumble in a problem of certificates mismatching, in other words you are probably using a certificate that is not related with the given private key.

It can happen especially if you are renewing your certificates manually, more over you can experience this issue when you use Certera or more generally letsencrypt certificates.

The symptoms are that the webserver is not active (inactive) and all your virtual hosts are not reachable on both 80 and 443 ports.

Furthermore the web server (apache2 in our case) is not up and running.

How to deal with that?

Simple, use the right certificates!

How can I be sure about the certificate mismatching?

Simple again 🙂

You can use this commands

openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in privkey.pem | openssl md5

You will be ok when the resulting md5 string is the same for both certificates.

Useful details and references

Note that your certificate can have .crt extension rather than the .pem one.
Also the privkey.pem can have a different name with .key extension.

To check if your apache2 is working correctly (i.e. status active) you can run this command:

systemctl status apache2

To check if there is some error you can use the command

tail -f /var/log/apache2/*.log

The solution has been ispired by this very useful article on Digicert.com.