sp_processmail (Transact-SQL)

Utilizza le stored procedure estese xp_findnextmsg, xp_readmail e xp_deletemail per elaborare i messaggi di posta elettronica presenti in Posta in arrivo per MicrosoftSQL Server. Ogni messaggio deve contenere una sola query. Questa stored procedure utilizza la stored procedure estesa xp_sendmail per restituire al mittente il set di risultati sotto forma di allegato.

Nota importanteImportante

Evitare di utilizzare questa stored procedure. La stored procedure sp_processmail elabora le informazioni arrivate per posta elettronica da origini sconosciute e può essere sfruttata per introdurre malware nell'ambiente. È necessario assicurarsi di convalidare il codice prima di eseguirlo. Questa stored procedure è disponibile per compatibilità con le versioni precedenti, ma non viene installata finché non si attiva SQL Mail.

[!NOTA]

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Evitare di utilizzare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

sp_processmail [ [ @subject = ] 'subject' ] 
     [ , [ @filetype = ] 'filetype' ] 
     [ , [ @separator = ] 'separator' ] 
     [ , [ @set_user = ] 'user' ] 
     [ , [ @dbuse = ] 'dbname' ]

Argomenti

  • [ @subject = ] 'subject'
    Riga dell'oggetto che identifica i messaggi di posta che dovranno essere elaborati come messaggi con query da SQL Server. subject è di tipo varchar(255) e il valore predefinito è NULL. Se si specifica questo argomento, sp_processmail elabora solo i messaggi con l'oggetto corrispondente al valore dell'argomento. Per impostazione predefinita SQL Server elabora tutti i messaggi di posta elettronica come se contenessero query.

  • [ @filetype = ] 'filetype'
    Estensione di file da utilizzare quando il set di risultati della query viene inviato al mittente del messaggio sotto forma di allegato. filetype è di tipo varchar(3) e il valore predefinito è "'txt".

  • [ @separator = ] 'separator'
    Separatore di colonna, ovvero carattere di terminazione del campo, per ogni colonna del set di risultati. Queste informazioni vengono passate alla stored procedure estesa xp_sendmail per restituire il set di risultati al mittente del messaggio. separator è di tipo varchar(3) e il valore predefinito è il carattere di tabulazione, che in questo caso speciale viene utilizzato tra colonne.

  • [ @set_user = ] 'user'
    Contesto di protezione in cui deve essere eseguita la query. user è di tipo varchar(132) e il valore predefinito è guest.

  • [ @dbuse = ] 'dbname'
    Contesto del database in cui deve essere eseguita la query. dbname è di tipo varchar(132) e il valore predefinito è master.

Valori restituiti

0 (esito positivo) o 1 (esito negativo)

Set di risultati

Nessuno

Osservazioni

I messaggi di posta elettronica devono avere come testo del messaggio una sola query di SQL Server valida. sp_processmail gestisce solo i messaggi non letti. I risultati della query vengono inviati al mittente del messaggio e per conoscenza a tutti gli utenti della posta elettronica specificati nella riga CC del messaggio originale. Dopo l'elaborazione, i messaggi vengono eliminati dalla Posta in arrivo. Se al server vengono inviati spesso messaggi di posta elettronica, è necessario eseguire sp_processmail di frequente. Se si desidera che la posta elettronica venga elaborata regolarmente, è possibile utilizzare SQL Server Agent per pianificare un processo per sp_processmail. In tal modo i messaggi verranno elaborati in base alla frequenza specificata e verrà registrato un messaggi informativo con il numero delle query elaborate nella cronologia dei processi.

I risultati vengono inviati come file allegato. Il nome completo del file inviato è composto da "Sql" seguito da una stringa di numeri casuali e dall'estensione specificata, ad esempio Sql356.txt.

Nota importanteImportante

Per associare un'icona appropriata al messaggio di posta elettronica, verificare che l'associazione del tipo di file sia corretta. Per definire un'associazione di file, fare doppio clic su Risorse del computer sul desktop e quindi scegliere Opzioni cartella dal menu Strumenti. Nella scheda Tipi di file della finestra di dialogo Opzioni cartella specificare l'applicazione da utilizzare per aprire il file.

È possibile impostare processi sp_processmail distinti per query in database diversi. Si potrebbe, ad esempio, adottare la convenzione in base a cui l'oggetto delle query da eseguire nel database AdventureWorks deve essere "SQL:AdventureWorks". Si potrebbe quindi eseguire sp_processmail specificandoSQL:AdventureWorks per subject e AdventureWorks per dbname. Altri raggruppamenti e query di database possono presentare strutture di formattazione diverse. Per le attività di distribuzione, ad esempio, si potrebbe utilizzare SQL:distribution per subject e distribution per dbname. Per queste attività è possibile creare processi pianificati tramite SQL Server Agent.

La stored procedure di sistema sp_processmail può essere personalizzata in vari modi: recuperando il testo della procedura con la stored procedure di sistema sp_helptext, modificando il codice Transact-SQL e creando una nuova procedura personalizzata. Le modifiche che è possibile apportare sono le seguenti:

  • Elaborare solo determinati tipi di messaggi personalizzati tramite l'esecuzione della stored procedure estesa xp_findnextmsg con il parametro @type.

  • Contrassegnare il messaggio come letto (read) senza eliminarlo al termine dell'elaborazione (eseguire xp_readmail una seconda volta impostando peek su false).

  • Inviare i risultati della query nel corpo del messaggio di posta elettronica chiamando xp_sendmail con attach_result impostato su false e rimuovendo il parametro attachments.

  • Impostare il contesto di protezione per l'esecuzione della query in un contesto utente basato sul mittente del messaggio. Se i nomi utente di posta elettronica corrispondono ai nomi utente di SQL Server, la modifica consiste semplicemente nel modificare la chiamata a xp_sendmail in modo da utilizzare set_user = @originator. Se i nomi utente di posta elettronica non sono nomi utente validi di SQL Server, ad esempio se contengono spazi vuoti, è possibile eseguire una ricerca nella tabella oppure una sostituzione di caratteri in modo da ottenere il nome utente di SQL Server appropriato da passare a xp_sendmail.

Autorizzazioni

Solo i membri del ruolo predefinito del server sysadmin possono eseguire questa procedura.

Esempi

Nell'esempio seguente, tutti i messaggi in Posta in arrivo vengono elaborati come query nel database AdventureWorks. I set di risultati vengono restituiti al client in formato CSV (file con valori delimitati da virgole).

EXEC sp_processmail
    @filetype = 'CSV'
    ,@separator = ','
    ,@dbuse = 'AdventureWorks';