Inviare Email da Sql Server 2012

giovedì 19 dicembre 2013 - 15.30

zseven Profilo | Senior Member

Ciao ragazzi,
come da oggetto vorrei riuscire ad automatizzare questo processo.

In pratica sul server ho un DTS (SSIS) che va ad aggiornare le quantità degli articoli nella relativa tabella.
Se un articolo passa ad una quantità superiore a zero, ed un utente generico ha immesso la sua email per essere avvisato non appena la quantità è di nuovo disponibile,
vorrei essere in grado di inviargli una email.

Quindi in pratica dovrei poter leggere le email presenti nella tabella email_avvisi, e successivamente effettuare l'invio per quelle email
che vogliono info su quell'articolo specifico.

Non so se sono riuscito a spiegarmi correttamente, spero di sì ;)

Grazie mille

alx_81 Profilo | Guru

>Ciao ragazzi,
Ciao

>Se un articolo passa ad una quantità superiore a zero, ed un
>utente generico ha immesso la sua email per essere avvisato non
>appena la quantità è di nuovo disponibile,
>vorrei essere in grado di inviargli una email.
>Quindi in pratica dovrei poter leggere le email presenti nella
>tabella email_avvisi, e successivamente effettuare l'invio per
>quelle email che vogliono info su quell'articolo specifico.
quindi, se ho capito bene, scorri gli articoli, e, in base a certe logiche sull'utente, cerchi l'email sulla tabella relativa (email di chi è "sottoscritto" per così dire) e poi invii email.
Se è questo quello che vuoi, il SSIS già farà la maggior parte del lavoro immagino..
Ti manca solo inviare l'email? Dove sei fermo?

>Grazie mille
di nulla!
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Sì in pratica L'SSIS confronterà la quantità del prodotto in base all'id articolo inserito nella tabella degli avvisi,
e se vede che è superiore a 0 allora deve recuperare i vari record (e quindi gli indirizzi email) e fare l'invio.

Per ora riuscirei a fare (ancora non ho praticamente avviato il tutto) fino all'SQL STATEMENT per l'oggetto "attività esegui SQL"
così da recuperare tutti gli indirizzi email.

Ma dopo sono bloccato, anche perché questo strumento fino ad ora l'ho usato solo per eseguire UPDATE,
quindi l'operazione finiva lì. Adesso non saprei come recuperare questi record(email) e poi far partire
le email.

E' da poco che mi sono avvicinato a SSIS ma lo trovo meraviglioso, si riescono ad automatizzare in pochi
minuti dei processi che fino a poco tempo fa impiegavo ore ed ore a fare con lunghissime procedure in .NET.

Grazie mille per l'aiuto!

alx_81 Profilo | Guru

>Ma dopo sono bloccato, anche perché questo strumento fino ad
>ora l'ho usato solo per eseguire UPDATE,
>quindi l'operazione finiva lì. Adesso non saprei come recuperare
>questi record(email) e poi far partire
>le email.
Ecco come lo farei:

1) Creazione di un Execute SQL task che popola una variabile di tipo Object (Execute SQL task impostato come "ritorna Resultset")
2) Foreach che scorre ADO su quella variabile riempita
3) Mapping di ogni campo che ti serve su variabili di scope foreach
4) Eliminazione (logica o fisica) del record gestito

E per questo servono:
- SMTP connection al tuo SMTP server
- Connection manager per SQL

L'idea è quella allegata in questa immagine:

310x501 17Kb


Spero possa esserti di aiuto,
ciao

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Un Ottimo aiuto direi!
Devo però capire meglio alcune cose:

[b]1) Creazione di un Execute SQL task che popola una variabile di tipo Object (Execute SQL task impostato come "ritorna Resultset")[/b]
Questa dovrebbe essere una semplice SELECT che mi recupera ad esempio email e idprodotto, giusto?
Per il resulset imposto "set dei risultati completo"?

[b]2) Foreach che scorre ADO su quella variabile riempita[/b]
Ok ho visto l'oggetto ma non l'ho mai usato, vediamo se è semplice

[b]3) Mapping di ogni campo che ti serve su variabili di scope foreach[/b]
Questo non l'ho capito bene...

[b]4) Eliminazione (logica o fisica) del record gestito[/b]
Questo sarà un semplice update (preferisco sempre l'eliminazione logica) che vista l'invio effettuato per quel prodotto e per quell'email.

[b]E per questo servono:
- SMTP connection al tuo SMTP server[/b]
Ok questo lo devo configurare su Management di Sql Server 2012 Business Edition

[b]- Connection manager per SQL[/b]
Questa sarebbe la connessione che imposto per creare una nuova attività con SSIS, giusto?

Grazie mille!

alx_81 Profilo | Guru

>Per il resulset imposto "set dei risultati completo"?
immagini di seguito:

967x359 18Kb


659x158 5Kb


>[b]2) Foreach che scorre ADO su quella variabile riempita[/b]
>Ok ho visto l'oggetto ma non l'ho mai usato, vediamo se è semplice
immagini di seguito:

717x260 10Kb


>[b]3) Mapping di ogni campo che ti serve su variabili di scope foreach[/b]
>Questo non l'ho capito bene...
immagina che il foreach prende RECORD PER RECORD con, ad esempio, 2 campi.. ecco, nella sezione Mapping dovrai mappare ogni campo alla variabile per gestire fuori il record corrente:

579x197 8Kb


>[b]4) Eliminazione (logica o fisica) del record gestito[/b]
>Questo sarà un semplice update (preferisco sempre l'eliminazione
>logica) che vista l'invio effettuato per quel prodotto e per
>quell'email.
ok perfetto.

>[b]E per questo servono:
>- SMTP connection al tuo SMTP server[/b]
>Ok questo lo devo configurare su Management di Sql Server 2012
no no, nel SSIS, nella sezione Connection Managers, puoi creare una connessione SMTP, non ti serve il database mail, basta che il server veda l'smtp.

>[b]- Connection manager per SQL[/b]
>Questa sarebbe la connessione che imposto per creare una nuova attività con SSIS, giusto?
diciamo che è la (o le) connessione che ti serve per colloquiare con SQL Server. SSIS è fatto per andare in cross platform, e, se devi connetterti a SQL, ti servirà una connessione a SQL.
Vedrai che quando fai il SQL task iniziale, te la fa creare se non ce l'hai già
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Tutto chiarissimo, sei un grande!

Appena riesco a fare il tutto ti avviso, così chiudiamo il topic per chi potesse averne bisogno!

Grazie ancora ;)

alx_81 Profilo | Guru

>Tutto chiarissimo, sei un grande!
grazie
comunque guardati un po' i primi post del mio blog su dotnethell.. usavo SSIS fin dalla sua nascita, anche se ormai non lo utilizzo più, l'ho seguito a lungo.
Magari qualche post può servirti..
Anche gli articoli, che trovi qui, potranno esserti di aiuto:
http://www.alessandroalpi.net/articoli.aspx
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Ciao alx,
stavo finalmente provando la procedura che mi hai gentilmente spiegato, ma mi sono bloccato in un punto, precisamente all'invio email.

Se vedi il file allegato, ho aggiunto il task per l'invio email ed ho impostato i parametri creandone uno nuovo dal nome uguale alla variabile mappata nel ciclo, e precisamente
User::Email
infatti poi mi ritrovo modificato anche la sezione Espressioni dopo che ho impostato i parametri.

Se provo però a fare l'avvio dell'attività lui mi restituisce errore dicendo che non è presente un indirizzo email corretto.


1680x1050 106Kb


Sai dirmi in cosa sbaglio?

Grazie mille!
Guido

alx_81 Profilo | Guru

>Se provo però a fare l'avvio dell'attività lui mi restituisce
>errore dicendo che non è presente un indirizzo email corretto.
>Sai dirmi in cosa sbaglio?
credo che quella variabile sia vuota (di solito accade così).
Metti un breakpoint e fermati sull'invio dell'email.
Poi apri la finestra LOCAL e vedi quanto vale la variabile User::Email.
Da lì puoi capire almeno se è valorizzata o meno.

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Grazie, avevo risolto modificando il valore di DElayValidation, spero sia cmq corretto.

Adesso l'invio lo riesco a fare.
In verità ho notato che piuttosto che fare una semplice query per determinare le email a cui inviare dovrei eseguire tutto un codice che ho scritto in una funzione, che ti riporto di seguito.

C'è un modo per eseguire il codice ed in base al risultato poi fare determinate operazione?
GRAZIE!

Questa è la funzione che ho scritto:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

alx_81 Profilo | Guru

>C'è un modo per eseguire il codice ed in base al risultato poi fare determinate operazione?
se le logiche sono basate sui dati residenti su sql, potresti fare una stored procedure.. E la stored procedure poi ti torna i dati che ti servono boxando, di fatto, il codice della logica.
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

sì i dati sono su sql, ma come faccio ad utilizzare la stessa logica con le stored?

Cioè nella funzione io ho cicli, condizionali, array etc etc...

alx_81 Profilo | Guru

>sì i dati sono su sql, ma come faccio ad utilizzare la stessa logica con le stored?
>Cioè nella funzione io ho cicli, condizionali, array etc etc...
considera che è un linguaggio procedurale, quindi fai le stesse cose..
Tuttavia sto guardando il codice per capire se è possibile ragionare come sql dovrebbe fare, ovvero a set di informazioni, evitando i cicli.
Torno da te fra poco.


Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

alx_81 Profilo | Guru

>sì i dati sono su sql, ma come faccio ad utilizzare la stessa
>logica con le stored?
dimmi se lo script può essere ok, incollalo in una query (tanto gira sul tempdb):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5