【问题标题】:Sending out an HTML Email Notification发送 HTML 电子邮件通知
【发布时间】:2014-07-15 21:26:39
【问题描述】:

一些看起来很简单的事情现在让我发疯了。我需要想出一些东西来对 SQL Server 数据库运行查询,以获取我们仓库中最近的货物。根据标记为最近发货的内容,它会查找该客户的电子邮件地址并向他们发送发货通知,就像Amazonevery other company 一样。

电子邮件的正文将包含货件中的物品、带有超链接的跟踪号以及其他一些订单详细信息。它必须是 HTML。

使用 SSRS 是有意义的,因为它让我可以选择在电子邮件正文中发送报告,但我永远无法弄清楚如何动态设置收件人:电子邮件。显然 SSRS 有一个称为数据驱动订阅的功能,但像往常一样,我碰巧有一个更便宜的 SQL Server 版本,它不包含该功能。

我想,没什么大不了的。我会做的SSIS。所以我写了我的任务并发送了一封电子邮件,但我只能将报告作为附件发送。显然,SSIS 无法发送 HTML。

所以现在我回到第一方。

我现在可以让 SSIS 生成 .pdf、.html 或 .txt 文件,将其保存在文件夹中并将其作为附件发送。

如何根据查询结果在电子邮件正文中发送 SSRS 或 Crystal Report?我需要放弃 SSIS 并使用完全不同的东西吗?

【问题讨论】:

  • 我不会为此摆弄 SSRS,而是研究sp_send_dbmail,SSRS 要求您为接收者设置订阅设置。而且由于它是某种收据,并不是每个用户都会买东西,而且你不想用不必要的电子邮件打扰你的用户,动态构建你的电子邮件正文并将其发送给只符合该标准的用户,比如谁买了东西最近和东西。 SSRS 报告不是满足此类要求的方法。

标签: sql-server reporting-services ssis html-email


【解决方案1】:

您可以通过将IsBodyHTML 设置为true 来使用脚本组件并使用SmtpClient 对其进行自定义

           SmtpClient client = new SmtpClient("smtp.gmail.com");
           MailMessage message = new MailMessage();
           message.IsBodyHtml = true;

           client.EnableSsl = true;
           client.Credentials = new NetworkCredential("XXX", "param123");
           message.From = new MailAddress("XXXX@gmail.com");
           message.Subject = subject;
           message.Body = mailBody ;
           client.Send(message);

然后您可以使用 HTML 标签撰写邮件正文,例如

mailBody = "<br/>";

【讨论】:

  • 我喜欢。进行了一些调整,但效果很好。基本上我在 html4.0 中呈现我的 SSRS 并将其保存为 .txt 文件。我使用 System.IO 读取文件的文本并将其设置为字符串“mailBody”。如果成功完成,它将使用您的方法发送一封电子邮件,其中正文设置为“mailBody”中的 html。
  • 我唯一需要注意的是 message.From/message.To 不起作用。我需要在构造级别设置这些。 MailMessage message = new MailMessage(Dts.Variables["User::FromEmailAddress"].Value.ToString(), Dts.Variables["User::ToEmailAddress"].Value.ToString());
【解决方案2】:

如果您的电子邮件的 HTML 内容相对简单,您应该查看 MSDN documentation for sp_send_dbmail 上的示例“C. 发送 HTML 电子邮件”。

这显示了如何从 SELECT 查询生成 HTML 表并将其作为电子邮件正文发送,例如(取自 MSDN 页面):

DECLARE @tableHTML  NVARCHAR(MAX) ;

SET @tableHTML =
    N'<H1>Work Order Report</H1>' +
    N'<table border="1">' +
    N'<tr><th>Work Order ID</th><th>Product ID</th>' +
    N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' +
    N'<th>Expected Revenue</th></tr>' +
    CAST ( ( SELECT td = wo.WorkOrderID,       '',
                    td = p.ProductID, '',
                    td = p.Name, '',
                    td = wo.OrderQty, '',
                    td = wo.DueDate, '',
                    td = (p.ListPrice - p.StandardCost) * wo.OrderQty
              FROM AdventureWorks.Production.WorkOrder as wo
              JOIN AdventureWorks.Production.Product AS p
              ON wo.ProductID = p.ProductID
              WHERE DueDate > '2004-04-30'
                AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 
              ORDER BY DueDate ASC,
                       (p.ListPrice - p.StandardCost) * wo.OrderQty DESC
              FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX) ) +
    N'</table>' ;

EXEC msdb.dbo.sp_send_dbmail @recipients='danw@Adventure-Works.com',
    @subject = 'Work Order List',
    @body = @tableHTML,
    @body_format = 'HTML' ;

生成的电子邮件非常简单,但如果您知道自己的 HTML,可以对其进行调整

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多