0

我一直在使用 ShellExecute 使用 Windows 默认邮件客户端一次生成 5 或 6 封电子邮件:

ShellExecute(Self.Handle, nil, Pchar(email), nil, nil, SW_NORMAL);

然后,这允许用户决定是否要发送它们。

我遇到的问题是,如果电子邮件正文太长,它会在创建的电子邮件中被截断。我认为这是以这种方式创建电子邮件的限制。

我已经考虑将生成电子邮件的方式改为使用 MAPI,但我发现的问题是我尝试过的所有 MAPI 例程或组件似乎一次只允许我创建一封电子邮件。然后,最终用户必须在生成下一个之前决定是否要发送它。

是否有解决 ShellExecute 长度问题的方法,或者是否有办法使用 MAPI 或其他方式一次性生成一批电子邮件?我想使用默认的 Windows 电子邮件客户端来显示消息。

我正在使用德尔福 7。

4

1 回答 1

0

我使用 JclMapi.pas 使用 MAPI 发送电子邮件。我编写了一个类来简化 TJclEmail 类的使用。

发送电子邮件的代码是:

class function TMAPISendMail.Execute(const Name, EmailTo, Subject, Body: string; Attachment: TStrings): boolean;
var
  I: Integer;
  Email: string;
  MAPISendMail: TMAPISendMail;
begin
  MAPISendMail:= TMAPISendMail.Create;
  try
    I:= 1;
    while I > 0 do
    begin
      Email:= TString.Token(EmailTo, ';', I);
      if Email <> '' then
        MAPISendMail.AddRecipient(Email, Name);
    end;
    for I := 0 to Attachment.Count - 1 do
      MAPISendMail.AddAttachment(Attachment[I]);
    MAPISendMail.MailSubject:= Subject;
    MAPISendMail.HTMLBody:= False;
    MAPISendMail.MailBody:= Body;
    Result:= MAPISendMail.SendMail;
  finally
    MAPISendMail.Free;
  end;
end;

类接口是:

 TMAPISendMail = class
  private
    FAJclEmail: TJclEmail;
    FPrerequisites: TPrerequisites;
    FResolveNames: Boolean;
    FShowDialog: Boolean;
    [...]
  protected
    function DoSendMail: Boolean; virtual;
  public
    constructor Create;
    destructor Destroy; override;
    class function Execute(const Name, EmailTo, Subject, Body: string; Attachment: TStrings): boolean; static;
    property MailBody: string read GetMailBody write SetMailBody;
    property HTMLBody: Boolean read GetHTMLBody write SetHTMLBody;
    property ShowDialog: Boolean read FShowDialog write FShowDialog;
    property MailSubject: string read GetMailSubject write SetMailSubject;
    property ResolveNames: Boolean read FResolveNames write FResolveNames;
    property Prerequisites: TPrerequisites read FPrerequisites;
    procedure AddRecipient(const Address: string; const Name: string = '');
    procedure AddAttachment(const FileName: string);
    function SendMail: Boolean;
  end;

希望它对你有用。

也检查这个线程:发送带有签名的电子邮件

于 2012-06-22T01:14:23.457 回答