mimemakerform.pas

来自「著名的SecureBlackBox控件完整源码」· PAS 代码 · 共 897 行 · 第 1/2 页

PAS
897
字号
unit MimeMakerForm;
{$i MimeMaker.inc}
{$O-,D+,L+}

{.$DEFINE _RepackTest}

interface

{$warnings off}
uses
  {$IFDEF DELPHI_NET}
  System.Text,
  System.Collections,
  System.ComponentModel,
  {$ENDIF}
  // System units:
  Windows, Messages, SysUtils, {$IFDEF D_6_UP}Variants,{$ENDIF} Classes,
  // SB Unicode Library
  SBChSConvCharsets, // include all charsets
  // MIMEBlackbox units:
  SBMIMETypes,
  SBMIMEClasses,
  SBMIMEStream,
  SBMIME,
  {$IFDEF _UUE_}
  SBMIMEUUE,
  {$ENDIF}
  {$IFDEF _SMIME_}
  {$IFNDEF DELPHI_NET}
  SBChSConv,
  {$ENDIF}
  SBCustomCertStorage,
  SBSMIMECore,
  SBConstants,
  SBX509,
  SBX509Ext,
  SBRDN,
  {$ENDIF}
  {$IFDEF _PGP_}
  SBPGPMIME,
  SBPGPKeys,
  SBPGPUtils,
  {$ENDIF}
  // VCL units:
  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus,
  Buttons;

{$warnings on}

const
  cDemoVersion = '2004.10.22';

type
  TMakerForm = class(TForm)
    pTop: TPanel;
    pTopL: TPanel;
    pTopLCap: TPanel;
    memoPlainText: TMemo;
    checkUsePlainText: TCheckBox;
    spTopV: TSplitter;
    pTopR: TPanel;
    pTopRCap: TPanel;
    memoHTML: TMemo;
    checkUseHTML: TCheckBox;
    StatusBar: TStatusBar;
    pBottm: TPanel;
    spH: TSplitter;
    listFileNames: TListBox;
    MainMenu: TMainMenu;
    miFile: TMenuItem;
    miAssembleandSave: TMenuItem;
    N1: TMenuItem;
    miExit: TMenuItem;
    miHelp: TMenuItem;
    miAbout: TMenuItem;
    pBottmCap: TPanel;
    lAttachments: TLabel;
    bBottmBtn: TPanel;
    btnAddAttach: TBitBtn;
    btnRemoveAttach: TBitBtn;
    OpenDialog: TOpenDialog;
    SaveDialog: TSaveDialog;
    pSubj: TPanel;
    cbAttachAsUUE: TCheckBox;
    mUUEInfo: TMemo;
    ODC: TOpenDialog;
    pLeft: TPanel;
    pFrom: TPanel;
    pTo: TPanel;
    pSubject: TPanel;
    lFrom: TLabel;
    lTo: TLabel;
    lSubj: TLabel;
    editFrom: TEdit;
    editTo: TEdit;
    editSubject: TEdit;
    pCC: TPanel;
    lCC: TLabel;
    editCC: TEdit;
    pSecurity: TPanel;
    pSecCombo: TPanel;
    cbSecurity: TComboBox;
    pSMIME: TPanel;
    pPGPMIME: TPanel;
    lCerts: TLabel;
    lvCryptCerts: TListView;
    btnCryptLoad: TBitBtn;
    btnCryptRemove: TBitBtn;
    cbEncryptMessageSMIME: TCheckBox;
    cbSignMessageSMIME: TCheckBox;
    cbEncryptMessagePGPMIME: TCheckBox;
    cbSignMessagePGPMIME: TCheckBox;
    editPublicKeyring: TEdit;
    editSecretKeyring: TEdit;
    lPubRing: TLabel;
    lSecRing: TLabel;
    btnSelectPub: TBitBtn;
    btnSelectSec: TBitBtn;
    OpenDialogKeyring: TOpenDialog;
    lvSignCerts: TListView;
    btnSignLoad: TBitBtn;
    btnSignRemove: TBitBtn;
    Label1: TLabel;
    procedure miAboutClick(Sender: TObject);
    procedure miExitClick(Sender: TObject);
    procedure miAssembleandSaveClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure spHCanResize(Sender: TObject; var NewSize: Integer;
      var Accept: Boolean);
    procedure btnAddAttachClick(Sender: TObject);
    procedure btnRemoveAttachClick(Sender: TObject);
    procedure btnCryptLoadClick(Sender: TObject);
    procedure cbSecurityChange(Sender: TObject);
    procedure btnSelectPubClick(Sender: TObject);
    procedure btnSelectSecClick(Sender: TObject);
    procedure btnCryptRemoveClick(Sender: TObject);
    procedure btnSignRemoveClick(Sender: TObject);
    procedure btnSignLoadClick(Sender: TObject);
  private
    {$IFDEF _SMIME_}
    FEnryptCertStorage,
    FSignCertStorage : TElMemoryCertStorage;
    {$endif}
    {$IFDEF _PGP_}
    FSecretRing : TElPGPKeyring;
    FPublicRing : TElPGPKeyring;
    procedure PGPMIMEKeyPassphrase(Sender: TObject; Key : TElPGPCustomSecretKey;
      var Passphrase: string; var Cancel: boolean);
    {$ENDIF}
  public
    { Public declarations }
  end;

