使用快速报告中的 TfrxMailExport

问题描述 投票:0回答:2

我在 Delphi 中使用 Fast Reports 时遇到了问题, 我使用的对象是 TfrxMailExport, 我面临的问题是电子邮件服务器的值没有正确填写。

代码:

email := TfrxMailExport.Create(self);
email.Subject := 'Teste';
email.Lines.Clear;
email.Lines.Add('Linha 1');
email.Lines.Add('Linha 2');
email.Lines.Add('Linha 3');
email.Lines.Add('Linha 4');
email.Address := '[email protected]';
email.SmtpHost := '0.0.0.0';
email.SmtpPort := 25;
email.FromMail := '[email protected]';
email.FromName := 'NAME';
email.Login := 'Login';
email.Password := 'Password';

email.TimeOut := 30;
email.Report := Rela;

rela.Export(email);
email.Destroy;

仅填写电子邮件一侧

email fastreport delphi-10.4-sydney
2个回答
1
投票

由于该帖子不太可能得到答案(如果有的话),因此我将发布我的解决方法作为解决方案,以防有人遇到同样的问题。

我创建了一个类似于 Fast Reports 中的表单,我将 FR 文件导出为 PDF,这个效果很好。

Procedure SomeProc();
var pdf : TfrxPDFExport;
begin
  pdf := TfrxPDFExport.Create(self);
  pdf.Compressed := True;
  pdf.EmbeddedFonts := False;
  pdf.Background := True;
  pdf.PrintOptimized := False;
  pdf.Outline := False;
  pdf.Transparency := False;
  pdf.Quality := 95;
  pdf.ProtectionFlags := [eModify, eCopy, eAnnot];
  pdf.OpenAfterExport := False;
  pdf.ShowProgress := False;
  pdf.ShowDialog := false;
  pdf.FileName := 'C:\SomeFolder\'+fileName+'.pdf';
  pdf.HideToolbar := False;
  pdf.HideMenubar := False;
  pdf.HideWindowUI := False;
  pdf.FitWindow := False;
  pdf.CenterWindow := False;
  pdf.PrintScaling := False;
  myReport.Export(pdf);
end;

然后对于电子邮件,我使用了 C# .Net DLL,并从 Delphi 应用程序中调用它。

C# 代码:

using RGiesecke.DllExport;

[DllExport("SendEmail", CallingConvention = CallingConvention.StdCall)]
 public static string SendEmail(string txtTo, string txtToCC, string txtToBCC, string txtSubject, string txtMessage, string txtFrom, string txtServer, string txtPort, string txtUtilizador, string txtPasse, string txtFile ,bool cbSSL)
 {
     MailMessage message = new MailMessage();
     SmtpClient smtpClient = new SmtpClient();

     string msg = string.Empty;
     try
     {
         MailAddress fromAddress = new MailAddress(txtFrom);
         Attachment attachment = new Attachment(txtFile, System.Net.Mime.MediaTypeNames.Application.Pdf);

         message.From = fromAddress;                
         message.To.Add(txtTo);
         if (txtToCC != "")
             message.CC.Add(txtToCC);
         if (txtToBCC != "")
             message.Bcc.Add(txtToBCC);

         message.Attachments.Add(attachment);

         message.Subject = txtSubject;

         message.IsBodyHtml = true;
         message.Body = txtMessage;
         smtpClient.Timeout = 5000;
         smtpClient.Host = txtServer; 
         int.TryParse(txtPort, out int port);
         smtpClient.Port = port;

         smtpClient.UseDefaultCredentials = false;
         smtpClient.Credentials = new System.Net.NetworkCredential(txtUtilizador, txtPasse);
         smtpClient.EnableSsl = cbSSL;
         smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;

         smtpClient.Send(message);
         message.Dispose();
         return "Message Sent.";
     }
     catch (Exception ex)
     {
         return ex.Message;
     }
 }

最后,在 Delphi 中调用它。

function SendEmail(txtTo, txtToCC, txtToBCC, txtSubject, txtMessage, txtFrom, txtServer, txtPort, txtUtilizador, txtPasse, txtFicheiro : PAnsiChar; cbSSL : Boolean) : PAnsiChar; stdcall; external 'SendEmail.dll';


showmessage(SendEmail(PAnsiChar(AnsiString('To'))
               , PAnsiChar(AnsiString('ToCC'))
               , PAnsiChar(AnsiString('ToBCC'))
               , PAnsiChar(AnsiString('Subject'))
               , PAnsiChar(AnsiString('Message'))
               , PAnsiChar(AnsiString('From'))
               , PAnsiChar(AnsiString('Server'))
               , PAnsiChar(AnsiString('Port'))
               , PAnsiChar(AnsiString('User'))
               , PAnsiChar(AnsiString('Pass'))
               , PAnsiChar(AnsiString('File'))
               , SSL));

我犯了几个错误,比如使用函数来转换字符串而不必编写每个字符串,由于某种原因它不起作用。 该函数需要指定它是一个 stdcall。


0
投票

设置参数 email.UseIniFile := False;

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.