Announcement

Collapse
No announcement yet.

Über Delphi aus Word eMails versenden.

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

  • Über Delphi aus Word eMails versenden.

    Moin!<br>
    Ich möchte aus Delphi Word veranlassen eMails zu verschicken.<br>
    Bisher habe ich es nur soweit gebracht, daß er diverse Fenster öffnet, auf die ich - programmtechnisch - keinen Einfluß mehr habe.<br>
    Wenn ich eine eMail aus Word (per Hand) versende, und gleichzeit ein Macro aufzeichnen lasse, dann versagt das Macro an der Stelle, wo es ernst wird: Einfach mal ausprobieren! Marco aufzeichen;Dann Datei/Senden an/Mailempfänger; u.s.w. Das einzige was der aufzeichent ist das Anzeigen des Fensters!!!<br>
    Wie also Word aus Delphi dazu überreden, eine eMail zu versenden?<br>
    Ich verwende Delphi5 Ent. mit den Office 2000 Komponenten.<br>
    <br>
    Danke,<br>
    MFG,cu,LLAP Ralph

  • #2
    Hallo,

    der Fall ist einfach. Word 2000 blendet einfach die Funktionalität von MS Outlook 2000 ein. Anstelle einen Weg zu suchen, diese nur in Word sichtbaren Eingabefelder vom Programm ausfüllen zu lassen, würde ich direkt die eMail über MS Outlook (Automation) verschicken. Beispiele dafür sollten gleich mehrfach hier im FORUM über die Suche zu finden sein

    Comment


    • #3
      Danke.<BR>
      Aber es soll so laufen, daß wir vordefinierte Dokumente (unter Word) haben, in die der User auch 'rumfummeln darf.<BR>
      Diese Dokumente soll ich zur Laufzeit füllen (mit Namen u.s.w.) und dann abschicken.<BR>
      Wenn ich das richtig sehe, müßte ich unter Outlook eine komplett neue eMail schreiben. Aber wir wollten es eben verhindern, in unserer DB Textbausteine zu hinterlegen, um so die Textbearbeitung (Rechtschreibfehler ausbügeln, Freundlichere Formulierung, u.s.w) etwas enfacher für den User machen - und für uns <BR>
      Trotzdem Danke für die Mühe.<BR>
      MFG,cu,LLAP Ralp

      Comment


      • #4
        Hallo,

        ja - das ist ein Argument für das direkte Verschicken. Falls man in Word die <b>SendMail</b>-Methode aufruft, wird der Dialog für den Empfänger etc. eingeblendet, wobei man via <b>SendMailAttach</b> festlegen kann, das Word-Dokument als Anhang beizufügen:
        <pre>
        procedure TForm1.ButtonConnectClick(Sender: TObject);
        begin
        WordApplication1.Connect;
        WordApplication1.Documents.AddOld(EmptyParam, EmptyParam);
        WordDocument1.ConnectTo(WordApplication1.ActiveDoc ument);
        WordApplication1.Options.SendMailAttach := True;
        WordDocument1.SendMail;
        end;
        </pre>
        Diesen Weg kann man auch direkt in Outlook gehen, indem das vom Programm automatisch ausgefüllte Word-Dokument als Anhang in die eMail eingebunden wird:
        <pre>
        Outlookitem.Attachments.Add('C:\tmp\Maildoc.doc');
        </pre&gt

        Comment


        • #5
          Moin!<br>
          Leider habe ich mich anscheinden nicht richtig ausgedückt.<br>
          Unter Word wird die eMail "geschrieben": In einer Vorlage (Formular) soll das Programm Textfelder füllen, und dann so abschicken.<br>
          Der Text soll dann die eMail sein.<br>
          Bei diesen Vorschlägen würde das Dokument nur als Anhang geschickt. Sähe blöd aus, wenn im Anhang ein Word2K Dokument steckt in dem sowas wie "Danke für die Mail" steht... <br>
          Danke.<br>
          MFG,cu,LLAP Ralph<br&gt

          Comment


          • #6
            Hallo,

            es hindert einen niemand, direkt formatierten RTF-Text als Body-Textinhalt zu verwenden. In Word kann man die Daten im RTF-Format abspeichern und mit Delphi als Textdatei einlesen. Das folgende Beispiel verwendet allerdings eine Konstante:
            <pre>
            const
            cRTFText = '{\rtf1\ansi\ansicpg1252\deff0\deftab720{\fonttbl' +
            '{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}'+
            '{\f2\froman Times New Roman;}}{\colortbl\red0\green0\blue0;}'+
            '\deflang1031\horzdoc{\*\fchars }{\*\lchars }\pard\plain\f2\fs20 '+
            ' Hier kommt ein \plain\f2\fs24\b formatiertert\plain\f2\fs20 '+
            ' Text.\par }';
            </pre>
            Dieser RTF-Zeichenblock kann als Textinhalt an Outlook übergeben werden, so das der Inhalt direkt im Nachrichtenfenster erscheint.
            <pre>
            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 := cRTFText;
            // eMail senden
            aMail.Send;
            finally
            aOutlook := nil;
            Screen.Cursor := crDefault;
            end;
            </pre&gt

            Comment


            • #7
              Moin!<BR>
              Sie haben mich auf eine Idee gebracht!<BR>
              Ich erstelle unter Word die eMail, dann ziehe ich mir den gesamten Text aus Word und stecke das in Ihre Zeilen - und es klappt (freu <BR>
              MFG,cu,LLAP Ralph<BR&gt

              Comment


              • #8
                Hallo,

                das folgende Beispiel zeigt, wie man sich den aktuellen Dokumentinhalt im RTF-Format über das <b>IDataObject</b>-Interface besorgen und als eMail verschicken kann. Der "Umweg" über die RTF-Datei ist damit nicht mehr notwendig:
                <pre>
                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;
                </pre&gt

                Comment


                • #9
                  Moin!<BR>
                  Danke. Ich werde mir das im Hinterkopf behalten - bzw. in mein Papierstapel (1m hoch :O ) stecken .<BR>
                  Sobald es gebraucht wird, werde ich mir das genauer ansehen.<BR>
                  So wie es jetzt ist, klappt es, und wir haben in der Firma nicht soo die Zeit für Experimente.<BR>
                  Nochmal Danke und<BR>
                  MFG,cu,LLAP Ralp

                  Comment

                  Working...
                  X