var
  MakerForm: TMakerForm;

implementation

uses
  SBMIMEUtils,
  SBUtils;

{$R *.DFM}

procedure TMakerForm.FormCreate(Sender: TObject);
begin
  editSubject.Text := 'EldoS MimeBlackbox Example. Version: '+cDemoVersion;
  {$IFDEF _UUE_}
  cbAttachAsUUE.Enabled := True;
  {$ENDIF}
  {$IFDEF _SMIME_}
  cbSignMessageSMIME.Enabled := True;
  cbEncryptMessageSMIME.Enabled := True;
  btnCryptLoad.Enabled := True;
  btnCryptRemove.Enabled := True;

  btnSignLoad.Enabled := True;
  btnSignRemove.Enabled := True;

  FEnryptCertStorage := TElMemoryCertStorage.Create(nil);
  FSignCertStorage := TElMemoryCertStorage.Create(nil);
  {$ENDIF}
  {$IFDEF _PGP_}
  editPublicKeyring.Enabled := True;
  editSecretKeyring.Enabled := True;
  btnSelectPub.Enabled := True;
  btnSelectSec.Enabled := True;
  cbSignMessagePGPMIME.Enabled := True;
  cbEncryptMessagePGPMIME.Enabled := True;
  FSecretRing := TElPGPKeyring.Create(nil);
  FPublicRing := TElPGPKeyring.Create(nil);
  {$ENDIF}
  cbSecurity.ItemIndex := 0;
  pSMIME.Visible := false;
  pPGPMIME.Visible := false;

end;

procedure TMakerForm.FormDestroy(Sender: TObject);
begin
  {$IFDEF _SMIME_}
  FEnryptCertStorage.Free;
  FSignCertStorage.Free;
  {$endif}
  {$IFDEF _PGP_}
  FSecretRing.Free;
  FPublicRing.Free;
  {$ENDIF}
end;

procedure TMakerForm.miAboutClick(Sender: TObject);
begin
  ShowMessage('EldoS MIMEBlackbox Demo Application.'#13#10'Mime maker , version: '+cDemoVersion+#13#10#13#10+
  '(' +cXMailerDefaultFieldValue + ')'#13#10#13#10+
  'Homepage: http://www.secureblackbox.com')
end;

procedure TMakerForm.miExitClick(Sender: TObject);
begin
  Close;
end;

procedure TMakerForm.miAssembleandSaveClick(Sender: TObject);
var
  iPartCount, i: Integer;

  msg: TElMessage;
  res: HRESULT;
  sm: TAnsiStringStream;
  {$IFDEF _RepackTest}
  sm0: TAnsiStringStream;
  {$ENDIF}

  par,
  ammp,
  mmp: TElMultiPartList;
  mpt: TElPlainTextPart;
  mpc: TElMessagePart;

  s: AnsiString;
  {$IFDEF _UUE_}
  uue: TElMessagePartHandlerUUE;
  {$ENDIF}
  {$IFDEF _SMIME_}
  smime: TElMessagePartHandlerSMime;
  {$ENDIF}
  {$IFDEF _PGP_}
  pgpmime: TElMessagePartHandlerPGPMime;
  {$ENDIF}

