Invio eMail da sistema SlimLine
Home › Forum › Programmazione IEC 61131 (LogicLab) › Invio eMail da sistema SlimLine
- Questo topic ha 2 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 2 settimane, 1 giorno fa da
Sergio Bertana.
-
AutorePost
-
Maggio 16, 2025 alle 9:11 am #82276
Anonimo
InattivoHo 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
Maggio 16, 2025 alle 9:16 am #82280Sergio Bertana
Amministratore del forumPer 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.
Maggio 16, 2025 alle 9:32 am #82287Sergio Bertana
Amministratore del forumVenendo 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.