////////////////////////////////////////////////////////////////////// // // RECVMAIL.PRG // // Copyright: // Alaska Software, (c) 2000-2002. All rights reserved. // // Contents: // User defined function ReceiveMail() // // Remarks: // The function encapsulates object creation required for retrieving // e-mails from a mail server. The parameter profile is simplified // so that 90% of incoming e-mails are covered by this function. // // Return: // ReceiveMail() returns a multi-dimensional array holding e-mail information // Elements of this array can be accessed using constants from EMAIL.CH // // aEmail[n, EMAIL_FROM ] -> "C" sender address // aEmail[n, EMAIL_SUBJECT ] -> "C" subject line // aEmail[n, EMAIL_CC ] -> "C" CC: header // aEmail[n, EMAIL_BCC ] -> "C" BCC: header" // aEmail[n, EMAIL_CONTENTS ] -> "A" message body // aEmail[n, EMAIL_ATTACHMENT] -> "A" names of attached files // // 28.05.2007 13:02 ak : Return cTip ////////////////////////////////////////////////////////////////////// #include "\bestatt\aaa\prgx\EMail.ch" #include "FileIO.CH" #include "Common.ch" #include "Xbp.ch" #pragma library( "\bestatt\aaa\prgx\ASINet10.lib" ) FUNCTION ReceiveMail( cMailServer , ; // name of mail server (defaults to "mail") cUsername , ; // user name for mail account cPassword , ; // password to access mail account lDeleteMail , ; // delete mails after retrieval? nHowmany , ; // max. number of messages to retrieve acHeader , ; // additional header fields to include cLogFile , ; // log file name cEVerz ; // Email-Verzeichnis 28.05.2007 10:49 ak ) // Return --> Array or NIL on error LOCAL oPop3, oMimeMsg, xTemp LOCAL aAllMails, aEMail, i, imax, cVonAdresse, lErlaubt := .F. //04.06.2007 10:42 LOCAL oLog := LogWriter():new( cLogFile ) LOCAL nOldArea := SELECT() //28.05.2007 11:10 ak LOCAL cTip := "-", n, cErlAdr //28.05.2007 13:02 ak 19.06.2007 10:08 DEFAULT cEVerz TO cDatver+"EMAIL\" //+03.11.2009 13:42 ak IF IsMemVar("cINetEin") .AND. !Empty(cINetEin) RunShell( "/C "+cINetEin,, .F. ) // async=.F. == Anhalten bis eingeloggt ENDIF // Die Datei (m: oder) c:\hdbe\EmailAdr.dat beinhaltet Adress-Bruchstcke, vom User selbst zu pflegen // (wird nachher mit Upper() verglichen, also Schreibweise egal...): IF FExists( cDatver+"EmailAdr.dat" ) //+03.11.2009 13:42 ak aFirma35 := {} // Public-Variable geleert cErlAdr := MemoRead( cDatver+"EmailAdr.dat" ) //+03.11.2009 13:43 FOR i := 1 TO MlCount(cErlAdr,50) AAdd( aFirma35, AllTrim(MyMemoLine( cErlAdr, 50, i )) ) NEXT ELSEIF Empty(aFirma35) //11.07.2007 10:56 ak aFirma35 := {"kirchner"} // nur Emails von mir, wenn leer und kein EmailAdr.dat existiert ENDIF IF FExists( cEVerz+"mwstdat.dbf" ) //28.05.2007 11:10 ak // Email-Verzeichnis leer? SELECT 9 DbUseArea( ,,cEVerz+"mwstdat" ) // wenn Verzeichnis nicht leer: Abbbuch: ConfirmBox( oCB, ; "Es sind noch Daten von "+Trim(9->bname)+CRLF+ ; "im Email-Verzeichnis!", ; "Email-Verzeichnis ist nicht leer!", ; XBPMB_OK, ; XBPMB_WARNING ) cTip := "Es sind noch Daten von "+Trim(9->bname)+" im Email-Verzeichnis!" DbCloseArea() SELECT (nOldArea) IF IsMemVar("cINetAus") .AND. !Empty(cINetAus) RunShell( "/C "+cINetAus,, .F. ) // async=.F. == Anhalten bis eingeloggt ENDIF RETURN cTip ELSEIF !FExists(SubStr(cEVerz,1,Len(cEVerz)-1),"D") // Verzeichnis neu erstellen, wenn es noch nicht existiert: RunShell( "/C MD "+SubStr(cEVerz,1,Len(cEVerz)-1),, .T. ) Sleep(100) // damit Windows es bemerkt... ENDIF oBest:PaintTip("Bitte warten!",{500,530}) //+03.11.2009 13:38 ak /* * parameter checking */ IF Valtype( cMailServer ) <> "C" cMailServer := "mail" ENDIF IF Valtype( cUsername ) <> "C" oLog:logError( ERR_MSG_USERNAME ) ENDIF IF Valtype( cPassword ) <> "C" oLog:logError( ERR_MSG_PASSWORD ) ENDIF IF Valtype( lDeleteMail ) <> "L" lDeleteMail := .F. ENDIF /* * create a POP3 client and connect to mail server */ oPop3 := POP3Client():new( cMailServer,, cUsername, cPassword, oLog, 2 ) IF .NOT. oPop3:connect() oLog:logError( ERR_MSG_CONNECTION ) ENDIF IF oLog:isError() oPop3:disconnect() IF Valtype( cLogFile ) == "C" oLog:writeLogFile() ENDIF IF IsMemVar("cINetAus") .AND. !Empty(cINetAus) RunShell( "/C "+cINetAus,, .F. ) // async=.F. == Anhalten bis eingeloggt ENDIF RETURN "FEHLER: keine Verbindung" // NIL 28.05.2007 12:20 ak ENDIF /* * get number of mails to retrieve */ imax := oPop3:getNumberOfNewMessages() IF Valtype( nHowmany ) <> "N" nHowMany := imax ENDIF imax := Max( 0, Min( nHowMany, imax ) ) IF imax < 1 /* * no mails to retrieve */ oPop3:disconnect() oLog:write( ERR_MSG_NOERROR ) IF Valtype( cLogFile ) == "C" oLog:writeLogFile() ENDIF IF IsMemVar("cINetAus") .AND. !Empty(cINetAus) RunShell( "/C "+cINetAus,, .F. ) // async=.F. == Anhalten bis eingeloggt ENDIF RETURN "Keine Mails da!" // {} 28.05.2007 12:19 ak ENDIF /* * retrieve individual mails */ oLog:write( "Retrieving " + Var2Char( imax ) + " e-mails." ) aAllMails := {} FOR i := 1 TO imax oMimeMsg := oPop3:getMessage( i ) IF oMimeMsg != NIL aEMail := EMAIL_ARRAY ////// AAdd( aAllMails, aEMail ) // Get MailAddress object holding sender information xTemp := oMimeMsg:getFrom() IF xTemp != NIL // 04.06.2007 10:46 ak: // Filter fr Sender-Adressen: Nur die bekannten Adressen sind erlaubt: (in aFirma35) cVonAdresse := xTemp:getString() AEval( aFirma35, {|a,n| IIf(Upper(a)$Upper(cVonAdresse),lErlaubt := .T.,) } ) IF lErlaubt aEMail[ EMAIL_FROM ] := cVonAdresse ELSE ////// aEMail[ EMAIL_FROM ] := "SPAM" LOOP ENDIF lErlaubt := .F. // bis hier: Filter fr Sender-Adressen // ////// aEMail[ EMAIL_FROM ] := xTemp:getString() ELSE ////// aEMail[ EMAIL_FROM ] := "No FROM!" LOOP // 04.06.2007 10:48 ak ENDIF // Get subject line xTemp := oMimeMsg:getSubject() IF xTemp != NIL aEMail[ EMAIL_SUBJECT ] := xTemp ELSE aEMail[ EMAIL_SUBJECT ] := "No SUBJECT!" ENDIF // Get CC header xTemp := oMimeMsg:getHeader( "CC" ) IF xTemp != NIL aEMail[ EMAIL_CC ] := xTemp ELSE aEMail[ EMAIL_CC ] := "" ENDIF // Get BCC header xTemp := oMimeMsg:getHeader( "BCC" ) IF xTemp != NIL aEMail[ EMAIL_BCC ] := xTemp ELSE aEMail[ EMAIL_BCC ] := "" ENDIF // Get mail content xTemp := oMimeMsg:getContent() IF xTemp != NIL cTip := GetMimeContent( aEMail, xTemp, cEVerz ) //28.05.2007 11:12 ak ENDIF AAdd( aAllMails, aEMail ) //05.06.2007 08:38 von vorne nach hier ENDIF /* * delete message from server if requested */ IF lDeleteMail oPop3:deleteMessage( i ) ENDIF NEXT /* * disconnect from server */ oPop3:disconnect() IF .NOT. oLog:isError() oLog:write( ERR_MSG_NOERROR ) ENDIF IF Valtype( cLogFile ) == "C" oLog:writeLogFile() ENDIF // Wenn die Emails einen Inhalt haben: IF Len(aAllMails)>0 .AND. Len(aAllMails[1,EMAIL_CONTENTS])>0 .AND. ; Valtype( aAllMails[1,EMAIL_CONTENTS,1] ) == "C" //23.06.2007 11:43 SELECT 29 //05.06.2007 19:15 IF !FExists(cDatver+"POST\"+DtoS(DATE())+".txt") nHandle := FCreate( cDatver+"POST\"+DtoS(DATE())+".txt", FC_NORMAL ) //28.05.2007 11:12 ak FWrite( nHandle, Replicate("=",50)+CRLF ) FWrite( nHandle, "Emails vom "+MMzuMonat(DATE())+CRLF ) FWrite( nHandle, Replicate("=",50)+CRLF+CRLF ) ELSE cString := MemoRead( cDatver+"POST\"+DtoS(DATE())+".txt" ) FErase( cDatver+"POST\"+DtoS(DATE())+".txt" ) nHandle := FCreate( cDatver+"POST\"+DtoS(DATE())+".txt", FC_NORMAL ) //28.05.2007 11:12 ak FWrite( nHandle, cString+CRLF ) FWrite( nHandle, Replicate("=",50)+CRLF+CRLF ) ENDIF IF nHandle != -1 FOR i := 1 TO Len(aAllMails) FWrite( nHandle, "von: "+Trim(aAllMails[i,EMAIL_FROM]) + ; " / cc: "+Trim(aAllMails[i,EMAIL_CC]) + ; " / bcc: "+Trim(aAllMails[i,EMAIL_BCC])+CRLF ) FWrite( nHandle, "Betr.: "+aAllMails[i,EMAIL_SUBJECT]+CRLF ) IF Len(aAllMails[i,EMAIL_ATTACHMENT]) > 0 FWrite( nHandle, "Anlagen: " ) FOR n := 1 TO Len(aAllMails[i,EMAIL_ATTACHMENT]) FWrite( nHandle, Trim(aAllMails[i,EMAIL_ATTACHMENT,n]) + ", " ) NEXT FWrite( nHandle, CRLF ) ENDIF FWrite( nHandle, "Text:"+CRLF ) FWrite( nHandle, aAllMails[i,EMAIL_CONTENTS,1]+CRLF ) FWrite( nHandle, Replicate("=",50)+CRLF+CRLF ) NEXT FClose( nHandle ) cTip := "Es sind Emails im POST-Verzeichnis angekommen!" ENDIF ENDIF IF FExists( cEVerz+"mwstdat.dbf" ) ///28.05.2007 11:12 ak // Email-Verzeichnis leer? SELECT 9 DbUseArea( ,,cEVerz+"mwstdat" ) cTip := "Es sind Daten von "+Trim(9->bname)+" im Email-Verzeichnis angekommen!" DbCloseArea() ELSEIF "POST"$Upper(cTip) //11.07.2007 10:04 ELSEIF "PROG"$Upper(cTip) //11.07.2007 10:04 ELSE //11.07.2007 10:03 cTip := "Keine internen Emails angekommen!" ENDIF SELECT (nOldArea) IF IsMemVar("cINetAus") .AND. !Empty(cINetAus) RunShell( "/C "+cINetAus,, .F. ) // async=.F. == Anhalten bis eingeloggt ENDIF RETURN cTip /* * get content of mail recursively */ STATIC PROCEDURE GetMimeContent( aEMail, aContent, cEVerz ) //28.05.2007 11:12 ak LOCAL i, imax, oMimeContent, xTemp, nHandle, cTip:= "" //11.07.2007 09:50 ak IF ValType( aContent ) != "A" RETURN ENDIF imax := Len( aContent ) FOR i := 1 TO imax oMimeContent := aContent[i] IF oMimeContent:isMultiPart() /* * get every part of a multipart e-mail */ GetMimeContent( aEMail, oMimeContent:getContent(), cEVerz ) //28.05.2007 11:12 ak RETURN ENDIF /* * if part has a filename, create that file and * write its contents to disk */ xTemp := oMimeContent:getFileName() IF xTemp != NIL IF Upper(xTemp) $ "BEST.DBF-BEST.DBT-VV.DBF-VV.DBT-AUFTR.DBF-MWSTDAT.DBF" nHandle := FCreate( cEVerz+xTemp, FC_NORMAL ) //28.05.2007 11:12 ak ELSEIF Upper(xTemp) $ SubStr(Appname(),1,Len(AppName())-4)+".ZIP" // "BERGX.ZIP-MUELLX.ZIP" nHandle := FCreate( cDatver+"PROG\"+xTemp, FC_NORMAL ) //+03.11.2009 13:40 ak cTip := "Programm-Update ist angekommen!" //11.07.2007 09:50 ak ELSE nHandle := FCreate( cDatver+"POST\"+xTemp, FC_NORMAL ) //28.05.2007 11:12 ak cTip := "Anh„nge im Postverzeichnis gespeichert!" // 11.07.2007 09:50 ak ENDIF IF nHandle != -1 FWrite( nHandle, oMimeContent:getMessage() ) FClose( nHandle ) AAdd( aEMail[ EMAIL_ATTACHMENT ], xTemp ) ENDIF ENDIF /* * we add only parts of content type "text/xxx" */ IF "text/" $ Lower( oMimeContent:getContentType() ) AAdd( aEMail[ EMAIL_CONTENTS ], oMimeContent:getMessage() ) ENDIF NEXT RETURN cTip // EOF