Vai al contenuto

Invio eMail da sistema SlimLine

Home Forum Programmazione IEC 61131 (LogicLab) Invio eMail da sistema SlimLine

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #82276
    Anonimo
    Inattivo

    Ho provato a scrivere questo programma per mandare un’email dal PLC SlimLine collegato con internet.

    VAR
        i : UDINT; (* Variabile ausiliaria *)
        EmailImpulso : BOOL := FALSE;
        EmailInviata : BOOL := FALSE;
        Fp : eFILEP; (* Puntatore al file *)
        EmailDestinatario : STRING[ 50 ] := '[email protected]';
        EmailMittente : STRING[ 50 ] := '[email protected]';
        SMTPServer : STRING[ 50 ] := 'smtp.office365.com';
        EmailUsername : STRING[ 50 ] := '[email protected]';
        EmailPassword : STRING[ 50 ] := 'password';
        EmailTesto : STRING[ 256 ];
        TCPClient : SysTCPClient; (* Gestione TCP client *)
    END_VAR
    
        // -------------------------------------------------------------------------
        // INITIALIZATION
        // -------------------------------------------------------------------------
    
        IF (SysFirstLoop) THEN
            TCPClient.PeerAdd:=ADR(SMTPServer); //Indirizzo IP Server SMTP
            TCPClient.PeerPort:=587; //Porta SMTP
            TCPClient.LocalAdd:=ADR('0.0.0.0'); //Indirizzo locale
            TCPClient.LocalPort:=0; //Porta locale
            TCPClient.FlushTm:=50; //Tempo di pulizia (mS)
            TCPClient.LifeTm:=20; //Tempo di vita connessione (S)
            TCPClient.RxSize:=256; //Buffer RX
            TCPClient.TxSize:=256; //Buffer TX
        END_IF;
    
        // Gestione TCP Client
    
        TCPClient(Connect:=TRUE); //Connessione al server SMTP
        Fp:=TCPClient.File; //Puntatore al file
    
        // -------------------------------------------------------------------------
        // CREAZIONE DEL MESSAGGIO EMAIL
        // -------------------------------------------------------------------------
    
        IF EmailImpulso AND SysFIsOpen(Fp) THEN
    
            // Autenticazione SMTP.
    
            i := SysFWrite(Fp, ADR('EHLO smtp.office365.com' + CHR(13) + CHR(10)), Sysstrlen('EHLO smtp.office365.com' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('AUTH LOGIN' + CHR(13) + CHR(10)), Sysstrlen('AUTH LOGIN' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR(SysBase64Encode(EmailUsername) + CHR(13) + CHR(10)), Sysstrlen(SysBase64Encode(EmailUsername) + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR(SysBase64Encode(EmailPassword) + CHR(13) + CHR(10)), Sysstrlen(SysBase64Encode(EmailPassword) + CHR(13) + CHR(10)));
    
            // Composizione dell'email.
    
            i := SysFWrite(Fp, ADR('MAIL FROM:<'+ EmailMittente +'>' + CHR(13) + CHR(10)), Sysstrlen('MAIL FROM:<'+ EmailMittente +'>' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('RCPT TO:<'+ EmailDestinatario +'>' + CHR(13) + CHR(10)), Sysstrlen('RCPT TO:<'+ EmailDestinatario +'>' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('DATA' + CHR(13) + CHR(10)), Sysstrlen('DATA' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('Subject: ⚠️ Allarme Attivo' + CHR(13) + CHR(10)), Sysstrlen('Subject: ⚠️ Allarme Attivo' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('From: '+ EmailMittente + CHR(13) + CHR(10)), Sysstrlen('From: '+ EmailMittente + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('To: '+ EmailDestinatario + CHR(13) + CHR(10)), Sysstrlen('To: '+ EmailDestinatario + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR(EmailTesto + CHR(13) + CHR(10) + '.' + CHR(13) + CHR(10)), Sysstrlen(EmailTesto + CHR(13) + CHR(10) + '.' + CHR(13) + CHR(10)));
            i := SysFWrite(Fp, ADR('QUIT' + CHR(13) + CHR(10)), Sysstrlen('QUIT' + CHR(13) + CHR(10)));
            EmailInviata := TRUE;
        END_IF;
    
        // Reset impulso dopo invio.
    
        IF EmailInviata THEN EmailImpulso := FALSE; END_IF;
    
    // [End of file]

    Mi potete dire se è corretto… Quando lo compilo mi da questo errore

    ST_SMTPClient(50) - errore S1298:  Espressione di indirizzo non valida
    #82280
    Sergio Bertana
    Amministratore del forum

    Per inviare l’eMail dal un sistema SlimLine devi utilizzare il FB EMailSend, puoi utilizzare l’esempio ST_EMailSend in fondo alla pagina. Colgo l’occasione della domanda per evidenziare alcuni punti.

    • L’invio eMail senza crittografia TLS ormai non è quasi piu accettato dai servers SMTP, nel’esempio ho utilizzato Virgilio che sembra ancora accettare invio non crittografato.
    • Per poter inviare eMail su qualunque server SMTP occorre utilizzare la crittografia come riportato nell’esempio ST_TLSEMailSend.
    • In alternativa al FB SysTLSClient eseguire un programma mail relay su un PC, SlimLine invia al relay l’eMail non crittografata ed il relay l’inoltrerà al server pubblico crittografato.
    • Per utilizzare come server di inoltro GMail occorre utilizzare la password generata dal servizio Password per le app. Rimando alla lettura di questa nota applicativa.
    #82287
    Sergio Bertana
    Amministratore del forum

    Venendo al tuo programma vediamo le inesattezze, ce ne sono molte…

    • Il TCPClient è sempre in connessione. Occorre connettersi solo quando si invia la eMail e sconnettersi al termine dell’invio. Se vedi nei ns esempi il comando di Connect è gestito dal FB di invio eMail TCPClient(Connect:=Mailer.Connect).
    • Esegui un invio a raffica di tutti i comandi HELO, username, password. L’invio dei dati và fatto in risposta alle richieste del server.
    • Terminato l’invio occore atendere l’Ok dal server e solo dopo inviare il comando di QUIT.
    • Inviato il comando di QUIT occorre chiudere la connessione con il server.
    • Ho visto che hai scritto SysFWrite e non Sysfwrite, siccome non hai errori di compilazione immagino che non hai settato il controllo maiuscole/minuscole nel progetto.

    Riguardo all’errore:

    i := Sysfwrite(Fp, ADR('EHLO smtp.office365.com' + CHR(13) + CHR(10)), Sysstrlen('EHLO smtp.office365.com' + CHR(13) + CHR(10)));

    La funzione Sysfwrite, ha come 1° parametro l’indirizzo della stringa da inviare, come 2° parametro la lunghezza della stringa, come 3° parametro il numero di stringhe e come 4° parametro lo stream di comunicazione a cui inviare i dati. Quindi và scritta in questo modo:

    eTO_JUNK(Sysfwrite(ADR('EHLO smtp.office365.com$r$n'), Sysstrlen(ADR('EHLO smtp.office365.com$r$n')), 1, Fp));

    Ho sostituito i:= con la nuova definizione eTO_JUNK. Ho sostituito CHR(13) e CHR(10) con le rispettive codifiche $r e $n vedi articolo.

    Attenzione alla capienza del buffer dello stream di comunicazione, nel TCP client hai definito il buffer di trasmissione a 256 caratteri ma la somma delle tue scritture Sysfwrite credo abbia dimensione maggiore quindi i caratteri che non ci stanno nel buffer vengono scartati.

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.