Outlook 2015 und Mail Massenversand

Einbindung von Office-Komponenten wie Word, Excel usw.

Moderator: Moderatoren

Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2013 und Mail Massenversand

Beitrag von MichaMB »

sorry, berichtigter Teil-Code,
DBF und Ursprungsvariablen müssen natürlich in das Hauptprogramm, nicht an den Anfang der Function
// die restlichen Info benötige ich noch fürs lernen :-)

Code: Alles auswählen

 
Procedure Emmailou
...
   local cAnrede  := ""                      
   local cGruss   := ""
   Local infmesss := ""
   Local Infmess1 := ""
   Local Infmess2 := ""
   Local cAdresses    := (Emilwer)
   Local cSubject     := (Betrmail)

//   local cMessage     := (infmess0) + (Chr(13))+(Chr(13))+(infmess1)+(Chr(13))+(infmess2)+(Chr(13))+(Chr(13))+(infmesss)+(Chr(13))+(Chr(13))+(infmess3b)+(Chr(13))+(infmess3c)+(Chr(13))+(Chr(13))+(infmess4)+(Chr(13))+(infmess3)+(Chr(13))+(infmess5)+(Chr(13))+(Chr(13))+(infmess6)+(Chr(13))+(Chr(13))+(infmess7)+(Chr(13))+(Chr(13))+(infmess8a)+(Chr(13))+(infmess8)+(Chr(13))+(infmess9)+(Chr(13))+(Chr(13))+(infmess10)+(Chr(13))+(Chr(13))+(infmess11)+(Chr(13))+(Chr(13))+(infmess12)
   Local cMessage     := (Infmess0)
   Local cAttachments :=  (Anhangx)
   Local nFlag        :=  NOFLAG
   Local nErr

   set default to (substr(FESTWO,1,1) + ":")
   set path to (substr(FESTWO,1,1) + ":")
   set default to (verzword)
   SET PATH to (verzword)

   ersit400  := ConvToAnsiCP("Newsletter")
   betrmail  := (ersit400)

   if firmist = .t.
     ersitz17b := '"' + (verzword) + '\' + ConvToAnsiCP('NEWSG.PDF') + '"'
   else
     ersitz17b := '"' + (verzword) + '\' + ConvToAnsiCP('NEWSP.PDF') + '"'
   endif
   anhangx   := (ersitz17b)

   cAttachments :=  &Anhangx

   store "  " to infmess1
   store "  " to infmess2
   store 1 to AnzAnhaenge

   set default to (substr(FESTWO,1,1) + ":")
   set path to (substr(FESTWO,1,1) + ":")
   set default to (verzdat)
   SET PATH to (verzdat)

   sele j
   use
   // Datenbank auswählen
   cDatei    := "KUMAIL"                   // die DBF ( Namen sprechend) um die es geht
   use (cDatei) shared new                 // DBF in neuem Arbeitsbeeich ”ffnen
   nKumail   := select()                   // Arbeitsbereich (mit sprechendem Namen) benennen

   cPersdu   := upper(Persdu)              // Datenbankfeld "D" = Kunde per Du
   cKOMO     := upper(KOMO)               // Achtung Public Variable "KOMO" aus dem Vorprogramm bergeben
   cVorname  := alltrim(Vorname)
   cName     := alltrim(Name)
   cPPname   := alltrim(PPname)            // Partner Vorname
   cPAName   := alltrim(PAName)            // Partner Nachname
   cANR      := alltrim(ANR)               // Herrn, Frau, Firma, Praxis, WEG usw.
   cFLOSKEL  := alltrim(Floskel)           // Erg„nzung nach sehr geehrt "e  Damen und Herren"  bzw. "er Herr"   bzw. "e Frau"
   cPG       := upper(PG)                  // M = M„nnlich W = weiblich
   nZEICHINH := Zeichinh                   // Firmeninhaber = 1   2. Inhaber = 2
   isfirmist := Firmist = .t.


   // Anrede speichern, alle abhängigen Infos bergeben ...
   infmess0 := GetAnrede( cPersdu, cKOMO, IsFirmist, NZEICHINH, cVorname, cName, cPPname, cFloskel, cPG, cANR )

   // Grussformel in der Email
   infmess := GetGruss( cPersdu, cKOMO, IsFirmist, NZEICHINH, cVorname, cName, cPPname, cFloskel, cPG, cANR )

   // Email Text 2-Zeilig    infmess1 und infmess2
   // "MXXXXXXXXX@T-Online.de;" + "info@MXXXXXXXXXXXXXXX.de;" + "CC:MXXXXXXXXXXXX@T-Online.de;" + "BCC:info@SXXXXXXXXXXXXXXXXX.de"

      if Isfirmist
        if nZEICHINH = 1
          emilwer := alltrim((nKumail)->EMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer :=  '"Keine E-Mail von Kunde, Arbeitgeber gespeichert"'
            endif
          endif
        else
          emilwer := alltrim((nKumail)->EPMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer := '"Keine E-Mail von Partner, Arbeitgeber gespeichert"'
            endif
          endif
        endif
      else
        emilwer := alltrim((nKumail)->EMAIL)
        if len(Emilwer) < 2
          emilwer := alltrim((nKumail)->EPMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer := '"Keine E-Mail von Kunde, Partner, Arbeitgeber gespeichert"'
            endif
          endif
        endif
      endif
      IF cPersdu = "D"
        infmess1 := "in der Anlage erh„ltst Du unseren Newsletter mit aktuellen Informationen."
        infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Dir fr weitere Fragen zur Verfgung."
      else
        infmess1 := "in der Anlage erhalten Sie unseren Newsletter mit aktuellen Informationen."
        infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Ihnen fr weitere Fragen zur Verfgung."
      endif
      infmesss     := ConvToAnsiCP(cGruss)
      infmess0     := ConvToAnsiCP(cAnrede)
      infmess1     := ConvToAnsiCP(infmess1)
      infmess2     := ConvToAnsiCP(infmess2)
      EMILWER      := ConvToAnsiCP(EMILWER)
      cAdresses    := (Emilwer)
      cMessage     := (infmess0)+(Chr(13))+(Chr(13))+(infmess1)+(Chr(13))+(infmess2)+(Chr(13))+(Chr(13))+(infmesss)+(Chr(13))+(Chr(13))+(infmess3b)+(Chr(13))+(infmess3c)+(Chr(13))+(Chr(13))+(infmess4)+(Chr(13))+(infmess3)+(Chr(13))+(infmess5)+(Chr(13))+(Chr(13))+(infmess6)+(Chr(13))+(Chr(13))+(infmess7)+(Chr(13))+(Chr(13))+(infmess8a)+(Chr(13))+(infmess8)+(Chr(13))+(infmess9)+(Chr(13))+(Chr(13))+(infmess10)+(Chr(13))+(Chr(13))+(infmess11)+(Chr(13))+(Chr(13))+(infmess12)



   set default to (substr(FESTWO,1,1) + ":")
   set path to (substr(FESTWO,1,1) + ":")
   set default to (verzexe)
   SET PATH to (verzexe)

  do sendnews


return
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Nachdem dem Aufruf des Programmes kommt ganz zum Schluss die Fehlermeldung:
unbekannte Variable "scDLLSocMapiPostMail
Thread ID:3 Sendnow
fehlt mir da eine DLL ?

Code: Alles auswählen

PROCEDURE SENDNOW( cAdresses, cSubject, cMessage, cAttachments, nFlag )
   // Flag setzen
   lisRunning := .T.
   BEGIN SEQUENCE
    //-- Store mail directly to outbox
        MsgBox("mail will be stored directly to outbox")
        nErr := DllExecuteCall( scDLLSocMapiPostMail,cAdresses,cSubject,cMessage,cAttachments,nFlag)
        if nErr != SUCCESS_SUCCESS
            break nErr
        endif
   // MsgBox("mail successfully stored to outbox")
   RECOVER USING nErr
   // Fehlerbehandlung
   END SEQUENCE
   // Flag ausschalten
   lisRunning := .F.

RETURN
LG
Micha
lG
Micha
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2013 und Mail Massenversand

Beitrag von AUGE_OHR »

MichaMB hat geschrieben:

Code: Alles auswählen

Procedure Emmailou
...
  do sendnews // ???
return
und wie kommen deine Variabel in die Function ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2015 und Mail Massenversand

Beitrag von AUGE_OHR »

MichaMB hat geschrieben:Nachdem dem Aufruf des Programmes kommt ganz zum Schluss die Fehlermeldung:
unbekannte Variable "scDLLSocMapiPostMail
Thread ID:3 Sendnow
fehlt mir da eine DLL ?

Code: Alles auswählen

PROCEDURE SENDNOW( cAdresses, cSubject, cMessage, cAttachments, nFlag )
        ...
        nErr := DllExecuteCall( scDLLSocMapiPostMail,cAdresses,cSubject,cMessage,cAttachments,nFlag)
wenn ich sage das du die ganzen #define, PUBLIC, PRIVAT und Fieldwide STATIC nicht posten musst heisst es noch lange nicht das du die nicht benötigst ...
also suche mal im Original Code nach "scDLLSocMapiPostMail" nach dem DllPrepareCall()

aber nochmal : wenn du die Parameter ( cAdresses, cSubject, cMessage, cAttachments, nFlag ) nicht übergibst wird er auch nichts senden.

p.s. warum nimmst du scDLLSocMapiPostMail für den MAPI Client Editor ? willst du da noch "zusätzlich" was rein schreiben ?
gruss by OHR
Jimmy
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Jimmy, ich steh auf dem Schlauch...

1. ich will nichts mehr reinschreiben, dazu habe ich ja des andere funktionieren Programm mit Outlook öffnen und schließen

2. ich lese doch die Daten aus der DBF und speichere Sie im Programm "Emmailou.prg" + Funktionen in die Variablen cAdresses, cSubject, cMessage, cAttachments
allerdings nur einmal
dann müsste doch zumindest ein Versand gehen?
oder wie übergebe ich die Daten?
und wie übergebe ich den nächsten Satz ohne das Programm zu verlassen?

PROCEDURE ProcessInbox() rufe ich nicht auf, wegen den Meldungen
oder ist das der Fehler und ich muss nur die Meldungen ausblenden?
lG
Micha
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2015 und Mail Massenversand

Beitrag von AUGE_OHR »

MichaMB hat geschrieben:1. ich will nichts mehr reinschreiben, dazu habe ich ja des andere funktionieren Programm mit Outlook öffnen und schließen
wollte nur nachfrage denn das könnte wieder andere Problem geben ...
MichaMB hat geschrieben:2. ich lese doch die Daten aus der DBF und speichere Sie im Programm "Emmailou.prg" + Funktionen in die Variablen cAdresses, cSubject, cMessage, cAttachments
allerdings nur einmal
dann müsste doch zumindest ein Versand gehen?
oder wie übergebe ich die Daten?
und wie übergebe ich den nächsten Satz ohne das Programm zu verlassen?
em, äh ... du weist was eine LOCAL oder Fieldwide STATIC ist ?

Code: Alles auswählen

#include "..."
#define blabla ...
STATIC lisRunning := .F.             // Fieldwide STATIC ob der Thread läuft
STATIC scDLLSocMapiPostMail := ""    // Handle DllPrepareCall()   
   ...
Procedure Emmailou
Local cAdresses    := ""   
Local cSubject     := ""
   ...
   DO WHILE !EOF()
      // statt FIELD wäre der ALIAS() angesagt
      cAdresses    := FIELD->Emilwer   
      cSubject     := FIELD->Betrmail

      // dBase Schreibweise "outdate" ...
      * do sendnews WITH cAdresses, cSubject ...

      // normaler Function Aufruf
      sendnews(cAdresses, cSubject ... )  // LOCAL als Parameter übergeben
   
      SKIP
   ENDDO
return

PROCEDURE SENDNEWS( cAdresses, cSubject, cMessage, cAttachments, nFlag )
   ...
   // Thread starten und Parameter übergeben 
   oMAPI:start( "SENDNOW", cAdresses, cSubject, cMessage, cAttachments, nFlag )
   SLEEP( 100 )    // warten ...   
   DO WHILE lisRunning = .T.    // solange der Thread läuft
      SLEEP( 10 )  // warten 
   ENDDO
   SLEEP( 100 )   // warten um sicher zu sein das der Thread wirklich nicht mehr "aktive" ist 
return

PROCEDURE SENDNOW( cAdresses, cSubject, cMessage, cAttachments, nFlag )
   ...
   lisRunning = .T.
   ...
   // hier nun der MAPI DLLcall
   ...
   lisRunning = .F.
return
MichaMB hat geschrieben:PROCEDURE ProcessInbox() rufe ich nicht auf, wegen den Meldungen
oder ist das der Fehler und ich muss nur die Meldungen ausblenden?
ich habe nicht nach ProcessInbox() gefragt ... oder wie kommst du darauf ?

p.s. man sollt mit /W compilieren und alle Warnungen korrigieren ...
gruss by OHR
Jimmy
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Jimmy,
das hatte ich ja fast alles schon so mit der alten Methode programmiert, lief leider nicht.
Nun habe ich etwas dazugelernt und neu programmiert...
läuft fehlerfrei durch, E-Mails werden aber nicht in Ausgangskorb gelegt und es wird auch nichts versendet, ich bekomme auch keine E-Mails die an mich kommen müssten
Wähle ich im Programm Sendnow die erste Methode mit DllExecuteCall( scDLLSocMapiSendMail , cAdresses, cSubject, cMessage, cAttachments, nFlag)
dann funktioniert es in soweit, dass jede E-Mail in Outlook geöffnet wird und mit klick auf senden kommt diese in den Ausgangskorb und es folgt das gleich Prozedere bei der nächsten E-Mail
nun noch einmal der ganze Code, vielleicht habe ich ja doch etwas übersehen...

Code: Alles auswählen


#define ....

//--Message Flags
#define NOFLAG                    0
#define FLAG_UNREAD               1
#define FLAG_RECEIPT_REQUESTED    2
#define FLAG_SENT                 4

//--SKIP Flags
#define SKIP_ONLY                 0
#define DELETE_THEN_SKIP          1

//--Function Handles
STATIC snDllHandle    := 0 
STATIC scDLLSocMapiIsInit    := ""    //Determines if MAPI is already initialized
STATIC scDLLSocMapiInit      := ""    //Initializes MAPI
STATIC scDLLSocMapiDeInit    := ""    //DeInitializes MAPI

STATIC scDLLSocMapiIsLoggedOn:= ""    //Dertermines if already logged onto a MAPI session.
STATIC scDLLSocMapiLogon     := ""    //Loggs onto a MAPI session
STATIC scDLLSocMapiLogoff    := ""    //Loggs off from a MAPI session

STATIC scDLLSocMapiSendMail  := ""    //Opens the mail editor with some preset Data.
STATIC scDLLSocMapiPostMail  := ""    //Directly puts a mail in the outbox (without a Dialog)

STATIC scDLLInboxOpen        := ""    //Initializes for further actions with the Inbox
STATIC scDLLInboxClose       := ""    //Frees memory that has been allocated with the inbox functions
STATIC scDLLInboxGoTop       := ""    //Positions the "Record pointer" to the first message in the inbox and reads it.
STATIC scDLLInboxSkip        := ""    //Skips to the next message in the inbox and reads it.

STATIC scDLLAskFlag          := ""    //Determines the Flags of a message (unread, Receipt requested, sent)
STATIC scDLLAskBufferSize    := ""    //Determines, how much buffer must be allocated for the following "StuffBuffer" call.
STATIC scDLLStuffBuffer      := ""    //Stuffs the buffer with a string for the desired message-element.

STATIC scDLLCountRecipients  := ""    //Counts the number of recipients for the current message.
STATIC scDLLCountAttachments := ""    //counts the number of attachments for the current message.
STATIC scDLLSaveAttachments  := ""    //Stores all attachments of a message to temporary files.
STATIC scDLLMarkAsRead       := ""    //Marks current message as read

//*************************************************************************** Init Procedure
// Init PROCEDURE //
////////////////////

STATIC lisRunning := .F.             // Fieldwide STATIC ob der Thread läuft


INIT PROCEDURE SocMapiI()

    //Load DLL
    snDllHandle       := DllLoad( "SocMapi.Dll" )
    if snDllHandle == 0
        MsgBox("SOCMAPI.DLL not found!")
        QUIT
    endif

    //Get Function handles from DLL.
    scDLLSocMapiIsInit    := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiIsInit"     )
    scDLLSocMapiInit      := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiInit"       )
    scDLLSocMapiDeInit    := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiDeInit"     )

    scDLLSocMapiIsLoggedOn:= DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiIsLoggedOn" )
    scDLLSocMapiLogon     := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiLogon"      )
    scDLLSocMapiLogoff    := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiLogoff"     )

    scDLLSocMapiSendMail  := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiSendMail"   )
    scDLLSocMapiPostMail  := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiPostMail"   )

    scDLLInboxOpen        := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxOpen"         )
    scDLLInboxClose       := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxClose"        )
    scDLLInboxGoTop       := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxGoTop"        )
    scDLLInboxSkip        := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxSkip"         )

    scDLLAskFlag          := DllPrepareCall( snDllHandle, DLL_STDCALL, "AskFlag"           )
    scDLLAskBufferSize    := DllPrepareCall( snDllHandle, DLL_STDCALL, "AskBufferSize"     )
    scDLLStuffBuffer      := DllPrepareCall( snDllHandle, DLL_STDCALL, "StuffBuffer"       )

    scDLLCountRecipients  := DllPrepareCall( snDllHandle, DLL_STDCALL, "CountRecipients"   )
    scDLLCountAttachments := DllPrepareCall( snDllHandle, DLL_STDCALL, "CountAttachments"  )
    scDLLSaveAttachments  := DllPrepareCall( snDllHandle, DLL_STDCALL, "SaveAttachments"   )
    scDLLMarkAsRead       := DllPrepareCall( snDllHandle, DLL_STDCALL, "MarkAsRead"        )

    //initialize MAPI
    if DllExecuteCall( scDLLSocMapiIsInit ) == 0
        nErr := DllExecuteCall( scDLLSocMapiInit )
        if nErr != 0
            MsgBox("MAPI could not be initialized!  Errorcode: " + ALLTRIM(str(nErr)) )
            QUIT
        endif
    endif

return
//*************************************************************************** Init Procedure

Procedure emmailou // das eigentliche Main für dieses Routine

  //   LOCAL Homepath := LEFT( APPNAME( .T. ), LEN( APPNAME( .T. ) ) - LEN( APPNAME( .F. ) ) )
  //  Local cAdresses    := (Emilwer)
  //  local cSubject     := (Betrmail)
  //  local cMessage     := (infmess0)+(Chr(13))+(Chr(13))+(infmess1)+(Chr(13))+(infmess2)+(Chr(13))+(Chr(13))+(infmesss)+(Chr(13))+(Chr(13))+(infmess3b)+(Chr(13))+(infmess3c)+(Chr(13))+(Chr(13))+(infmess4)+(Chr(13))+(infmess3)+(Chr(13))+(infmess5)+(Chr(13))+(Chr(13))+(infmess6)+(Chr(13))+(Chr(13))+(infmess7)+(Chr(13))+(Chr(13))+(infmess8a)+(Chr(13))+(infmess8)+(Chr(13))+(infmess9)+(Chr(13))+(Chr(13))+(infmess10)+(Chr(13))+(Chr(13))+(infmess11)+(Chr(13))+(Chr(13))+(infmess12)
  //  das ist das Muster => wichtig in Anfhrungszeichen Local cAttachments :=  "C:\MBNETZ\MAB\DRUWORD\BUEPOB.PDF;C:\MBNETZ\MAB\DRUWORD\BUEPLogo.PDF"
  //  Local cAttachments :=  &Anhangx
  //  local nFlag        :=  NOFLAG


  // Grundeinstellungen erfolgen in Global*.PRG (MAIN)  laut Programm-Anmeldung User
  // Emailadresse Empfänger =  cAdresses  eventuell ändern
  // public betrmail = cSubject   eventuell ändern
  // public Anlage1 = cAttachments  eventuell ändern
  // z.B. cAttachments cAttachments := (verzword)+ "/BUEPLogo.PDF"
  // wählt die Anzahl der Anhänge aus, je nach Emailart mit 1 2 oder 3 Anhängen
  // Public AnzAnhaenge   ANzahl in VZerstna vorgegeben
  // ist die Variable die die Anhänge für
  // Public Anhangx
  // wenn Nutzer geprüft und ok Variablen belegen
  // public Emilwer   Emailadresse Empfänger =  cAdresses
  // Vorbelegung für Anrede und Grüße in Email
  // public PERSWER
  // public betrmail = cSubject
  // public Anlage = cAttachments
  // Public infmess0      Text in mail = cMessage   Sehr geehrte Damen und Herren oder Hallo
  // Public infmess1   Text um was es geht
  // Public infmess2  Grußformel   Mit freundlichen Grüßen   bzw.   Viele Grüße
  // Public infmess3    Geschäftsfhrer
  // Public infmess3b   Unterzeichner
  // Public infmess3c   Abteilung
  // Public infmess4    Name Firma
  // Public infmess5    Firmensitz
  // Public infmess6    Web und EMail
  // Public infmess7    bei GMBH Registergericht und Nummer
  // Public infmess8    Registrierungsstelle des Vermittlers
  // Public infmess9    www.vermittlerregister.info
  // Public infmess10  Art der Tätigkeit  und Nummer
  // Public infmess11  Anschrift Gewerbeamt
  // Public infmess12   Versicherung und Nummer


   Public cAnrede  := ""                      // Public cAnrede :=""  falls in anderen Programmen gebraucht
   Public cGruss   := ""
   Public infmesss := ""
   Public Infmess1 := ""
   Public Infmess2 := ""
   Public cAdresses    := (Emilwer)
   Public cSubject     := (Betrmail)
   // local cMessage     := (infmess0) + (Chr(13))+(Chr(13))+(infmess1)+(Chr(13))+(infmess2)+(Chr(13))+(Chr(13))+(infmesss)+(Chr(13))+(Chr(13))+(infmess3b)+(Chr(13))+(infmess3c)+(Chr(13))+(Chr(13))+(infmess4)+(Chr(13))+(infmess3)+(Chr(13))+(infmess5)+(Chr(13))+(Chr(13))+(infmess6)+(Chr(13))+(Chr(13))+(infmess7)+(Chr(13))+(Chr(13))+(infmess8a)+(Chr(13))+(infmess8)+(Chr(13))+(infmess9)+(Chr(13))+(Chr(13))+(infmess10)+(Chr(13))+(Chr(13))+(infmess11)+(Chr(13))+(Chr(13))+(infmess12)
   Public cMessage     := (Infmess0)
   //  das ist das Muster => wichtig in Anfhrungszeichen Local cAttachments :=  "C:\MBNETZ\MAB\DRUWORD\BUEPOB.PDF;C:\MBNETZ\MAB\DRUWORD\BUEPLogo.PDF"
   // Local cAttachments :=  &Anhangx
   Public cAttachments :=  (Anhangx)
   Public nFlag        :=  NOFLAG
   Public nErr



   set default to (substr(FESTWO,1,1) + ":")
   set path to (substr(FESTWO,1,1) + ":")
   set default to (verzword)
   SET PATH to (verzword)

   // Datenbank unabh„ngige Variable "betrmail" fr alle Sendungen gleich
   ersit400  := ConvToAnsiCP("Newsletter")
   betrmail  := (ersit400)

   // anhangx  mit 2 Varianten gesch„ftlich oder privat
   if firmist = .t.
     ersitz17b := '"' + (verzword) + '\' + ConvToAnsiCP('NEWSG.PDF') + '"'
   else
     ersitz17b := '"' + (verzword) + '\' + ConvToAnsiCP('NEWSP.PDF') + '"'
   endif
   anhangx   := (ersitz17b)

   cAttachments :=  &Anhangx

   store "  " to infmess1
   store "  " to infmess2
   store 1 to AnzAnhaenge

   set default to (substr(FESTWO,1,1) + ":")
   set path to (substr(FESTWO,1,1) + ":")
   set default to (verzdat)
   SET PATH to (verzdat)

   sele j
   use
   // Datenbank ausw„hlen
   cDatei    := "KUMAIL"                   // die DBF ( Namen sprechend) um die es geht
   use (cDatei) shared new                 // DBF in neuem Arbeitsbeeich ”ffnen
   nKumail   := select()                   // Arbeitsbereich (mit sprechendem Namen) benennen

   cPersdu   := upper(Persdu)              // Datenbankfeld "D" = Kunde per Du
   cVorname  := alltrim(Vorname)
   cName     := alltrim(Name)
   cPPname   := alltrim(PPname)            // Partner Vorname
   cPAName   := alltrim(PAName)            // Partner Nachname
   cANR      := alltrim(ANR)               // Herrn, Frau, Firma, Praxis, WEG usw.
   cFLOSKEL  := alltrim(Floskel)           // Erg„nzung nach sehr geehrt "e  Damen und Herren"  bzw. "er Herr"   bzw. "e Frau"
   cPG       := upper(PG)                  // Partner  M = M„nnlich W = weiblich
   cKG       := upper(KG)                  // Kunde    M = M„nnlich W = weiblich

   cKOMO     := upper(KOMO)               // Achtung Public Variable "KOMO" aus dem Vorprogramm bergeben
   nZEICHINH := Zeichinh                   // Firmeninhaber = 1   2. Inhaber = 2
   isfirmist := Firmist = .t.

   DO WHILE !EOF()

   // Anrede speichern, alle abh„ngigen Infos bergeben ...
   infmess0 := GetAnrede( cPersdu, cKOMO, IsFirmist, NZEICHINH, cVorname, cName, cPPname, cFloskel, cPG, cKG, cANR )

   // Grussformel in der Email
   infmesss := GetGruss( cPersdu, cKOMO )


      if Isfirmist
        if nZEICHINH = 1
          emilwer := alltrim((nKumail)->EMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer :=  '"Keine E-Mail von Kunde, Arbeitgeber gespeichert"'
            endif
          endif
        else
          emilwer := alltrim((nKumail)->EPMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer := '"Keine E-Mail von Partner, Arbeitgeber gespeichert"'
            endif
          endif
        endif
      else
        emilwer := alltrim((nKumail)->EMAIL)
        if len(Emilwer) < 2
          emilwer := alltrim((nKumail)->EPMAIL)
          if len(Emilwer) < 2
            emilwer := alltrim((nKumail)->EAMAIL)
          else
            if len(Emilwer) < 2
              emilwer := '"Keine E-Mail von Kunde, Partner, Arbeitgeber gespeichert"'
            endif
          endif
        endif
      endif
      IF cPersdu = "D"
        infmess1 := "in der Anlage erh„ltst Du unseren Newsletter mit aktuellen Informationen."
        infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Dir fr weitere Fragen zur Verfgung."
      else
        infmess1 := "in der Anlage erhalten Sie unseren Newsletter mit aktuellen Informationen."
        infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Ihnen fr weitere Fragen zur Verfgung."
      endif
      infmesss     := ConvToAnsiCP(cGruss)
      infmess0     := ConvToAnsiCP(cAnrede)
      infmess1     := ConvToAnsiCP(infmess1)
      infmess2     := ConvToAnsiCP(infmess2)
      EMILWER      := ConvToAnsiCP(EMILWER)
      cAdresses    := (Emilwer)
      cMessage     := (infmess0)+(Chr(13))+(Chr(13))+(infmess1)+(Chr(13))+(infmess2)+(Chr(13))+(Chr(13))+(infmesss)+(Chr(13))+(Chr(13))+(infmess3b)+(Chr(13))+(infmess3c)+(Chr(13))+(Chr(13))+(infmess4)+(Chr(13))+(infmess3)+(Chr(13))+(infmess5)+(Chr(13))+(Chr(13))+(infmess6)+(Chr(13))+(Chr(13))+(infmess7)+(Chr(13))+(Chr(13))+(infmess8a)+(Chr(13))+(infmess8)+(Chr(13))+(infmess9)+(Chr(13))+(Chr(13))+(infmess10)+(Chr(13))+(Chr(13))+(infmess11)+(Chr(13))+(Chr(13))+(infmess12)



      set default to (substr(FESTWO,1,1) + ":")
      set path to (substr(FESTWO,1,1) + ":")
      set default to (verzexe)
      SET PATH to (verzexe)

      sendnews(cAdresses, cSubject, cMessage, cAttachments, nflag)  // LOCAL als Parameter  bergeben

      SKIP
    ENDDO

return


PROCEDURE SENDNEWS( cAdresses, cSubject, cMessage, cAttachments, nFlag )

   //

   LOCAL oMAPI
   Local Homepath := (verzexe)

   oMAPI := Thread() :new()
   oMAPI:start( "SENDNOW", cAdresses, cSubject, cMessage, cAttachments, nFlag)
   SLEEP( 100 )
   DO WHILE lisRunning = .T.
      SLEEP( 10 )
   ENDDO
   SLEEP( 100 )

   CurDrive( SUBSTR( Homepath, 1, 1 ) )
   CURDIR( Homepath )
RETURN

PROCEDURE SENDNOW( cAdresses, cSubject, cMessage, cAttachments, nFlag )
   // Flag setzen
   lisRunning := .T.
   BEGIN SEQUENCE

//        //-- Pop up maileditor
//        MsgBox("mail will be send with Maileditor popping up")
//        nErr := DllExecuteCall( scDLLSocMapiSendMail , cAdresses, cSubject, cMessage, cAttachments, nFlag)
//        if nErr != SUCCESS_SUCCESS .and. nErr != MAPI_USER_ABORT
//            break nErr
//        endif
     //
     // ODER ( aber NICHT UND !!! )
     //
        //-- Store mail directly to outbox
        //MsgBox("mail will be stored directly to outbox")
        nErr := DllExecuteCall( scDLLSocMapiPostMail , cAdresses, cSubject, cMessage, cAttachments, nFlag)
        if nErr != SUCCESS_SUCCESS
            break nErr
        endif
//      MsgBox("mail successfully stored to outbox")
   RECOVER USING nErr
   // Fehlerbehandlung
   END SEQUENCE
   // Flag ausschalten
   lisRunning := .F.

RETURN
lg
Micha
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2013 und Mail Massenversand

Beitrag von MichaMB »

brandelh hat geschrieben:
MichaMB hat geschrieben:(habe da einiges, noch nicht Verstandenes, wegen den künftigen Verschlüsselungen im Forum gelesen)
das verstehe ich jetzt nicht, aber um zu sehen wer alles etwas bekommen hat, kann man ein Protokoll beim SMTP Versand führen.
Als Absender wird ja (normalerweise) die eigene Adresse benutzt, dann bekommt man auf jeden Fall die Rückantwort oder Zustellfehler.

Möglich ist auch sich oder eine Kontrolladresse als BCC anzugeben, dann sieht es der andere nicht.

Für den automatischen Versand mit ASINET (SMTP) habe ich Beispiele, mal sehen ob ich daraus was einfaches bauen kann...

Habt Ihr die ASINET (also Profsub) ?

Wenn nicht, kann man auch andere nutzen ...
Hallo Hubert,

vielen Dank für dein PRG-File, habe es eingebunden und die Variablen angepasst
beim PBuild kam die Fehlermeldung:
leider fehlt die Asinet10.lib
Aisnet10.DLL ist vorhanden,
könnest du mir da bitte weiterhelfen?
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Jimmy.

kannst du mir bitte mit der Asinet10.Lib weiterhelfen?
die Datei fehlt beim Project
Asinet10.DLL ist vorhanden
lG
Micha
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Diese gehört zur Prof.Sub. und muss soweit ich mich erinner einzeln installiert werden

Code: Alles auswählen

 Verzeichnis von k:\XPPW32\book

26.02.2002  11:37             2.114 ASINET.CNT
27.04.2006  13:05           190.632 ASINET.hlp
               2 Datei(en),        192.746 Bytes

 Verzeichnis von k:\XPPW32\include

19.02.2003  11:47             1.570 AsiNet.ch
04.05.2005  12:07            11.767 AsiNetc.ch
               2 Datei(en),         13.337 Bytes

 Verzeichnis von k:\XPPW32\lib

17.03.2010  17:19           361.984 AsiNet10.dll
27.04.2006  12:13             8.378 AsiNet10.lib         <======
01.10.2010  12:47            86.016 AsiNet1c.dll
27.04.2006  12:12            30.350 AsiNet1c.lib
               4 Datei(en),        486.728 Bytes

 Verzeichnis von k:\XPPW32\runtime

17.03.2010  17:19           361.984 AsiNet10.dll
01.10.2010  12:47            86.016 AsiNet1c.dll
               2 Datei(en),        448.000 Bytes

 Verzeichnis von k:\XPPW32\source\samples

29.03.2015  22:15    <DIR>          ASINET
               0 Datei(en),              0 Bytes

 Verzeichnis von k:\XPPW32\source\samples\apps\HttpService

10.04.2009  07:36            86.016 AsiNet1c.dll
               1 Datei(en),         86.016 Bytes

     Anzahl der angezeigten Dateien:
              11 Datei(en),      1.226.827 Bytes
               1 Verzeichnis(se), 385.127.419.904 Bytes frei
Auf der Prof-Sub-CD
:arrow: CD:\ASINET\LIB
oder
:arrow: CD:\ZIPS\Asinet.zip
Gruß
Hubert
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Hubert,

leider Fehlanzeige
ich habe nur die Alaska Software Version 1.9 von 2009 und die Developer Subscription als CD und dann jeweils die Updates über das Internet wenn ich meinen Support verlängert habe, das hat auch jedes Jahr eine Menge Geld gekostet ohne dafür eine neue Version zu bekommen

Was kann ich jetzt machen?
LG
Micha
lG
Micha
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Ohne Asinet nimmt man entweder die in Windows enthaltene Version ( CDO ), BLAT oder XBSEE von Marshall - die kostet was und ist für mich komplexer ...

Hier ist ein Beispiel das BLAT.EXE nutzt ( download z.b. :arrow: http://www.heise.de/download/blat-11458 ... &hgf=false )
Einfach und schnell.

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"

#include "UserInfo.CH"     // ALLE ANGABEN IN OEM, da CMD Programme OEM erwarten !!!
                           // ABER bei RunShell fehlen dann die Umlaute im subject !
                           // da wundert man sich doch oder ???


/* UserInfo.CH enth„lt die Anmeldeinfo als defines ...
// GMX
#define cGmxLogonID '...'
#define cGmxLogonPW '...'
#define cGmxSMTP    'mail.gmx.de' // das ist der GMX SMTP Server, nur AUTH login !
#define cGmxToHB    '...'
*/

procedure main()
   local cUser, cPW, cSMTP, cTo, cFrom, cArt, nRuck, cMeldung, cSubject, cAttach, cParameter, cLogFile, cEMailDat, cReplyTo
   local cSSL := "-port 587 ", cUseSSL := "J"

   cls

   cBlatPfad := "FULL\"
   cLogFile  := "LOG_BLAT.TXT"
   cEMailDat := "eMail.txt"  // diese Datei wurde in ANSI erstellt und richtig bermittelt !!!
   cArt      := "1"
   cPW       := space(20)

   @ 1,1 say "blad Testprogramm  "+appname()
   @ 3,1 say "Versandart w„hlen: "    get cArt picture "#"
   @ 5,1 say " 1 = GMX.DE Kennwort: " get cPW  when cArt="1"
   @ 6,1 say " 2 = WEB.DE "
   @ 7,1 say " 3 = 1und1-Forum "
   @ 8,1 say " use SSL ?            " get cUseSSL picture "!" valid cUseSSL $ " JN"

   read                               // Inhalt mit Blank muss von " = chr(34) eingeschlossen werden !

   do case
      case cArt=="1"
           cArt  := " (GMX)"
           cUser := cGmxLogonID       // kann die eMail-Adresse sein, besser ist BenutzerID
           if empty(cPW)
              cPW   := cGmxLogonPW
           else
              cPW   := alltrim(cPW)
           endif
           cSMTP := cGmxSMTP
           cFrom := cGmxToHB          // dies muss die eMail-Adresse sein
      case cArt=="2"
           cArt  := " (WEB)"
           cUser := cWebLogonID
           cPW   := cWebLogonPW
           cSMTP := cWebSMTP
           cFrom := cWebLogonID

           cReplyTo  := chr(34)+cGmxToHB+chr(34)        // eventuell eine andere Rckantwortadresse ?
      case cArt=="3"
           cArt  := " (1und1-Forum)"
           cUser :=  c1und1LogonID
           cPW   :=  c1und1LogonPW
           cSMTP :=  c1und1SMTP
           cFrom :=  c1und1LogonID

           cReplyTo  := chr(34)+c1und1ToHB+chr(34)        // eventuell eine andere Rckantwortadresse ?

      otherwise
           @ 20,1 say "ungltige Auswahl, keine Aktion"
           inkey(5)
           quit
   end

   if cUseSSL == "J"
      cSSL := "-port 587 "
   else
      cSSL := ""
   endif

   cTo       := chr(34)+cGmxToHB+chr(34)     // ein Empf„nger oder Kommaseparierte Liste
                                             // CC und BCC teste ich hier jetzt nicht.
   cSubject  := chr(34)+"HB Blat Test ber RunShell"+cArt+chr(34) // deutsche Umlaute in OEM ! " == chr(34)
   cAttach   := chr(34)+"XbaseCMD.PRG"+chr(34)



   // variable Parameter auf "" setzen oder um Schlsselw”rter erg„nzen
   if empty(cReplyTo)   // auch NIL
      cReplyTo := ""    // keine Angabe
   else
      cReplyTo := " -replyto "+cReplyTo+" "
   endif
   if empty(cAttach)
      cAttach  := ""
   else
      cAttach  := " -attach "+cAttach
   endif
   if empty(cLogFile)
      cLogFile := ""
   else
      cLogFile := " -log "+cLogFile+" -timestamp "
   endif


   cParameter := cEMailDat+" -subject "+cSubject+" -to "+cTo+ ;
                 " -server "+cSMTP+" -f "+cFrom+cReplyTo+cAttach+;
                 " -u "+cUser+" -pw "+cPW+cLogFile+cSSL

   memowrit("LOG_RunShell_Aufruf.TXT","BLAT.EXE " + ConvToAnsiCP(cParameter))

   // Aufruf SYNCRON - also im Vordergrund blokierend, damit ein Rckgabewert ermittelt wird !
   // DIESE EXE ist in OEM / QUELLCODE und SET CHARSET, daher muss man die Parameter konvertieren ...
   // das h„tte ich jetzt nicht erwartet ;-)
   nRuck := RunShell( "/C "+cBlatPfad+"BLAT.EXE " + ConvToAnsiCP(cParameter), , .f., .f. ) // so stimmen auch Umlaute.
   do case
      case nRuck = - 1
           @ 20,1 say "Rckgabe von BLAT:"
      case nRuck = 0
           @ 20,1 say "BLAT meldet 0, alles OK"
      otherwise
           @ 20,1 say "BLAT meldet "+alltrim(str(nRuck))+", meist eine Fehlermeldung"
   end

   @22,1 say "Programmende in 10 Sekunden oder Tastendruck"
   inkey(10)

return

ODER als DLL Aufruf ...

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "DLL.ch"
#include "UserInfo.CH"     // ALLE ANGABEN IN OEM, da CMD Programme OEM erwarten !!!
                           // ABER bei RunShell fehlen dann die Umlaute im subject !
                           // da wundert man sich doch oder ???


/* UserInfo.CH enth„lt die Anmeldeinfo als defines ...
// GMX
#define cGmxLogonID '...'
#define cGmxLogonPW '...'
#define cGmxSMTP    'mail.gmx.de' // das ist der GMX SMTP Server, nur AUTH login !
#define cGmxToHB    '...'
*/

procedure main()
   local cUser, cPW, cSMTP, cTo, cFrom, cArt, nRuck, cMeldung, cSubject, cAttach, cParameter, ;
         cLogFile, cEMailDat, cReplyTo
   local nBlatDll, cBlatDLLName := "FULL\BLAT.DLL"
   local cSSL := "-port 587 ", cUseSSL := "J"

   cls
   cLogFile  := "LOG_BLAT.TXT"
   cEMailDat := "eMail.txt"  // diese Datei wurde in ANSI erstellt und richtig bermittelt !!!
   cArt      := "1"
   cPW       := space(20)

   @ 1,1 say "blad Testprogramm  "+appname()
   @ 3,1 say "Versandart wählen: "    get cArt picture "#"
   @ 5,1 say " 1 = GMX.DE Kennwort: " get cPW  when cArt="1"
   @ 6,1 say " 2 = WEB.DE "
   @ 7,1 say " 3 = 1und1-Forum "
   @ 8,1 say " use SSL ?            " get cUseSSL picture "!" valid cUseSSL $ " JN"

   read                               // Inhalt mit Blank muss von " = chr(34) eingeschlossen werden !

   do case
      case cArt=="1"
           cArt  := " (GMX)"
           cUser := cGmxLogonID       // kann die eMail-Adresse sein, besser ist BenutzerID
           if empty(cPW)
              cPW   := cGmxLogonPW
           else
              cPW   := alltrim(cPW)
           endif
           cSMTP := cGmxSMTP
           cFrom := cGmxToHB          // dies muss die eMail-Adresse sein
      case cArt=="2"
           cArt  := " (WEB)"
           cUser := cWebLogonID
           cPW   := cWebLogonPW
           cSMTP := cWebSMTP
           cFrom := cWebLogonID

           cReplyTo  := chr(34)+cGmxToHB+chr(34)        // eventuell eine andere Rckantwortadresse ?
      case cArt=="3"
           cArt  := " (1und1-Forum)"
           cUser :=  c1und1LogonID
           cPW   :=  c1und1LogonPW
           cSMTP :=  c1und1SMTP
           cFrom :=  c1und1LogonID

           cReplyTo  := chr(34)+c1und1ToHB+chr(34)        // eventuell eine andere Rckantwortadresse ?




      otherwise
           @ 20,1 say "ungültige Auswahl, keine Aktion"
           inkey(5)
           quit
   end

   if cUseSSL == "J"
      cSSL := "-port 587 "
   else
      cSSL := ""
   endif

   cTo       := chr(34)+cGmxToHB+chr(34)     // ein Empf„nger oder Kommaseparierte Liste
                                             // CC und BCC teste ich hier jetzt nicht.
   cSubject  := chr(34)+"HB Blat Test über Blat.DLL"+cArt+chr(34) // deutsche Umlaute in OEM ! " == chr(34)
   cAttach   := chr(34)+"XbaseCMD.PRG"+chr(34)

   // variable Parameter auf "" setzen oder um Schlsselw”rter erg„nzen
   if empty(cReplyTo)   // auch NIL
      cReplyTo := ""    // keine Angabe
   else
      cReplyTo := " -replyto "+cReplyTo+" "
   endif
   if empty(cAttach)
      cAttach  := ""
   else
      cAttach  := " -attach "+cAttach
   endif
   if empty(cLogFile)
      cLogFile := ""
   else
      cLogFile := " -log "+cLogFile+" -timestamp "
   endif


   cParameter := cEMailDat+" -subject "+cSubject+" -to "+cTo+ ;
                 " -server "+cSMTP+" -f "+cFrom+cReplyTo+cAttach+;
                 " -u "+cUser+" -pw "+cPW+cLogFile+cSSL

   // die DLL braucht auf jeden Fall ANSI ;-)
   cParameter := ConvToAnsiCP(cParameter)

   memowrit("LOG_DLL_Parameter.TXT",cParameter )

// so würde es funktionieren, aber ich will die Fehlermeldungen trennen.
*   nRuck := DllCall(cBlatDLLName, DLL_STDCALL, "Send", cParameter )

   nBlatDll := dllLoad(cBlatDLLName)

   if nBlatDll > 0
      // Aufrufkonvention: DLL_STDCALL oder DLL_CDECL ? Wenn man ot4xb nutzt, muss man dies nicht beachten.
      nRuck := DllCall( nBlatDll, DLL_STDCALL , "Send", cParameter )
   endif

   do case
      case empty(nBlatDll)
           @20,1 say "Fehler: dllLOAD() meldet Fehler: "+alltrim(str(DosError()))+" : "+DosErrorMessage()
      case nRuck = - 1
           @ 20,1 say "Rückgabe von BLAT:"
      case nRuck = 0
           @ 20,1 say "BLAT meldet 0, alles OK"
      otherwise
           @ 20,1 say "BLAT meldet "+alltrim(str(nRuck))+", meist eine Fehlermeldung"
   end

   @22,1 say "Programmende in 10 Sekunden oder Tastendruck"
   inkey(10)

return

Microsofts DSO ist möglicherweise flexibler ... hier der Link

:arrow: www.xbaseforum.de/viewtopic.php?f=28&t=7726
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

ich hänge mein Blat Beispiel mal hier an.
Die Datei UserInfo.CH enthält bei mir die Login-Infos, hier habe ich natürlich meine Kennungen entfernt, somit wird das Programm erst funktionieren wenn man eigene eingetragen hat.
Dateianhänge
XBase-SMTP-mit-blat312.zip
(240.81 KiB) 365-mal heruntergeladen
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Noch was, man sollte es mit der Anzahl der eMails pro Stunde nicht übertreiben.
Als GMX Kunde denke ich würde man keine Probleme bekommen solange sich keiner beschwert.

Wenn man aber einen (kleinen) Webserver mit SMTP Server betreibt und von dem tausende eMails in der Stunde (am Tag ? ) versandt werden,
könnte die IP Adresse - insbesondere nach Beschwerden - schnell auf einer Blacklist landen und dann gibt es Ärger mit dem Betreiber.
Gruß
Hubert
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Hubert,

ganz lieben Dank für Deine ausführlichen Unterlagen.
Ich werde das Massen-Email-Programm sinnvollerweise :idea: auch von meinem Hauptprogramm abtrennen, das Programm braucht ja nur die Daten.DBF
Damit mache ich schon mal den ersten Schritt, das Hauptprogramm zu entflechten.
Die UserInfo.ch und das Main.PRG versuche ich mal um meine 2 Anbieter zu erweitern...

bezüglich der Menge der Newsletter könnte man das ja auch auf z.B. 50 Stück aus der Datenbank.DBF beschränken und die nächsten an anderen Tagen usw.
LG
Micha
lG
Micha
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

mit meinem Web.DE account bekomme ich aktuell die Meldung dass der User nicht akzeptiert wird.
im Web-Frontend kann ich mich einwählen ... seltsam, die Parameter sind die gleichen wie bie GMX und 1und1 (sind ja alle vom gleichen Konzern) ...

500 am Tag sind bestimmt kein Problem, ich wollte nur darauf hinweisen.

Das Testprogramm legt ja LOG Dateien an mit Parametern etc. diese enthalten Kennwörter ... bei mir und zur Entwicklung sinnvoll, aber ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Hier noch ein Beispiel mit der in Windows enthaltenen Software:

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"

#pragma library( "ascom10.lib" )

static cKWg, cKWw, cKW1u1, cKWx, cSendTO  // so macht man das normal nicht, aber zum Testen ...

procedure main()
   local nArt, aArt, x, cTxt, cPfad
   local oCdoMessage, oCdoConf, oCdoBp, oCdoStream

   cPfad := StrTran(appname(.t.),appname(),"")

   LoadSecretInfos()   // quick and dirty

   aArt := LoadMailInfo()

   cls
   nArt := 0
   @ 1,1 say "Test eMail mit CDO "
   for x := 1 to len(aArt)
       if len(aArt[x]:Name) > 0
          @ 2+x,1 say aArt[x]:Name+" => "+alltrim(str(x))+"   "+iif(empty(aArt[x]:UserKW),"kein Kennwort !","")
       endif
   next
   @ 3+x,1 say "Anbieter: " get nArt
   read

   if nArt < 1 .or. nArt > len(aArt)
      quit
   endif

   if empty(aArt[nArt]:Name)
      ? "Auswahl fehlt noch"
      inkey(5)
      quit
   endif

   if empty(aArt[nArt]:UserKW)
      ? "Bitte LoadSecretInfos() ausfüllen !"
      inkey(5)
      quit
   endif


   @5+x,1 say "Senden ... "+str(nArt)

   ? "sendusing",             aArt[nArt]:SendUsing
   ? "smtpserver",            aArt[nArt]:SmtpServer
   ? "smtpserverport",        aArt[nArt]:SmtpServerPort
   ? "smtpusessl",            aArt[nArt]:SmtpUseSSL
   ? "smtpconnectiontimeout", aArt[nArt]:SmtpConTimeOut
   ? "smtpauthenticate",      aArt[nArt]:SmtpAuth
   ? "sendusername",          aArt[nArt]:UserName
   ? "sendpassword",          aArt[nArt]:UserKW

   oCdoMessage := CreateObject("CDO.Message")
   oCdoConf    := CreateObject("CDO.Configuration")
   oCdoBp      := CreateObject("CDO.IBodyPart")

   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/sendusing",             aArt[nArt]:SendUsing      )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/smtpserver",            aArt[nArt]:SmtpServer     )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/smtpserverport",        aArt[nArt]:SmtpServerPort )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/smtpusessl",            aArt[nArt]:SmtpUseSSL     )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", aArt[nArt]:SmtpConTimeOut )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",      aArt[nArt]:SmtpAuth       )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/sendusername",          aArt[nArt]:UserName       )
   oCdoConf:fields:setproperty("item","http://schemas.microsoft.com/cdo/configuration/sendpassword",          aArt[nArt]:UserKW         )
   oCdoConf:fields:callMethod("Update")

   oCdoMessage:Configuration := oCdoConf
   oCdoMessage:Subject := "Beispiel - HB - CDO"
   oCdoMessage:setproperty("From", aArt[nArt]:UserName )
   oCdoMessage:setproperty("TO",  cSendTO ) // "hubert.brandel@web.de, hubert.brandel@gmx.de")
   oCdoMessage:setproperty("CC",  "hubert.brandel@web.de")
   oCdoMessage:setproperty("BCC", "hubert.brandel@gmx.de")
   oCdoMessage:TextBody := "Hubert testet CDO"

   oCdoBp := oCdoMessage:AddAttachment(cPfad+"Test.DOC")
   oCdoBp:ContentMediaType := "application/msword"

   @22,10 say "senden ..."
   oCdoMessage:Send()

   oCdoStream := oCdoMessage:GetStream()

   cTxt       := oCdoStream:ReadText()

   memowrit("SendLog.txt", cTxt )

   oCdoMessage:destroy()
   oCdoConf:destroy()

   @22,10 say "ENDE"

   inkey(5)

   ? cTxt

return

class CDOobj
 exported
   var Name
   var SendUsing
   var SmtpServer
   var SmtpServerPort
   var SmtpUseSSL
   var SmtpConTimeOut
   var SmtpAuth
   var UserName
   var UserKW
   METHOD INIT
endclass

METHOD CDOobj:init()
   ::Name           := ""
   ::SendUsing      := 2
   ::SmtpServer     := ""
   ::SmtpServerPort := 25
   ::SmtpUseSSL     := .f.  // .t./1 => Port: 465
   ::SmtpConTimeOut := 60
   ::SmtpAuth       := .t.
   ::UserName       := ""
   ::UserKW         := ""
return self

function LoadMailInfo()
   local aArt := {}, oObj

   // Es gab zwar einige Probleme welcher Port verwendet werden muss, aber es geht.
   // 1und1 und Web.de, Port=25 SSL=Ja
   // Gmx , Port=465 SSL=Ja

   oObj := CDOobj():new()
   oObj:Name := "GMX - SSL - AUTH"
   oObj:SmtpServer     := "mail.gmx.net"
   oObj:SmtpUseSSL     := .t.
   oObj:SmtpServerPort := 465
   oObj:SmtpConTimeOut := 60
   oObj:SmtpAuth       := .t.
   oObj:UserName       := " ...  "
   oObj:UserKW         := cKWg  // oder per Hand eintippen lassen ?
   aadd( aArt , oObj )
   oObj := NIL

   oObj := CDOobj():new()
   oObj:Name := "WEB - SSL - AUTH"
   oObj:SmtpServer     := "smtp.web.de"
   oObj:SmtpUseSSL     := .T.
   oObj:SmtpServerPort := 25
   oObj:SmtpConTimeOut := 60
   oObj:SmtpAuth       := .T.
   oObj:UserName       := " ... "
   oObj:UserKW         := cKWw
   aadd( aArt , oObj )
   oObj := NIL

   oObj := CDOobj():new()
   oObj:Name := "1u1 - SSL - AUTH"
   oObj:SmtpServer     := "smtp.1und1.de"
   oObj:SmtpUseSSL     := .T.
   oObj:SmtpServerPort := 25
   oObj:SmtpConTimeOut := 60
   oObj:SmtpAuth       := .T.
   oObj:UserName       := " ... "
   oObj:UserKW         := cKW1u1
   aadd( aArt , oObj )
   oObj := NIL

   oObj := CDOobj():new()
   oObj:Name := ""
   oObj:SmtpServer     := ""
   oObj:SmtpUseSSL     := .f.
   oObj:SmtpServerPort := 25
   oObj:SmtpConTimeOut := 60
   oObj:SmtpAuth       := .t.
   oObj:UserName       := ""
   oObj:UserKW         := ""
   aadd( aArt , oObj )
   oObj := NIL

return aArt

function LoadSecretInfos()
   cKWg    :=  "..."
   cKWw    :=  "..."
   cKW1u1  := "..."
   cSendTO := "xyz@gmx.de"
return nil
Im Prinzip funktioniert alles, ab und zu sind die Einstellungen der Verschlüsselung und PORTs heikel, da früher alles unverschlüsselt auf Port 25 ging und das nachträglich aber unterschiedlich verbessert wurde.
Gruß
Hubert
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Hubert,

Danke wichtiger Hinweis mit den Logindaten, wer bekommt diese zu sehen?
sollte man zur Sicherheit das Passwort des E-Mail Providers für die Newsletter vorher ändern, mit dem fest installierten Passwort senden, und dann wieder das Passwort beim E-Mail-Provider zurücksetzten?
oder gibt es eine elegantere Lösung?
lG
Micha
lG
Micha
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Wenn man einen eigenen Web-Server hat, richtet man sich selbst SMTP User ein und vergibt da das Kennwort.

Ansonsten kann man im EXE schon die Kennwörter hinterlegen, dann muss man aber auf die Quellcodes aufpassen (daher die Kennwörter auch in EINER CH Datei).
Jeder kann die EXE ausführen ohne das Kennwort zu kennen.
Oder man fragt das Kennwort zur Laufzeit einmalig ab und die EXE versendet alles.

Was ich meine sind die Protokolle, die ich mit set alternate anlege ... in Produktion dürfen diese keine Kennwörter enthalten.

Solange man keinen Anlaß hat zu vermuten, dass jemand anderes über den SMTP Server sendet, braucht man die Kennwörter nicht dauernd austauschen,
aber das ist Ansichtssache.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2015 und Mail Massenversand

Beitrag von AUGE_OHR »

MichaMB hat geschrieben:kannst du mir bitte mit der Asinet10.Lib weiterhelfen?
die Datei fehlt beim Project
dann nimm die raus aus dem Projekt den die wird für SocMAPI nicht benötigt.

p.s. nimm doch mal die PUBLICs raus ...
gruss by OHR
Jimmy
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Jimmy,

in der Version habe ich die Variablen schon wieder zurück auf Local geändert, läuft aber trotzdem nicht und ich weiss nicht was ich noch ändern müsste?

Das hat mit den neueren Nachrichten mit der Ersatzlösung Blat nichts zu tun, am besten wäre natürlich die Lösung mit der Asinet10.Lib
LG Micha
lG
Micha
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo Hubert,
die Lösung mit Blat gebe ich auf, keine Chance
2015.08.12 18:27:12 (Wed)------------Start of Session-----------------
Blat v3.1.2 (build : Dec 27 2013 14:33:12)
32-bit Windows, Full, Unicode
2015.08.12 18:27:42 (Wed): Error: Wait a bit (possible timeout).
2015.08.12 18:27:42 (Wed): *** Error *** SMTP server error
2015.08.12 18:27:42 (Wed): Error: Not a socket.
2015.08.12 18:27:42 (Wed): Error: Not a socket.
2015.08.12 18:27:42 (Wed)-------------End of Session------------------
lg
Micha
lG
Micha
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Outlook 2015 und Mail Massenversand

Beitrag von AUGE_OHR »

MichaMB hat geschrieben:in der Version habe ich die Variablen schon wieder zurück auf Local geändert, läuft aber trotzdem nicht und ich weiss nicht was ich noch ändern müsste?
schon mal mit dem Debugger schrittweise durch deinen Code gegangen ?
... ich würde zum testen "alles" raus nehmen ( Anrede, blabla ) bis der Versand funktioniert. danach kannst du dann alles wieder aktivieren.
MichaMB hat geschrieben:Das hat mit den neueren Nachrichten mit der Ersatzlösung Blat nichts zu tun, am besten wäre natürlich die Lösung mit der Asinet10.Lib
du hast jetzt 3 "free" Vorschläge ( SocMAPI, CDO, Blat ) die bei "anderen" funktionieren ...
die ASINET gibt es wie schon gesagt nur in der Xbase++ "Pro" Version.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Outlook 2015 und Mail Massenversand

Beitrag von brandelh »

Die Asinet ist keineswegs die beste Version, ich habe nur die verwendet weil ich sie hatte.
Ohne Verschlüsselung gab es nie Probleme, und neuerdings haben sie da schon nachgebessert, aber mir erscheint die von Microsoft als die flexibelste Lösung.
Das mit den Anmeldedaten ist etwas zwickelig, das stimmt, aber Outlook muss ja auch eingestellt worden sein. Einfach mal dort aufschreiben was unter SMTP steht.

Die nutzen intern alle das gleiche Protokoll.
Gruß
Hubert
Benutzeravatar
MichaMB
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Fr, 26. Jul 2013 12:03

Re: Outlook 2015 und Mail Massenversand

Beitrag von MichaMB »

Hallo zusammen,

natürlich habe ich mir aus Outlook die Einstellungen übernommen. Nach einigem Testen bin ich drauf gekommen, dass mein Server die geschäftlichen Webseite Massenmails unterbindet bzw. dafür Gebühren verlangt.
Dann habe ich alles in Xbasecmd.prg und xbasedll.prg auf T-Online umprogrammiert, bzw. dann sogar alles für T-Online fest voreingestellt, SMTP Port Verschlüsselung ist dort übrigens 465
Jetzt kann ich noch die Windows-Version ausprobieren
Protokoll:
BLAT.EXE eMail.txt -subject "HB Blat Test über RunShell XYX@T-Online.de" -to "MBSkYY@T-Online.de" -server SMTPmail.T-Online.de -f XYX@T-Online.de -replyto "XYX@T-Online.de" -attach "NEWSP.PDF" -u XYX@T-Online.de -pw XX123456XX -log LOG_BLAT.TXT -timestamp -port 465
funktioniert leider auch nicht !
PS: Die Idee von Jimmy in dem Emmailou.prg (siehe oben) alles "BLABLA"rauszunehmen werde ich auch noch ausprobieren, manchmal hängt es ja nur an einem Sonderzeichen in den Anlagen etc. und es passiert nichts mehr
lg
Micha
Zuletzt geändert von MichaMB am Do, 13. Aug 2015 12:03, insgesamt 1-mal geändert.
lG
Micha
Antworten