Announcement

Collapse
No announcement yet.

Outlook , Beispiel aus COM/DCOM (Herr Kosch)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Outlook , Beispiel aus COM/DCOM (Herr Kosch)

    Hallo,<BR>
    Heute habe das Beispiel 'versenden mail über outlook'<BR>
    probiert.<BR>
    Das Project ist allerdings aus dem alten Buch.<BR>
    Testumgebung: D4 , XP, Xp-office.<BR>
    Leider funktioniert das übergeben des body nicht.<BR>
    Bin leider ratlos !<BR>
    <BR>
    Vieleicht noch eine Frage (gehört eigentlich nicht in diesen Ordner):<BR>
    Der Umstieg auf COM erfolgte hier nur, weil es anscheinend über MAPI<BR>
    nicht möglich ist, RTF-Text zu übergeben. Ist das korrekt ?<BR>
    <BR>
    <BR>
    Mfg Sigbert

  • #2
    Hallo,

    das folgende Beispielprojekt ist aus dem neuen Buch und demonstriert die Übergabe des RTF-Textes eines Word-Dokument an den eMail-Body:
    <pre>
    { ************************************************** **************
    Source File Name : OutlookDispIDFrm.PAS
    Typ : Hauptformular-Unit
    Autor : Andreas Kosch
    Erstellt am : 12.11.1998
    Compiler : Delphi 4.02 CSS / Delphi 5 Enterprise
    Betriebssystem : Windows 95 / Windows NT 4 SP 5
    Revisionen : 21.12.99 Outlook 2000
    ************************************************** ************** }

    unit Outlook2000TestFrm;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ComCtrls, StdCtrls, Buttons, ExtCtrls, Word2000, OleServer;

    type
    TFormMain = class(TForm)
    StatusBar1: TStatusBar;
    GroupBoxMail: TGroupBox;
    BitBtnMail: TBitBtn;
    EditMailAddress: TEdit;
    EditMailSubject: TEdit;
    MemoMailBody: TMemo;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    WordApplication1: TWordApplication;
    WordDocument1: TWordDocument;
    procedure BitBtnMailClick(Sender: TObject);
    private
    { Private-Deklarationen}
    public
    { Public-Deklarationen}
    end;

    var
    FormMain: TFormMain;

    implementation

    {$R *.DFM}

    uses ComObj, Outlook_TLB, ActiveX;

    var
    dwStart, dwEnd : DWord; // Ausführungszeit stoppen

    procedure TFormMain.BitBtnMailClick(Sender: TObject);
    const
    RTF_NAME = 'Rich Text Format';
    RTF_NAME_MAX = 254;
    var
    aDataObject : IDataObject;
    aEnumFmt : IEnumFORMATETC;
    aFormatEtc : TFormatEtc;
    aMedium : TStgMedium;
    pFmtName : PChar;
    bFmtFound : Boolean;
    pRTFData : PChar;
    aIUnknown : IUnknown;
    //
    aOutlook : _Application;
    aMAPI : NameSpace;
    aOutbox : MAPIFolder;
    aMail : MailItem;
    aReci : Recipient;
    vDOCPath : OleVariant;
    vReadOnly : OleVariant;
    begin
    vDOCPath := 'C:\Temp\Test.rtf';
    vReadOnly := True;
    WordApplication1.Connect;
    WordApplication1.Documents.OpenOld(vDOCPath, EmptyParam, vReadOnly,
    EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
    EmptyParam, EmptyParam);
    WordDocument1.ConnectTo(WordApplication1.ActiveDoc ument);

    aIUnknown := WordApplication1.ActiveDocument as IUnknown;
    aIUnknown.QueryInterface(IDataObject, aDataObject);
    // IDataObject der Quelle ok ?
    if aDataObject = nil then
    Abort;
    // cfFormat-Wert für den RTF-Inhalt des Word-Dokuments ermitteln
    bFmtFound := False;
    OleCheck(aDataObject.EnumFormatEtc(DATADIR_GET, aEnumFmt));
    while (not bFmtFound) and
    (aEnumFmt.Next(1, aFormatEtc, nil) = S_OK) do
    begin
    pFmtName := AllocMem(RTF_NAME_MAX + 1);
    GetClipBoardFormatName(aFormatEtc.cfFormat, pFmtName, RTF_NAME_MAX);
    if (String(pFmtName) = RTF_NAME) then
    bFmtFound := True;
    FreeMem(pFmtName);
    end;
    if not bFmtFound then
    Abort;
    OleCheck(aDataObject.GetData(aFormatEtc, aMedium));
    // RTF-Format wird über einen globalen Puffer übergeben
    pRTFData := GlobalLock(aMedium.hglobal);
    try
    //ShowMessage(pRTFData);
    StatusBar1.SimpleText := 'eMail wird über Outlook verschickt...';
    dwStart := GetTickCount;
    Screen.Cursor := crHourglass;
    aOutLook := CoOutlookApplication.Create;
    try
    aMAPI := aOutlook.GetNameSpace('MAPI');
    aOutbox := aMAPI.GetDefaultFolder(olFolderOutbox);
    aMail := aOutbox.Items.Add(olMailItem) as MailItem;
    aReci := aMail.Recipients.Add(EditMailAddress.Text);
    aReci.Type_ := olTo;
    // Empfänger prüfen (falls nicht bekannt -> Exception)
    aReci.Resolve;
    aMail.Subject := EditMailSubject.Text;
    aMail.Body := pRTFData;
    // eMail senden
    aMail.Send;
    finally
    aOutlook := nil;
    Screen.Cursor := crDefault;
    end;
    finally
    GlobalUnlock(aMedium.hglobal);
    end;
    dwEnd := GetTickCount;
    StatusBar1.SimpleText := Format('Ausführungszeit: %d Windows-Ticks',
    [dwEnd - dwStart]);
    end;

    initialization
    OleInitialize(nil);

    finalization
    OleUninitialize;

    end.
    </pre>
    Da der RTF-Text nur aus ASCII-Zeichen besteht, kann dieser immer zugewiesen werden (der Weg zum Abschicken der eMail ist daher egal)

    Comment


    • #3
      Danke,<BR>
      Sie schreiben:<BR>
      Da der RTF-Text nur aus ASCII-Zeichen besteht, kann dieser immer <BR>zugewiesen werden (der Weg zum Abschicken der eMail ist daher<BR> egal).<BR>
      <BR>
      Ich vermute, dies ist die Antwort auf meine 2. Frage ?<BR>
      Vieleicht ist meine Vorgehensweise ja falsch:<BR>
      RTF in Word speichern > mit Editor öffnen > Text nehmen<BR>
      Versuch 1: über COM-Beispiel(aber nicht über Word): Text in Body <BR>
      Versuch 2: Outlook neue message (format RTF) einfügen Text (Clipboard)<BR>
      Versuch 3: über MAPI Text in Body<BR>
      <BR>
      alle 3 versuche führen nur zur Anzeige der RTF-Formatzeichen.<BR>
      <BR>
      <BR>

      Mfg Sigber

      Comment

      Working...
      X