使用sp_send_dbmail时电子邮件中的格式问题

时间:2019-03-14 20:19:09

标签: sql-server formatting sp-send-dbmail

我可以发送电子邮件,查询结果很好,但是电子邮件到达的格式使我发疯。这是SQL:

DECLARE @Body varchar(max)
declare @TableHead varchar(max)
declare @TableTail varchar(max)
declare @mailitem_id as int
declare @statusMsg as varchar(max)
declare @Error as varchar(max) 
declare @Note as varchar(max)

Set NoCount On;
set @mailitem_id = null
set @statusMsg = null
set @Error = null
set @Note = null
Set @TableTail = '</table></body></html>';

--HTML layout--
Set @TableHead = '<html><head>' +
'<H1 style="color: #000000">New Contact</H1>' +
'<style>' +
'td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:9pt;color:Black;} ' +
'</style>' +
'</head>' +
'<body><table cellpadding=0 cellspacing=0 border=0>' +
'<tr bgcolor=#F6AC5D>'+
'<td align=center><b>FirstName</b></td>' +
'<td align=center><b>lastname</b></td>' +
'<td align=center><b>ContactValue</b></td>' +
'<td align=center><b>ClientMessage</b></td>' + 
'<td align=center><b>timestamp</b></td></tr>';

--Select information for the Report-- 
Select @Body= (SELECT 
FirstName 
,lastname 
,CASE 
    WHEN MethodOfContact = 'emailChecked'
        THEN ContactEmail
    WHEN MethodOfContact = 'phoneChecked'
        THEN PhoneNumber
        ELSE ContactEmail
    END AS ContactValue
,ClientMessage
,Addts as timestamp
FROM TABLE1
WHERE Addts > (
    SELECT MAX(ADDTS)
    FROM TABLE2)

For XML path('tr'), Elements) 

-- Replace the entity codes and row numbers
Set @Body = Replace(@Body, '_x0020_', space(1))
Set @Body = Replace(@Body, '_x003D_', '=')
Set @Body = Replace(@Body, '<tr><TRRow>1</TRRow>', '<tr bgcolor=#C6CFFF>')
Set @Body = Replace(@Body, '<TRRow>0</TRRow>', '')


Set @Body = @TableHead + @Body + @TableTail

-- return output--
Select @Body

--Email
EXEC msdb.dbo.sp_send_dbmail 
@profile_name = 'GPG Infrastructure Team',
@mailitem_id = @mailitem_id out,
@recipients='myemail@email.com',
@subject = 'NewContactRecord',
@body = @Body,
@body_format = 'HTML';

生成的电子邮件包含所有5列,但是数据点都塞满了第一列。如何使每个值出现在每个适当的列中?我对HTML一点都不熟悉,因此已经与我在网上找到的内容拼凑在一起。非常感谢! email screenshot

以下是HTML输出的示例:

<html>
   <head>
      <H1 style="color: #000000">New Contact</H1>
      <style>td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:9pt;color:Black;} </style>
   </head>
   <body>
      <table cellpadding=0 cellspacing=0 border=0>
         <tr bgcolor=#F6AC5D>
            <td align=center><b>FirstName</b></td>
            <td align=center><b>lastname</b></td>
            <td align=center><b>ContactValue</b></td>
            <td align=center><b>ClientMessage</b></td>
            <td align=center><b>timestamp</b></td>
         </tr>
         <tr>
            <FirstName>Shannon</FirstName>
            <lastname>Smith</lastname>
            <ContactValue>email.value@email.com</ContactValue>
            <ClientMessage>Test</ClientMessage>
            <timestamp>2019-03-13T12:57:17.723</timestamp>
         </tr>
         <tr>
            <FirstName>Gwen</FirstName>
            <lastname>Smith</lastname>
            <ContactValue>email.value@email.com</ContactValue>
            <ClientMessage>testing 3/13/2019 4:15 pm</ClientMessage>
            <timestamp>2019-03-13T16:18:30.600</timestamp>
         </tr>
         <tr>
            <FirstName>Gwen</FirstName>
            <lastname>Smith</lastname>
            <ContactValue>email.value@email.com</ContactValue>
            <ClientMessage>another one 4:19 pm</ClientMessage>
            <timestamp>2019-03-13T16:19:36.020</timestamp>
         </tr>

1 个答案:

答案 0 :(得分:0)

问题出在我的select语句上。最终使它起作用的是以下内容:

Select @Body= (SELECT 
(select a.FirstName as 'td'  for xml path(''), type),
(select a.LastName as 'td'  for xml path(''), type),
(select CASE 
    WHEN MethodOfContact = 'emailChecked'
        THEN ContactEmail
    WHEN MethodOfContact = 'phoneChecked'
        THEN PhoneNumber
        ELSE ContactEmail
    END as 'td'  for xml path(''), type) AS ContactValue ,
(select a.ClientMessage as 'td'  for xml path(''), type), 
(select cast(a.AddTs as smalldatetime) as 'td'  for xml path(''), type) as Timestamp
FROM Table1 a