gpt4 book ai didi

winforms - 将 RDLC 输出作为电子邮件附件分发

转载 作者:行者123 更新时间:2023-12-02 20:33:04 25 4
gpt4 key购买 nike

我们的 winforms 应用程序长期以来一直允许基本上使用 RDLC 的“打印”选项。

客户要求我们添加一项功能,允许用户通过电子邮件发送“打印”输出。

现在,我们知道 EMF 文件是作为当前打印过程的一种隐藏副产品创建的(在 TEMP 文件夹中)。

在我们看来,我们可以简单地获取此 EMF 文件并将其附加到新电子邮件中,工作就完成了。

  1. 这是最好的选择吗?
  2. 我们可以依赖任何 Windows 机器打开 EMF 文件吗?
  3. 我们如何识别 EMF 文件? ...目前似乎被命名为 %TEMP%\DiaryGrid_1.emf 。好的,DiaryGrid 是我们的 RDLC 文件的名称,但 _1 会在此过程中添加到某个位置。

最佳答案

我以前做过。我以编程方式将报告导出为 pdf 格式到特定位置,然后我们通过电子邮件发送 pdf 文件并将其删除。我会尽力为您找到代码(现在不在家里)

编辑:

抱歉稍后。现在我在家,我会给你一些代码块,我认为它们会给你一些帮助来完成你的任务。我将对代码添加一些注释,以便您可以理解我的项目中特定的一些内容。该代码已经过测试并且在我的客户中运行良好,但我确信它可以改进。如果您可以改进此代码,请告诉我;)

首先,我们将报告导出为 pdf 格式。

private string ExportReportToPDF(string reportName)
{
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string filenameExtension;
byte[] bytes = ReportViewer1.LocalReport.Render(
"PDF", null, out mimeType, out encoding, out filenameExtension,
out streamids, out warnings);

string filename = Path.Combine(Path.GetTempPath(), reportName);
using (var fs = new FileStream(filename, FileMode.Create))
{
fs.Write(bytes, 0, bytes.Length);
fs.Close();
}

return filename;
}

现在,我们需要一个控制邮件系统的类。每个邮件系统都有自己的特点,所以也许你需要修改这个类。该类的行为很简单。您只需填写属性,然后调用 Send 方法即可。就我而言,一旦我发送了pdf文件,Windows就不允许我删除它(Windows说该文件正在使用中),所以我将该文件编程为在下次重新启动时删除。看一下删除方法。请注意,发送方法使用名为 MailConfig 的自定义类。这是一个小类,有一些配置字符串,如主机、用户名和密码。邮件将使用此参数发送。

public class Mail
{
public string Title { get; set; }
public string Text { get; set; }
public string From { get; set; }
public bool RequireAutentication { get; set; }
public bool DeleteFilesAfterSend { get; set; }

public List<string> To { get; set; }
public List<string> Cc { get; set; }
public List<string> Bcc { get; set; }
public List<string> AttachmentFiles { get; set; }

#region appi declarations

internal enum MoveFileFlags
{
MOVEFILE_REPLACE_EXISTING = 1,
MOVEFILE_COPY_ALLOWED = 2,
MOVEFILE_DELAY_UNTIL_REBOOT = 4,
MOVEFILE_WRITE_THROUGH = 8
}

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern bool MoveFileEx(string lpExistingFileName,
string lpNewFileName,
MoveFileFlags dwFlags);

#endregion

public Mail()
{
To = new List<string>();
Cc = new List<string>();
Bcc = new List<string>();
AttachmentFiles = new List<string>();
From = MailConfig.Username;
}

public void Send()
{
var client = new SmtpClient
{
Host = MailConfig.Host,
EnableSsl = false,
};

if (RequireAutentication)
{
var credentials = new NetworkCredential(MailConfig.Username,
MailConfig.Password);
client.Credentials = credentials;
}

var message = new MailMessage
{
Sender = new MailAddress(From, From),
From = new MailAddress(From, From)
};

AddDestinataryToList(To, message.To);
AddDestinataryToList(Cc, message.CC);
AddDestinataryToList(Bcc, message.Bcc);

message.Subject = Title;
message.Body = Text;
message.IsBodyHtml = false;
message.Priority = MailPriority.High;

var attachments = AttachmentFiles.Select(file => new Attachment(file));
foreach (var attachment in attachments)
message.Attachments.Add(attachment);

client.Send(message);

if (DeleteFilesAfterSend)
AttachmentFiles.ForEach(DeleteFile);
}

private void AddDestinataryToList(IEnumerable<string> from,
ICollection<MailAddress> mailAddressCollection)
{
foreach (var destinatary in from)
mailAddressCollection.Add(new MailAddress(destinatary, destinatary));
}

private void DeleteFile(string filepath)
{
// this should delete the file in the next reboot, not now.
MoveFileEx(filepath, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
}
}

现在,您可以创建一个表单来询问目的地,添加一些验证等,返回 Mail 类的实例...或者您可以简单地“硬编码”值并填充类。

以下是我在按钮中用于调用此表单的代码,在我的示例中,它名为 SendMailView。

private void BtnSendByMail_Click(object sender, EventArgs e)
{
SendMailView sendMailView = new SendMailView();

if (sendMailView.ShowDialog()== DialogResult.OK)
{
Mail mail = sendMailView.CurrentItem;
mail.AttachmentFiles.Add(ExportReportToPDF("Invoice.pdf"));
mail.DeleteFilesAfterSend = true;
mail.RequireAutentication = true;
mail.Send();
}
sendMailView.Dispose();
}

在此示例中,senMailView.CurrentItem 是邮件类的实例。我们只需要调用 Send 方法即可完成工作。

这是我在 SO 中写过的最大的答案...我希望它对您有所帮助:D 如果您在使用它时遇到任何问题,请给我打电话。顺便说一句,我对自己的英语不是很自豪,所以如果文字有任何错误,请原谅我。

关于winforms - 将 RDLC 输出作为电子邮件附件分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com