Как я могу отправлять текстовые электронные письма (с переносами строк) использование sp_send_dbmail?

У меня есть процедура SQL Server 2008, которая отправляет электронную почту через sp_send_dbmail.

Я использую следующий код:

  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' ;

Мой myProfile настроен на использование локального сервера SMTP, что приводит к. EML-файл в c: \ inetpub \ mailroot \ queue

Когда я открываю один из этих файлов .eml (единственное, что может открыть их, это outlook express, при взгляде на них во всем остальном просто отображается тело как base64). закодированный блоб.) похоже, что он отображает результат в виде HTML - поэтому я не уверен, что проблема в клиенте, или

я пытался вставить \ n в сообщение, но это не сработало. Как я могу отправить простой текст с разрывами строк и убедиться, что конечный результат выглядит правильно?

Кстати, я не могу отправить электронное письмо, чтобы проверить его с реальными почтовыми клиентами - корп. сеть заблокирована.

13
задан KM. 18 August 2010 в 17:52
поделиться

2 ответа

Фактически вы не вставляете никаких разрывов строки. Вы можете встроить их непосредственно в строковый литерал в SQL Server, как показано ниже.

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);

Или более аккуратный подход:

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); 

Оба вызовут ошибку, если myTable содержит более одной строки, когда вы присваиваете результат скалярной переменной.

9
ответ дан 1 December 2019 в 21:23
поделиться

Я всегда использовал CHAR (13) + CHAR (10) для создания разрывов строк (которые, кажется, работают вместе со значениями nvarchar) в TSQL, поэтому попробуйте примерно так:

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 ' 
                +@CRLF+ N'It would be nice to have this on a 2nd line ' 
                +@CRLF+ N'Below is some data: ' + N' ' + N' ' + ISNULL(@field1,'') + N' ' + ISNULL(@field2 + N' ' ,'')
                +@CRLF+ N'This is the last line' 


PRINT @bodyText

ВЫВОД:

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

этот CHAR (13) + CHAR (10) будет работать с msdb.dbo.sp_send_dbmail , я отправляю отформатированные электронные письма, используя это все время.

15
ответ дан 1 December 2019 в 21:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: