【问题标题】:sp_send_dbmail sending HTML instead of HTML formatted emailsp_send_dbmail 发送 HTML 而不是 HTML 格式的电子邮件
【发布时间】:2016-11-30 01:28:34
【问题描述】:

首先,我查看了以下问题并将其合并到我的问题中:HTML Format in sp_send_dbmail

我正在尝试动态构建一封电子邮件,如果需要,它将发送给不同的人。看来我的字符串只是查找并发送电子邮件。问题是电子邮件只是显示为类似于 HTML 的文本。这是我的 SQL:

        HTML_CTE ( EmailRecipients, EmailSubject, EmailBody )
          AS ( SELECT   Strings.Email AS EmailRecipients ,
                        'NOTIFICATION: You have exceeded the alloted meal amount' AS EmailSubject ,
                        N'<HTML>
                        <HEAD>
                            <STYLE>
                                TD {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
                            </STYLE>
                        </HEAD>
                        <BODY>
                            <H3>' + Strings.PersonName + N',</H3>
                            <br/>
                            <p> On the following dates you spent the indicated amounts:</p>
                            <br/>
                            <table cellpadding=0 cellspacing=0 border=0>
                                <TR>
                                    <TD>Date</TD>
                                    <TD></TD>
                                    <TD>Amount</TD>
                                </TR>'
                                + Strings.Exceptions + 
                            N'</table>
                            <p>You will see $' + CAST(Strings.TotalOver AS VARCHAR(MAX)) + N' deducted from your paycheck. </p>
                        </BODY>
                        </HTML>' AS EmailBody
               FROM     AllDataStrings_CTE Strings
             )
    SELECT  @ExecSQL = ( SELECT N'EXEC msdb.dbo.sp_send_dbmail'
                                + N' @profile_name = ''GrillExceptions'''
                                + N' ,@recipients = '''
                                + HTML_CTE.EmailRecipients + N''''
                                + N' ,@subject = ''' + HTML_CTE.EmailSubject
                                + N'''' + N' ,@body = ''' + HTML_CTE.EmailBody
                                + N'''' + N' ,@body_format = ''HTML''; '
                         FROM   HTML_CTE
                       FOR
                         XML PATH('')
                       );
SELECT  @ExecSQL;
EXEC sys.sp_executesql @ExecSQL;

上面有几个 CTE 可以构建表格并获取正确的数据。最终 SELECT 输出的字符串是:

EXEC msdb.dbo.sp_send_dbmail @profile_name = 'GrillExceptions',
    @recipients = '*******@******.com',
    @subject = 'NOTIFICATION: You have exceeded the alloted meal amount',
    @body = '&lt;HTML&gt;&#x0D;       &lt;HEAD&gt;&#x0D;        &lt;STYLE&gt;&#x0D;         TD {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}&#x0D;        &lt;/STYLE&gt;&#x0D;       &lt;/HEAD&gt;&#x0D;       &lt;BODY&gt;&#x0D;        &lt;H3&gt;James Shinevar,&lt;/H3&gt;&#x0D;        &lt;br/&gt;&#x0D;        &lt;p&gt; On the following dates you spent the indicated amounts:&lt;/p&gt;&#x0D;        &lt;br/&gt;&#x0D;        &lt;table cellpadding=0 cellspacing=0 border=0&gt;&#x0D;         &lt;TR&gt;&#x0D;          &lt;TD&gt;Date&lt;/TD&gt;&#x0D;          &lt;TD&gt;&lt;/TD&gt;&#x0D;          &lt;TD&gt;Amount&lt;/TD&gt;&#x0D;         &lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2016-11-22&lt;/TD&gt;&lt;TD&gt;&amp;#x20;&lt;/TD&gt;&lt;TD&gt;8.50&lt;/TD&gt;&lt;/TR&gt;&lt;/table&gt;&#x0D;        &lt;p&gt;You will see $0.50 deducted from your paycheck. &lt;/p&gt;&#x0D;       &lt;/BODY&gt;&#x0D;                         &lt;/HTML&gt;',
    @body_format = 'HTML'; 

这会导致在电子邮件正文中发送以下内容:

<HTML> <HEAD> <STYLE> TD {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;} </STYLE> </HEAD> <BODY> <H3>***** *****,</H3> <br/> <p> On the following dates you spent the indicated amounts:</p> <br/> <table cellpadding=0 cellspacing=0 border=0> <TR> <TD>Date</TD> <TD></TD> <TD>Amount</TD> </TR><TR><TD>2016-11-22</TD><TD>&#x20;</TD><TD>8.50</TD></TR></table> <p>You will see $0.50 deducted from your paycheck. </p> </BODY> </HTML>

以上代码在 Outlook 中如下所示:

我已检查并确保我收到了其他 HTML 格式的电子邮件。这个问题不是我的电子邮件客户端设置为纯文本。任何想法或帮助将不胜感激。

【问题讨论】:

    标签: html sql-server tsql email


    【解决方案1】:

    在您的示例中,@body 参数已经是 HTML 编码的,所以这就是您在电子邮件中获取 HTML 的原因。您对FOR XML PATH 的使用是罪魁祸首,因为它正在执行您不需要的编码。找到一种更好的方法来构建 @ExecSQL - 我认为您过于复杂了。

    EXEC msdb.dbo.sp_send_dbmail @profile_name = 'GrillExceptions',
        @recipients = '*******@******.com',
        @subject = 'NOTIFICATION: You have exceeded the alloted meal amount',
        @body = '&lt;HTML&gt;&#x0D;       &lt;HEAD&gt;&#x0D;        &lt;STYLE&gt;&#x0D;         TD {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}&#x0D;        &lt;/STYLE&gt;&#x0D;       &lt;/HEAD&gt;&#x0D;       &lt;BODY&gt;&#x0D;        &lt;H3&gt;James Shinevar,&lt;/H3&gt;&#x0D;        &lt;br/&gt;&#x0D;        &lt;p&gt; On the following dates you spent the indicated amounts:&lt;/p&gt;&#x0D;        &lt;br/&gt;&#x0D;        &lt;table cellpadding=0 cellspacing=0 border=0&gt;&#x0D;         &lt;TR&gt;&#x0D;          &lt;TD&gt;Date&lt;/TD&gt;&#x0D;          &lt;TD&gt;&lt;/TD&gt;&#x0D;          &lt;TD&gt;Amount&lt;/TD&gt;&#x0D;         &lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2016-11-22&lt;/TD&gt;&lt;TD&gt;&amp;#x20;&lt;/TD&gt;&lt;TD&gt;8.50&lt;/TD&gt;&lt;/TR&gt;&lt;/table&gt;&#x0D;        &lt;p&gt;You will see $0.50 deducted from your paycheck. &lt;/p&gt;&#x0D;       &lt;/BODY&gt;&#x0D;                         &lt;/HTML&gt;',
        @body_format = 'HTML';
    

    【讨论】:

    • 我明白你在说什么,我只是想做到这一点,所以会有一长串的多个 EXEC msdb.dbo.sp_send_dbmail 语句。这样,如果有多个人出现在摘录中,他们每个人都会收到一封电子邮件,我可以从一个查询中发送它。关于如何做到这一点的任何建议?
    • 将您的 CTE 选择到定义的变量中,然后使用它们发送电子邮件。
    • 简化。使用光标循环浏览您的源表,并且只需对每个电子邮件地址进行一次调用。在光标体内调用msdb.dbo.sp_send_dbmail;无需构建字符串语句 (@ExecSql),因为您可以直接使用 EXEC。调试起来会更容易,而且我保证 SQL Police 不会出现在你家门口。
    • 好的,我试图不惜一切代价避免使用 CURSOR,但如果我必须,我会的。我假设这是其中一种情况,其中确实没有使用集合逻辑的好方法,并且您需要循环流。
    【解决方案2】:

    您应该将您的解决方案重写为基于集合和基于 xml 的解决方案,而不是动态 sql。

    您的问题可能出在@body - 您将整个 html 发送到 html 正文中:

    <html>
        <head>
        </head>
        <body>
            <html>
                <head>
                </head>
                <body>
                </body>
           </html>
        </body>
    </html>
    

    你应该使用 div 或 table 标签。

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2014-06-22
      • 2017-09-04
      • 2013-11-08
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多