Seite 2 von 3
Re: Outlook 2013 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 21:55
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 fr weitere Fragen zur Verfgung."
else
infmess1 := "in der Anlage erhalten Sie unseren Newsletter mit aktuellen Informationen."
infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Ihnen fr weitere Fragen zur Verfgung."
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 22:05
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
Re: Outlook 2013 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 22:18
von AUGE_OHR
und wie kommen deine Variabel in die Function ?
Re: Outlook 2015 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 22:25
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 ?
Re: Outlook 2015 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 22:46
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?
Re: Outlook 2015 und Mail Massenversand
Verfasst: Di, 11. Aug 2015 23:24
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 ...
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 1:09
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 Anfhrungszeichen 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äftsfhrer
// 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 Anfhrungszeichen 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" fr 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 fr weitere Fragen zur Verfgung."
else
infmess1 := "in der Anlage erhalten Sie unseren Newsletter mit aktuellen Informationen."
infmess2 := "Viel Spaá beim lesen des Newsletters, gerne stehen wir Ihnen fr weitere Fragen zur Verfgung."
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
Re: Outlook 2013 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 2:30
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?
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 2:58
von MichaMB
Hallo Jimmy.
kannst du mir bitte mit der Asinet10.Lib weiterhelfen?
die Datei fehlt beim Project
Asinet10.DLL ist vorhanden
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 6:53
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
CD:\ASINET\LIB
oder
CD:\ZIPS\Asinet.zip
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 10:34
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 11:09
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.
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 Rckantwortadresse ?
case cArt=="3"
cArt := " (1und1-Forum)"
cUser := c1und1LogonID
cPW := c1und1LogonPW
cSMTP := c1und1SMTP
cFrom := c1und1LogonID
cReplyTo := chr(34)+c1und1ToHB+chr(34) // eventuell eine andere Rckantwortadresse ?
otherwise
@ 20,1 say "ungltige 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 Schlsselw”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 Rckgabewert 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 "Rckgabe 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 Rckantwortadresse ?
case cArt=="3"
cArt := " (1und1-Forum)"
cUser := c1und1LogonID
cPW := c1und1LogonPW
cSMTP := c1und1SMTP
cFrom := c1und1LogonID
cReplyTo := chr(34)+c1und1ToHB+chr(34) // eventuell eine andere Rckantwortadresse ?
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 Schlsselw”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
www.xbaseforum.de/viewtopic.php?f=28&t=7726
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 11:25
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 11:34
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 12:46
von MichaMB
Hallo Hubert,
ganz lieben Dank für Deine ausführlichen Unterlagen.
Ich werde das Massen-Email-Programm sinnvollerweise
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 13:14
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 ...
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 13:31
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 13:39
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 13:52
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 15:38
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 ...
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 18:20
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 18:29
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
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 19:33
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Mi, 12. Aug 2015 20:04
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.
Re: Outlook 2015 und Mail Massenversand
Verfasst: Do, 13. Aug 2015 0:52
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