我正在尝试通过发送邮件任务
发送电子邮件正文中的所有表记录我的流程:
我使用SQL执行任务从表中获取行并存储在对象中
用于每个循环容器,并使用脚本任务将行存储在EmailMessage正文中
我使用发送邮件任务发送电子邮件
我只获取邮件正文中表格的最后记录。
请指导我如何在邮件正文中一次发送所有表格数据
答案 0 :(得分:0)
我想我会采用稍微不同的方法并直接在脚本任务中递归记录集,但这看起来也会起作用。我猜你的问题是你在每次迭代时覆盖 User::EmailMessage
。你说你得到最后几条记录,但看着你的代码,我认为你会得到1,除非你取消注释IF (varcollection == string.empty)
,在这种情况下你可能会得到更多。
无论如何,主要的违规问题是
varCollection["User::EmailMessage"].Value = header;
每次调用时,都会将EmailMessage正文重置为标题行。
编辑:根据您的评论添加每个新货件号码的重置消息。添加另一个包变量PrevShippingNum,它将保存先前的循环数,以测试它是否相同或已更改。确保此变量作为脚本任务的ReadWriteVariable列出。然后修改你的脚本以包含这样的内容:
Dts.VariableDispenser.GetVariables(ref varCollection);
bool newMessage = (varCollection["User::PrevShippingNum"].value != varCollection["User::ShppingNum"].value) ? true : false;
if (string.IsNullOrWhiteSpace(varCollection["User::EmailMessage"].Value.ToString()) || newMessage)
{
varCollection["User::EmailMessage"].Value = string.Format("{0}........");
}
varCollection["User::EmailMessage"].Value += string.Format("{0}......");
关于这一点,你可以使用新变量作为约束来确定何时发送电子邮件任务。
另一种方法:
注意相当大的编辑以添加新子以照顾每个ShippingNum发送电子邮件:
方法我将继续将您正在使用的记录集变量传递给脚本任务,并让它进行电子邮件构建。要明确这是替换你的foreach循环!这里有一些代码改编自我的解决方案之一:
添加对System.Data.DataSetExtensions
添加以下命名空间:
using System.Data.OleDb;
using System.Net.Mail;
using System.Linq;
using System.Collections.Generic;
private void Main()
{
//using System.Data.OleDb;
OleDbDataAdapter oleAdapter = new OleDbDataAdapter();
DataTable dt = new DataTable();
oleAdapter.Fill(dt, Dts.Variables["User::OleDbRecordSetVar"].Value);
//build header row
string headerRow = string.Format("{0}........", "ShippingNum ....");
//get distinct shippingNums
var shippingNums = (from DataRow dr in dt.Rows
select (int)dr["ShppingNum"]).Distinct();
//Now Build the Differnt Emails
foreach (var num in shippingNums)
{
string emailBody = headerRow;
List<DataRow> emailLines = (from DataRow dr in dt.Rows
where (int)dr["ShippingNum"] == num
select dr).ToList<DataRow>();
foreach (DataRow line in emailLines)
{
emailBody += string.Format("{0}....", line["ColumnName1"].ToString(), line["ColumnName2"].ToString());
}
SendEmail(emailBody);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
private void SendEmail(string messageBody)
{
//get the smtp server address from the SSIS connection manger
ConnectionManager smtpConnectionManager = Dts.Connections["Name Of SMTP Connection Manager"];
//note this is for trusted authentication if you want to use a username and password you will have to do some discovery
SmtpClient emailClient = new SmtpClient(smtpConnectionManager.Properties["SmtpServer"].GetValue(smtpConnectionManager).ToString());
MailMessage email = new MailMessage();
email.Priority = MailPriority.Normal;
email.IsBodyHtml = false; //change to true if you send html
//can hard code addresses if you desire I use variables to make it more flexible
email.From = new MailAddress(Dts.Variables["User::FromAddress"].Value.ToString());
email.To.Add(Dts.Variables["User::ToAddress"].Value.ToString());
email.Body = messageBody;
emailClient.Send(email);
}