xp_readmail (Transact-SQL)

Legge un messaggio di posta elettronica dalla posta in arrivo di SQL Mail. Questa procedura viene utilizzata da sp_processmail per elaborare tutti i messaggi di posta elettronica nella posta in arrivo di 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

xp_readmail [ [ @msg_id= ] 'message_id' ]
     [ , [ @type= ] 'type' [ OUTPUT ] ] 
     [ , [ @peek= ] 'peek' ]
     [ , [ @suppress_attach= ] 'suppress_attach' ]
     [ , [ @originator= ] 'sender' OUTPUT ]
     [ , [ @subject= ] 'subject' OUTPUT ]
     [ , [ @message= ] 'message' OUTPUT ]
     [ , [ @recipients= ] 'recipients [ ;...n ]' OUTPUT ]
     [ , [ @cc_list= ] 'copy_recipients [ ;...n ]' OUTPUT ]
     [ , [ @bcc_list= ] 'blind_copy_recipients [ ;...n ]' OUTPUT ]
     [ , [ @date_received= ] 'date' OUTPUT ]
     [ , [ @unread= ] 'unread_value' OUTPUT ]
     [ , [ @attachments= ] 'attachments [ ;...n ]' OUTPUT ])
     [ , [ @skip_bytes= ] bytes_to_skip OUTPUT ]
     [ , [ @msg_length= ] length_in_bytes OUTPUT ]
     [ , [ @originator_address= ] 'sender_address' OUTPUT ] ]

Argomenti

  • [ @msg_id = ] 'message_id'
    ID del messaggio da leggere. message_id è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @type = ] 'type'
    Tipo di messaggio da restituire in base alla definizione MAPI:

    IP[ M|C ].Vendorname.subclass

    Se utilizzato nell'input, deve definire il tipo di un messaggio specifico. type viene ignorato nell'input se message_id è NULL. type è di tipo varchar(255) e il valore predefinito è NULL. SQL Mail supporta i tipi di messaggio IPM e IPC.

  • OUTPUT
    Quando si specifica questo argomento, il valore del parametro specificato viene inserito nel parametro di output.

  • [ @peek = ] 'peek'
    Indica se SQL Server restituisce il messaggio senza modificare lo stato di lettura dei messaggi di posta elettronica. peek è di tipo varchar(5) e il valore predefinito è FALSE. Se è impostato su FALSE, la posta elettronica viene considerata come già letta. Se è impostato su TRUE, la posta elettronica viene considerata come ancora da leggere.

  • [ @suppress_attach = ] 'suppress_attach'
    Specifica se evitare la visualizzazione degli allegati di posta elettronica. suppress_attachè di tipo varchar(255) e il valore predefinito è FALSE. Se è impostato su TRUE, SQL Server impedisce la creazione di file temporanei quando xp_readmail legge un messaggio con allegati. Se è impostato su FALSE, quando si leggono messaggi con allegati, la creazione di file temporanei non viene impedita.

  • [ @originator = ] 'sender'
    Indirizzo restituito per il mittente. sender è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @subject = ] 'subject'
    Oggetto del messaggio di posta elettronica restituito. subject è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @message = ] 'message'
    Testo del messaggio di posta elettronica o corpo del messaggio restituito. message è di tipo text e non prevede alcun valore predefinito.

  • [ @recipients = ] 'recipients [ ;... n] '
    Elenco dei destinatari del messaggio di posta elettronica da restituire. I nomi dei destinatari sono separati da un punto e virgola (
    ;
    ). recipient_list è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @cc_list = ] 'copy_recipients [ ;... n] '
    Elenco dei destinatari in copia del messaggio di posta elettronica da restituire. I nomi dei destinatari sono separati da un punto e virgola (
    ;
    ). cc_list è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @bcc_list = ] 'blind_copy_recipients[ ;... n] '
    Elenco delimitato da punti e virgola dei destinatari inclusi nel campo Ccn del messaggio di posta elettronica da restituire. I nomi dei destinatari sono separati da un punto e virgola (
    ;
    ). bcc_list è di tipo varchar(255) e non prevede alcun valore predefinito. Se il server di posta elettronica non supporta valori per il campo Ccn, blind_copy_recipients non è specificato.

  • [ @date_received = ] 'date'
    Data restituita del messaggio di posta elettronica. date è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @unread = ] 'unread_value'
    Indica se il messaggio è stato già impostato come non letto (true) o come letto (false). unread_value è di tipo varchar(5) e il valore predefinito è TRUE.

  • [ @attachments = ] 'attachments [ ;... n] '
    Elenco delle directory temporanee per gli allegati del messaggio restituito. I percorsi temporanei sono separati da un punto e virgola (
    ;
    ). attachments è di tipo varchar(255) e non prevede alcun valore predefinito.

  • [ @skip_bytes = ] bytes_to_skipOUTPUT
    Se nell'input viene passato un valore diverso da 0, questo parametro specifica il numero di byte da ignorare prima di leggere i successivi 255 byte (numero massimo) del messaggio nel parametro di output body_of_message. Quando si utilizza bytes_to_skip, body_of_message include la parte successiva del messaggio e bytes_to_skip restituisce informazioni dal successivo punto di inizio del messaggio, ovvero il valore precedente di bytes_to_skip più la lunghezza di message. bytes_to_skip è di tipo int e il valore predefinito è 0.

  • [ @msg_length = ] length_in_bytesOUTPUT
    Lunghezza totale del messaggio espressa in byte. Se utilizzato con bytes_to_skip in una stored procedure, questo parametro consente la lettura dei messaggi in blocchi di 255 byte. length_in_bytes è di tipo int.

  • [ @originator_address = ] 'sender_address'
    Indirizzo di posta elettronica risolto dal mittente del messaggio. sender_address è di tipo varchar(255) e non prevede alcun valore predefinito.

Valori restituiti

0 (esito positivo) o 1 (esito negativo)

Set di risultati

xp_readmail restituisce un set di risultati con queste colonne.

Nome colonna

Descrizione

Originator

Mittente del messaggio di posta elettronica

Date Received

Data in cui è stato ricevuto il messaggio di posta elettronica

Recipients

Destinatari del messaggio

CC List

Utenti specificati nella riga Cc del messaggio di posta elettronica

BCC List

Utenti specificati nella riga Ccn del messaggio di posta elettronica

Subject

Oggetto del messaggio di posta elettronica

Messaggio

Corpo (testo) del messaggio

Unread

Indica se il messaggio non è stato letto

Attachments

Eventuali allegati del messaggio

Message ID

ID del messaggio

Type

Tipo di messaggio

Osservazioni

Qualsiasi errore, ad eccezione degli errori di parametro non valido, viene inserito nel registro applicazioni di Microsoft Windows.

È possibile utilizzare xp_readmail in due modi diversi:

  • Restituire tutti i messaggi della posta in arrivo come set di risultati per il client.

  • Leggere un singolo messaggio dalla posta in arrivo.

Per restituire il contenuto della posta in arrivo come set di risultati per il client, non specificare alcun parametro di input.

Se non si modifica l'impostazione predefinita per il parametro suppress_attach in TRUE, è possibile che vengano generati due problemi di protezione per gli allegati.

  • Se due utenti condividono la stessa directory temporanea e si connettono allo stesso computer, saranno in grado di visualizzare gli allegati dell'altro utente. È possibile determinare la posizione in cui vengono memorizzati gli allegati e se due utenti possono condividere la stessa directory temporanea modificando la variabile dell'output attachments.

  • xp_deletemail non elimina gli allegati. Per tale motivo sarà necessario eliminare ogni allegato manualmente.

