delphi 与Indy的邮件往来缓慢

dm7nw8vv  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(259)

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

  1. class function TATMail.SendMail(const aReceiver, aSender, aReplyTo, aCc,
  2. aSubject, aBody, aAttachments: string; out aOutMessage: string): Boolean;
  3. var
  4. smtp: TIdSMTP;
  5. msg: TidMessage;
  6. builder: TIdMessageBuilderHtml;
  7. i: Integer;
  8. vStrList: TStringList;
  9. vUserName, vPassword: String;
  10. vHelp: IBoldHelper;
  11. begin
  12. Result := False;
  13. vHelp := CreateBoldHelper(vStrList, smtp, msg, builder);
  14. vStrList := TStringList.Create;
  15. msg := TIdMessage.Create(nil);
  16. builder := TIdMessageBuilderHtml.Create;
  17. builder.PlainText.Text := aBody;
  18. builder.PlainTextCharSet := cnUTF8;
  19. if aAttachments <> '' then
  20. begin
  21. vStrList.CommaText := aAttachments;
  22. for i := 0 to vStrList.Count - 1 do
  23. if FileExists(vStrList[i]) then
  24. builder.Attachments.Add(vStrList[i]);
  25. end;
  26. builder.FillMessage(msg);
  27. msg.From.Name := aSender;
  28. msg.From.Address := aReplyTo;
  29. msg.Subject := aSubject;
  30. msg.Recipients.EMailAddresses := aReceiver;
  31. if Pos('@', aCc) > 0 then
  32. msg.CCList.EMailAddresses := aCc;
  33. smtp := TIdSMTP.Create(nil);
  34. try
  35. smtp.Host := GetSystemConfig.SMTPHost;
  36. // smtp.UseTLS := utNoTLSSupport;
  37. smtp.Port := GetSystemConfig.Port;
  38. vUserName := GetSystemConfig.UserName;
  39. vPassword := GetSystemConfig.PassWord;
  40. if (vUserName <> '') and (vPassword <> '') then
  41. begin
  42. smtp.Username := vUserName;
  43. smtp.Password := vPassword;
  44. smtp.AuthType := satDefault;
  45. end
  46. else
  47. smtp.AuthType := satNone;
  48. smtp.Connect;
  49. try
  50. smtp.Send(msg);
  51. aOutMessage := 'Mail sent to ' + aReceiver +'.';
  52. Result := true;
  53. finally
  54. smtp.Disconnect;
  55. end;
  56. except
  57. on E: Exception do // Do not raise exception again. Only show errormessage for user
  58. aOutMessage := Format('%s. Mail couldn''t be sent to %s.', [E.Message, aReceiver]);
  59. end;
  60. end;

字符串

yqlxgs2m

yqlxgs2m1#

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

相关问题