如何使用sp_send_dbmail发送纯文本电子邮件(带换行符)?

时间:2010-08-18 17:05:02

标签: sql-server sql-server-2008 emacs 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服务器,这会在c:\ inetpub \ mailroot \ queue

中生成一个.EML文件

当我打开其中一个.eml文件时(ug - 唯一可以打开它们的是outlook express,在其他任何东西中查看它们只是将主体显示为base64编码的blob。)它看起来像渲染结果作为HTML - 所以我不确定问题是在客户端,还是

我已经尝试将\ n放入邮件中,但这不起作用。如何发送包含换行符的纯文本,并验证最终结果是否正确?

顺便说一句,我实际上无法发送电子邮件来测试真实的电子邮件客户端 - corp。网络已被锁定。

4 个答案:

答案 0 :(得分:15)

我总是使用CHAR(13)+CHAR(10)在TSQL中创建换行符(似乎与nvarchar值混合使用),所以尝试这样的事情:

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一起使用,我会一直使用该格式发送格式化的电子邮件。

答案 1 :(得分:8)

您实际上并未插入任何换行符。您可以将它们直接嵌入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包含多行,则两者都会引发错误。

答案 2 :(得分:2)

晚会,但正如Fernando68上面提到的那样,如果您允许使用html电子邮件,请设置@bodyFormat ='HTML',然后您可以使用<br/>进行换行并进行操作你想要使用从HTML中获得的所有标签,如换行符,img,strong等等,这些都很棒!

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

答案 3 :(得分:0)

就我而言,带有 CHAR(13)+CHAR(10) 的纯文本电子邮件被 Outlook 格式化,“有助于”删除额外的换行符(除非它在 ​​Outlook 选项中未选中)。

此外,我的条目列表是动态的,所以我将 STUFF FOR XML PATH 放在一个连接字符串中,并简单地添加一个带有新换行符的文字空字符串,然后分配 sp_send_dbmail 的 @body = @emailBody :

DECLARE @emailBody VARCHAR(MAX)

SET @emailBody = CONCAT('files: '
    ,(SELECT STUFF((SELECT
    ' 

' + CONCAT([FileName],'.csv')
    FROM localdb.dbo.tableName
    for xml path(''), TYPE).value('.', 'VARCHAR(MAX)'),1,1,'')))