Per leggere un singolo messaggio dalla cartella Posta in arrivo , è necessario specificare un parametro message_id valido restituito da xp_findnextmsg come parametro di input per xp_readmail. È possibile specificare peek e suppress_attach come parametri di input per definire la modalità di lettura del messaggio. Quando si utilizzano peek e suppress_attach con questo metodo, tutti gli altri parametri diventano parametri di output facoltativi contenenti informazioni specifiche relative al messaggio da leggere.

È possibile visualizzare un esempio dell'utilizzo di xp_findnextmsg come parametro di input per xp_readmail eseguendo il comando seguente:

sp_helptext 'sp_processmail';

Quando viene utilizzata per leggere un messaggio singolo, xp_readmail è in grado di leggere un testo di lunghezza maggiore di 255 byte in segmenti. Utilizzare length_in_bytes per leggere in segmenti diversi testi di messaggi maggiori di 255 byte. Se si utilizza length_in_bytes sia come parametro di input che come parametro di output, è possibile scrivere codice di ciclo per l'elaborazione dell'intero testo del messaggio. Nel codice seguente viene illustrato un esempio di un ciclo di questo genere, presupponendo che message_id sia impostato su un identificatore di messaggio valido restituito da xp_findnextmsg.

USE master;
GO

-- Set up variables.

DECLARE @status INT,
        @message_part VARCHAR(255),
        @msg_id VARCHAR(255),
        @message_length INT,
        @skip_bytes INT,
        @message VARCHAR(MAX) ;

-- Find the next message

EXEC @status = dbo.xp_findnextmsg
     @msg_id = @msg_id OUTPUT ;


-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.

IF (@status = 0  AND @msg_id IS NOT NULL)
BEGIN
   WHILE (1=1)
   BEGIN
        EXEC @status = dbo.xp_readmail
             @msg_id = @msg_id,
             @msg_length = @message_length OUTPUT,
             @skip_bytes = @skip_bytes OUTPUT,
             @message = @message_part OUTPUT ;

        IF @status <> 0 BREAK ;

        SET @message = ISNULL(@message, '') + @message_part ;

        PRINT @message_length ;
        PRINT @skip_bytes;

        IF @message_length = @skip_bytes BREAK ;

    END ;
    
    IF @status = 0
    BEGIN
       SELECT 'Message ID' = @msg_id, 'Message Body' = @message ;
    END ;
    ELSE
        SELECT 'Could not read message.' ;
END;

GO

Autorizzazioni

È richiesta l'appartenenza al ruolo predefinito del server sysadmin, ma è possibile concedere autorizzazioni EXECUTE ad altri utenti. Per motivi di protezione, è tuttavia consigliabile concedere le autorizzazioni per l'esecuzione di questa stored procedure solo ai membri del ruolo predefinito del server sysadmin.

Esempi

Nell'esempio seguente viene restituito lo stato di lettura di un messaggio. Nell'esempio viene inserito nella variabile locale @message\_id il valore di un ID messaggio restituito da xp_findnextmsg e tale valore viene quindi passato a xp_readmail.

USE master ;
GO

DECLARE @status INT,
    @msg_id VARCHAR(255),
    @originator VARCHAR(255),
    @cc_list VARCHAR(255),
    @subject VARCHAR(255),
    @query VARCHAR(8000);


-- Find the next message

EXEC @status = dbo.xp_findnextmsg
     @msg_id = @msg_id OUTPUT ;


-- If xp_findnextmsg completed successfully and
-- there is a message in the inbox, read the message.

IF (@status = 0  AND @msg_id IS NOT NULL)
BEGIN
    EXEC @status = dbo.xp_readmail
        @msg_id = @msg_id,
        @originator = @originator OUTPUT,
        @cc_list = @cc_list OUTPUT,
        @subject = @subject OUTPUT,
        @message = @query OUTPUT,
        @peek = 'TRUE',
        @suppress_attach = 'TRUE'

END;
GO