delphi 与Indy的邮件往来缓慢

dm7nw8vv  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(180)

从 Delphi 10.4升级到11.3后,我在电子邮件中遇到了一个奇怪的附件问题。从文件直接从服务器发送电子邮件,其中exe-文件正在运行速度快发送两个300 KB的附件需要大约10分钟的文件位于网络共享。我的第一个想法是缓慢的网络。它被测量为每秒20 MB。没有那么快,但300 KB应该需要秒而不是分钟发送。
我的应用程序在这段时间没有响应,因为它发生在主线程中。所以这是一个巨大的问题。任务管理器只显示低CPU使用率,所以很明显它在等待什么。
这里是发送电子邮件的方法。请检查并评论任何可疑代码。请注意,Indy BoldHelper是一个内部方法,它使用一个接口(vHelp)来释放参数的内存。这个想法是,我不需要传统的try/finally来完成这个任务。TIdMessageBuilderHtml呢?Html不仅仅是纯文本。有没有更好的方法来发送带有附件的计划文本?

class function TATMail.SendMail(const aReceiver, aSender, aReplyTo, aCc,
    aSubject, aBody, aAttachments: string; out aOutMessage: string): Boolean;
var
  smtp: TIdSMTP;                 
  msg: TidMessage;               
  builder: TIdMessageBuilderHtml;
  i: Integer;
  vStrList: TStringList;
  vUserName, vPassword: String;
  vHelp: IBoldHelper;
begin
  Result := False;
  vHelp := CreateBoldHelper(vStrList, smtp, msg, builder);
  vStrList := TStringList.Create;
  msg := TIdMessage.Create(nil);

  builder := TIdMessageBuilderHtml.Create;
  builder.PlainText.Text := aBody;
  builder.PlainTextCharSet := cnUTF8;

  if aAttachments <> '' then
  begin
    vStrList.CommaText := aAttachments;

    for i := 0 to vStrList.Count - 1 do
      if FileExists(vStrList[i]) then
        builder.Attachments.Add(vStrList[i]);
  end;
  builder.FillMessage(msg);

  msg.From.Name := aSender;
  msg.From.Address := aReplyTo;
  msg.Subject := aSubject;
  msg.Recipients.EMailAddresses := aReceiver;
  if Pos('@', aCc) > 0 then
    msg.CCList.EMailAddresses := aCc;

  smtp := TIdSMTP.Create(nil);
  try
    smtp.Host := GetSystemConfig.SMTPHost;
    // smtp.UseTLS := utNoTLSSupport;
    smtp.Port := GetSystemConfig.Port;
    vUserName := GetSystemConfig.UserName;
    vPassword := GetSystemConfig.PassWord;
    if (vUserName <> '') and (vPassword <> '') then
    begin
      smtp.Username := vUserName;
      smtp.Password := vPassword;
      smtp.AuthType := satDefault;
    end
    else
      smtp.AuthType := satNone;

    smtp.Connect;
    try
      smtp.Send(msg);
      aOutMessage := 'Mail sent to ' + aReceiver +'.';
      Result := true;
    finally
      smtp.Disconnect;
    end;
  except
    on E: Exception do  // Do not raise exception again. Only show errormessage for user
      aOutMessage := Format('%s. Mail couldn''t be sent to %s.', [E.Message, aReceiver]);
  end;
end;

字符串

yqlxgs2m

yqlxgs2m1#

只是想说,复制附件到一个快速的文件夹,如本地一个之前,发送电子邮件要快得多

相关问题