2010-08-18 4 views
11

J'ai une procédure SQL Server 2008 qui envoie un courrier électronique via sp_send_dbmail.Comment puis-je envoyer un e-mail en texte brut (avec des sauts de ligne) en utilisant sp_send_dbmail?

J'utilise le code suivant:

set @bodyText = (select 
         N'Here is one line of text ' + 
         N'It would be nice to have this on a 2nd line ' + 
         N'Below is some data: ' + 
         N' ' + 
         N' ' + 
         field1 + 
         N' ' + 
         field2 + 
         N' ' + 
         N'This is the last line' 
        from myTable) 

    EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'myProfile', 
     @recipients = @to, 
     @body = @bodyText, 
     @body_format = 'TEXT', 
     @subject = 'Testing Email' ; 

Mon myProfile est configuré pour utiliser le serveur smtp local, qui se traduit par un fichier EML dans c: \ Inetpub \ Mailroot \ file d'attente

Quand j'ouvre un de ces fichiers .eml (ug - la seule chose qui peut les ouvrir est Outlook Express, les regarder dans n'importe quoi d'autre montre juste le corps comme un blob encodé en base64.) On dirait que le rendu est HTML - donc je ne suis pas sûr si le problème est dans le client, ou

I J'ai essayé de mettre \ n dans le message, mais cela n'a pas fonctionné. Comment puis-je envoyer du texte en clair avec des sauts de ligne et vérifier que le résultat final semble correct? Par ailleurs, je ne peux pas vraiment envoyer l'email pour le tester avec de vrais clients email - corp. le réseau est verrouillé.

+0

l'une de ces réponses a-t-elle résolu votre problème? –

+0

@KM - oui. J'essaie de décider lequel accepter - le vôtre est plus élégant, et lit mieux, mais Martins fonctionne également. – chris

Répondre

7

Vous n'insérez pas de saut de ligne. Vous pouvez les incorporer directement dans un littéral de chaîne dans SQL Server comme ci-dessous.

SET @bodyText = (SELECT N'Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: 


' + field1 + N' 

' + field2 + N' 

' + N'This is the last line' 
       FROM myTable); 

Ou une approche plus ordonnée pourrait être

DECLARE @Template NVARCHAR(max) = 
N'Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: 

##field1## 

##field2## 

This is the last line'; 

SET @bodyText = (SELECT REPLACE(
        REPLACE(@Template, 
         '##field1##', field1), 
         '##field2##', field2) 
       FROM myTable); 

deux soulèvera une erreur si myTable contient plus d'une ligne que vous attribuez le résultat à une variable scalaire.

+0

Étonnamment, il le fait! En fait, je peux mettre des blocs entiers dans une paire de guillemets. – chris

+0

rend le code vraiment génial, je le faisais de cette façon. Cependant, j'ai trouvé le 'CHAR (13) + CHAR (10)' fonctionne mieux avec des requêtes indentantes et d'autres codes. –

+0

Oui ça ne marche pas très bien avec indentation car le '' 'doit aller au début de la ligne pour éviter d'injecter toute une charge d'espaces excédentaires mais ça peut sembler un peu plus WYSIWYG où ce n'est pas un préoccupation. –

14

J'ai toujours utilisé CHAR(13)+CHAR(10) pour créer des sauts de ligne (ce qui semble fonctionner mélangé avec des valeurs nvarchar) dans TSQL, alors essayez quelque chose comme ceci:

DECLARE @CRLF char(2) 
     ,@bodyText nvarchar(max) 
     ,@field1 nvarchar(10) 
     ,@field2 nvarchar(10) 
SELECT @CRLF=CHAR(13)+CHAR(10) 
     ,@field1='your data' 
     ,@field2='and more' 

set @bodyText = 
       N'Here is one line of text ' 
       [email protected]+ N'It would be nice to have this on a 2nd line ' 
       [email protected]+ N'Below is some data: ' + N' ' + N' ' + ISNULL(@field1,'') + N' ' + ISNULL(@field2 + N' ' ,'') 
       [email protected]+ N'This is the last line' 


PRINT @bodyText 

SORTIE:

Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: your data and more 
This is the last line 

ce CHAR(13)+CHAR(10) fonctionnera avec msdb.dbo.sp_send_dbmail, j'envoie des e-mails formatés en utilisant tout le temps.

+1

Pas si vous envoyez l'e-mail avec le corps comme HTML – Fandango68

1

tard à la fête, mais comme Fernando68 mentions ci-dessus, si vous êtes autorisé des e-mails HTML, définissez @bodyFormat = « HTML », vous pouvez utiliser <br/> pour les sauts de ligne et le rendre aussi fantaisie que vous voulez utiliser toutes les balises que vous obtenez du HTML aiment des sauts de ligne, img, fort et ainsi de suite ...

set @bodyText = (select 
         '<h1>My Data</h1><p>Here is one line of text<br/> 
         It would be nice to have this on a 2nd line <br/> 
         Below is some data: <br/>' 
         + field1 + '<br/>' 
         + field2 + '<br/>' 
         + 'This is the last line</p>' 
         from myTable) 

    EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'myProfile', 
     @recipients = @to, 
     @body = @bodyText, 
     @body_format = 'HTML', 
     @subject = 'Testing Email' ;