我有一个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。网络已被锁定。答案 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,'')))