begin
  {$IFDEF _SMIME_}
  smime := nil;
  {$ENDIF}
  {$IFDEF _PGP_}
  pgpmime := nil;
  {$ENDIF}

  iPartCount := 0;
  if checkUsePlainText.Checked then
    inc(iPartCount);
  if checkUseHTML.Checked then
    inc(iPartCount);
  if listFileNames.Items.Count > 0 then
    inc(iPartCount);

  if iPartCount = 0 then
  begin
    ShowMessage('Warning: Please define any mime part !');
    exit;
  end;

  if not SaveDialog.Execute then
    exit;

  msg := nil;
  sm  := nil;
  mmp := nil;

  {$IFDEF _RepackTest}
  sm0 := nil;
  {$ENDIF}

  //try

    {$IFDEF _RepackTest}
    sm0 := TAnsiStringStream.Create;
    sm0.LoadFromFile('.\Received.eml');
    msg := TElMessage.Create(False{== do not create default main part});
    msg.ParseMessage(
        sm0,
        '',
        '',
        [mpoStoreStream, mpoLoadData, mpoCalcDataSize],
        False,
        False,
        False
    );
    {$ENDIF}

    if msg = nil then
    begin

    if iPartCount = 1 then
    begin
      msg := TElMessage.Create(False{== do not create default main part});
      if checkUsePlainText.Checked then
      begin
        mpt := TElPlainTextPart.Create(msg, mmp);
        msg.SetMainPart(mpt, False);
        mpt.SetText( memoPlainText.Text );
      end
      else
      if checkUseHTML.Checked then
      begin
        mpt := TElPlainTextPart.Create(msg, mmp);
        msg.SetMainPart(mpt, False);
        mpt.SetContentSubType('html', True);
        mpt.SetText( memoHTML.Text );
      end
      else
      begin
        {$IFDEF _UUE_}
        if cbAttachAsUUE.Enabled then
        begin
          mpt := TElPlainTextPart.Create(msg, mmp);
          msg.SetMainPart(mpt, False);
          uue := TElMessagePartHandlerUUE.Create(nil);
          mpt.MessageBodyPartHandler := uue;
          for i := 0 to listFileNames.Items.Count-1 do
            uue.AddAttachedFile(listFileNames.Items[i]);
        end
        else
        {$ENDIF}
        for i := 0 to listFileNames.Items.Count-1 do
          msg.AttachFile(''{ == application/octet-stream'}, listFileNames.Items[i]);
      end;
    end
    else
    begin
      msg := TElMessage.Create(False{== do not create default main part});
      mmp := TElMultiPartList.Create(msg, nil);
      msg.SetMainPart(mmp, False);

      par := mmp;

      if checkUsePlainText.Checked and checkUseHTML.Checked then
      begin
        if (listFileNames.Items.Count = 0) then
        begin
          mmp.SetContentType('multipart', true);
          mmp.SetContentSubtype('alternative', false);
        end
        else
        begin
          ammp := TElMultiPartList.Create(msg, mmp);
          mmp.AddPart(ammp);
          par := ammp;
          ammp.SetContentType('multipart', true);
          ammp.SetContentSubtype('alternative', false);
          mmp.SetContentType('multipart', true);
          mmp.SetContentSubtype('mixed', false);
        end;
      end;

      if checkUsePlainText.Checked then
      begin
        mpt := TElPlainTextPart.Create(msg, par);
        par.AddPart(mpt);
        mpt.SetText( memoPlainText.Text );
      end;

      if checkUseHTML.Checked then
      begin
        mpt := TElPlainTextPart.Create(msg, par);
        par.AddPart(mpt);
        mpt.SetContentSubType('html', True);
        mpt.SetText( memoHTML.Text );
      end;

      if listFileNames.Items.Count > 0 then
      begin
        for i := 0 to listFileNames.Items.Count-1 do
        begin
          // msg.AttachFile(''{ == application/octet-stream'}, listFileNames.Items[i]);
          // or manual:

          sm := TAnsiStringStream.Create;

          mpc := TElMessagePart.Create(msg, mmp);
          mmp.AddPart(mpc);

          s := ExtractFileName(listFileNames.Items[i]);

          with mpc.Header.AddField('Content-Type', 'application/octet-stream', True) do
            AddParam('name', s);
          with mpc.Header.AddField('Content-Disposition', 'attachment', True) do
            AddParam('filename', s);
          mpc.Header.AddField('Content-Transfer-Encoding', 'base64', True);

          sm.LoadFromFile(listFileNames.Items[i]);
          mpc.SetData(sm, sm.Size, False); // stream controled in mpc
          sm := nil;

        end;//of: for i

      end;//of: if listFileNames.Items.Count > 0

    end;//of: if iPartCount = 1

    end;

    {$IFDEF _SMIME_}
    if (cbSecurity.ItemIndex = 1) and (cbSignMessageSMIME.Checked or cbEncryptMessageSMIME.Checked) then
    begin
      smime := TElMessagePartHandlerSMime.Create(nil);
      smime.EncoderCryptCertStorage := FEnryptCertStorage;
      smime.EncoderSignCertStorage := FSignCertStorage;
      msg.MainPart.MessagePartHandler := smime;
      if cbSignMessageSMIME.Checked then
      begin
        smime.EncoderSigned := True;
        smime.EncoderSignOnlyClearFormat := True;
        smime.EncoderMicalg := 'sha1';
      end;
      if cbEncryptMessageSMIME.Checked then
      begin
        smime.EncoderCrypted := True;
        smime.EncoderCryptBitsInKey := 128;
        smime.EncoderCryptAlgorithm := SB_ALGORITHM_CNT_3DES;
      end;
    end;
    {$ENDIF}

    {$IFDEF _PGP_}
    if (cbSecurity.ItemIndex = 2) and (cbSignMessagePGPMIME.Checked or
      cbEncryptMessagePGPMIME.Checked) then
    begin
      pgpmime := TElMessagePartHandlerPGPMime.Create(nil);
      msg.MainPart.MessagePartHandler := pgpmime;
      if cbSignMessagePGPMIME.Checked then
      begin
        pgpmime.Sign := true;
        pgpmime.SigningKeys := FSecretRing;
        pgpmime.OnKeyPassphrase := PGPMIMEKeyPassphrase;
      end;
      if cbEncryptMessagePGPMIME.Checked then
      begin

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?