Mails senden, abrufen und decodieren - ganz easy ;-)
Das SMTP Control sendet, das POP3 Control empfängt und der Mail-Parser
(Klassenobjekt) decodiert empfangene Mails im Handumdrehen - natürlich
unter Berücksichtigung von Multi-Part MIME Nachrichten, Anlagen u.v.m.
Oft steht man vor dem Problem, einen kompletten Dateipfad vorliegen zu haben, aus dem man allerdings nur einen Teil benötigt. Generell setzt sich ein Dateipfad aus vier Teilen zusammen:
Um nun diesen Pfad in seine Einzelteile zerlegen zu können, kann man auf verschiedene Art und Weise vorgeben:
Lösung 1: Nutzung des Windows Scripting Host
Um den Windows Scripting Host benutzen zu können, muss man entweder einen Verweis auf die entsprechende DLL-Datei (SCRRUN.DLL im System-Verzeichnis) setzen, oder aber mit LateBinding (sprich: CreateObject) arbeiten.
Code:
Sub SplitPath(ByVal sSourcePath As String, ByRef sDrive As String, _
ByRef sPath As String, ByRef sFilename As String, _
ByRef sExtension AsString)
'// ------------------------------------------------------------------------'// Die Variablen sDrive, sPath, sFilename und sExtension müssen ByRef'// übergeben werden (was standardmäßig der Fall ist, und hier nur'// exemplarisch dargestellt ist), damit diese als Rückgabewerte fungieren'// können. ByVal übergibt eine Kopie und ist somit nicht für die Rückgabe'// geeignet.'// ------------------------------------------------------------------------'// Variante 1 MIT Verweis auf die Microsoft Scripting Runtime.'// Hier ist ein Verweis auf die SCRRUN.DLL im System-Verzeichnis notwendig.'// ------------------------------------------------------------------------Dim objFso AsNew FileSystemObject
'// ------------------------------------------------------------------------'// ODER Variante 2 OHNE Verweis auf Microsoft Scripting Runtime'// ------------------------------------------------------------------------Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")
'// ------------------------------------------------------------------------
sDrive = objFso.GetDriveName(sSourcePath)
sPath = objFso.GetParentFolderName(sSourcePath)
sFilename = objFso.GetBaseName(sSourcePath)
sExtension = objFso.GetExtensionName(sSourcePath)
EndSubSub Beispiel()
Dim sDrive AsStringDim sPath AsStringDim sFilename AsStringDim sExtension AsStringDim sSourcePath AsString
sSourcePath = "C:\Programme\Microsoft Office\Office10\WINWORD.EXE"
Call SplitPath(sSourcePath, sDrive, sPath, sFilename, sExtension)
'// Ausgabe ----------------------------------------------------------------Debug.Print "Originalpfad: "; sSourcePath
Debug.Print "Laufwerk: "; sDrive
Debug.Print "Pfad: "; sPath
Debug.Print "Dateiname: "; sFilename
Debug.Print "Dateierweiterung: "; sExtension
'// ------------------------------------------------------------------------'// Originalpfad: C:\Programme\Microsoft Office\Office10\WINWORD.EXE'// Laufwerk: C:'// Pfad: C:\Programme\Microsoft Office\Office10'// Dateiname: WINWORD'// Dateierweiterung: EXE'// ------------------------------------------------------------------------EndSub
Hinweis: man muss sich für eine Variante entscheiden und den entsprechenden Teil im Beispiel deaktivieren oder löschen.
Lösung 2: String-Manipulation mit VBA-Hausmitteln
Unter Berücksichtigung von VBA-Version < 6 wird auf die neue Funktion InStrRev() aus VBA 6.0 in folgendem Beispiel verzichtet:
Code:
Sub SplitPath(ByVal sSourcePath As String, ByRef sDrive As String, _
ByRef sPath As String, ByRef sFilename As String, _
ByRef sExtension AsString)
Dim iOffset AsInteger'// ------------------------------------------------------------------------'// Zunächst den ersten Backslash suchen'// ------------------------------------------------------------------------
iOffset = InStr(sSourcePath, "\")
If iOffset = 0 ThenExit Sub'da ungültiger Dateipfad'// ------------------------------------------------------------------------'// Laufwerksbuchstaben ohne Backslash merken'// ------------------------------------------------------------------------
sDrive = Left(sSourcePath, iOffset - 1)
'// ------------------------------------------------------------------------'// Jetzt den Ordner ermitteln'// ------------------------------------------------------------------------
sPath = Mid(sSourcePath, iOffset + 1)
'// ------------------------------------------------------------------------'// In String für den Ordner befindet sich jetzt noch der Dateiname,'// also den String bis zum letzten Backslash rückwärts durchsuchen'// ------------------------------------------------------------------------For iOffset = Len(sPath) To 1 Step -1
If Mid(sPath, iOffset, 1) = "\" Then '// Letzten Backslash gefunden
sFilename = Mid(sPath, iOffset + 1)
sPath = Left(sPath, iOffset - 1)
Exit ForEndIfNext'// ------------------------------------------------------------------------'// Dateiendung ermitteln; da es mehrere Punkte in einem Dateinamen'// geben darf, zählt hier nur der letzte.'// ------------------------------------------------------------------------If Len(sFilename) > 0 ThenFor iOffset = Len(sFilename) To 1 Step -1
If Mid(sFilename, iOffset, 1) = "." Then '// Letzten Punkt gefunden
sExtension = Mid(sFilename, iOffset + 1)
sFilename = Left(sFilename, iOffset - 1)
Exit ForEndIfNextEndIfEndSubSub Beispiel()
Dim sDrive AsStringDim sPath AsStringDim sFilename AsStringDim sExtension AsStringDim sSourcePath AsString
sSourcePath = "C:\Programme\Microsoft Office\Office10\WINWORD.EXE"
Call SplitPath(sSourcePath, sDrive, sPath, sFilename, sExtension)
'// Ausgabe ----------------------------------------------------------------Debug.Print "Originalpfad: "; sSourcePath
Debug.Print "Laufwerk: "; sDrive
Debug.Print "Pfad: "; sPath
Debug.Print "Dateiname: "; sFilename
Debug.Print "Dateierweiterung: "; sExtension
'// ------------------------------------------------------------------------'// Originalpfad: C:\Programme\Microsoft Office\Office10\WINWORD.EXE'// Laufwerk: C:'// Pfad: Programme\Microsoft Office\Office10'// Dateiname: WINWORD'// Dateierweiterung: EXE'// ------------------------------------------------------------------------EndSub
Lösung 3: API
Die hier vorgestellte API Lösung setzt voraus, dass auf dem System die Datei Shlwapi.dll in der Version 4.71 oder höher vorliegt. Dies in dann der Fall, wenn der Internet Explorer 4.0 oder höher installiert ist. Wie man nachfolgend sehen kann, ist der API-Weg deutlich aufwendiger:
Code:
DeclareFunction PathFindExtension Lib "shlwapi" Alias _
"PathFindExtensionA" _
(ByVal pPath AsString) AsLongDeclareFunction PathFindFileName Lib "shlwapi" Alias _
"PathFindFileNameA" _
(ByVal pPath AsString) AsLongDeclareFunction PathFindNextComponent Lib "shlwapi" Alias _
"PathFindNextComponentA" _
(ByVal pPath AsString) AsLongDeclareFunction PathStripToRoot Lib "shlwapi" Alias _
"PathStripToRootA" _
(ByVal pPath AsString) AsLongDeclareFunction lstrcpyA Lib "kernel32" _
(ByVal RetVal As String, _
ByVal Ptr AsLong) AsLongDeclareFunction lstrlenA Lib "kernel32" _
(ByVal Ptr As Any) AsLongSub SplitPath(ByVal sSourcePath As String, ByRef sDrive As String, _
ByRef sPath As String, ByRef sFilename As String, _
ByRef sExtension AsString)
'// ------------------------------------------------------------------------'// Laufwerk extrahieren'// ------------------------------------------------------------------------
sDrive = sSourcePath
Call PathStripToRoot(sDrive): sDrive = TrimNull(sDrive)
'// ------------------------------------------------------------------------'// Dateiname extrahieren'// ------------------------------------------------------------------------
sFilename = GetStrFromPtrA(PathFindFileName(sSourcePath))
'// ------------------------------------------------------------------------'// Dateiendung extrahieren'// ------------------------------------------------------------------------
sExtension = GetStrFromPtrA(PathFindExtension(sSourcePath))
'// ------------------------------------------------------------------------'// Verzeichnis ermitteln'// ------------------------------------------------------------------------
sPath = sSourcePath
sPath = GetStrFromPtrA(PathFindNextComponent(sPath))
sPath = Left(sPath, Len(sPath) - (Len(sFilename) + 1))
'// ------------------------------------------------------------------------'// Dateiname ohne Extension ermitteln'// ------------------------------------------------------------------------
sFilename = Left(sFilename, Len(sFilename) - Len(sExtension))
EndSubPrivate Function TrimNull(sItem AsString)
'// Sucht das erste Chr(0)-Zeichen im String und gibt den'// String bis zu dieser Position zurück.'// Kommt kein Chr(0)-Zeichen vor, wird der ganze String zurückgegeben.Dim iPos AsInteger
iPos = InStr(sItem, Chr$(0))
If iPos Then
TrimNull = Left$(sItem, iPos - 1)
Else: TrimNull = sItem
EndIfEndFunctionFunction GetStrFromPtrA(ByVal lpszA AsLong) AsString'// Anhand der Speicheradresse einer Variablen wird'// deren Wert ausgelesen und als String zurückgegeben
GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
EndFunctionSub Beispiel()
Dim sDrive AsStringDim sPath AsStringDim sFilename AsStringDim sExtension AsStringDim sSourcePath AsString
sSourcePath = "C:\Programme\Microsoft Office\Office10\WINWORD.EXE"
Call SplitPath(sSourcePath, sDrive, sPath, sFilename, sExtension)
'// Ausgabe ----------------------------------------------------------------Debug.Print "Originalpfad: "; sSourcePath
Debug.Print "Laufwerk: "; sDrive
Debug.Print "Pfad: "; sPath
Debug.Print "Dateiname: "; sFilename
Debug.Print "Dateierweiterung: "; sExtension
'// ------------------------------------------------------------------------'// Originalpfad: C:\Programme\Microsoft Office\Office10\WINWORD.EXE'// Laufwerk: C:\'// Pfad: Programme\Microsoft Office\Office10'// Dateiname: WINWORD'// Dateierweiterung: .EXE'// ------------------------------------------------------------------------EndSub
Copyright 2000-2003 Microsys
Kramer– Alle Rechte vorbehalten - Der Download von Tipps und
Programmen von den Seiten www.access-paradies.de erfolgt auf eigene
Gefahr. Microsys Kramer haftet nicht für Schäden, die
aus der Installation oder der Nutzung von Tipps oder Software aus
dem Download-Bereich erfolgen. Trotz aktueller Virenprüfung
ist eine Haftung für Schäden und Beeinträchtigungen
durch Computerviren ausgeschlossen. Schadenersatzansprüche,
aus welchem Rechtsgrund auch immer, sind ausgeschlossen, wenn Microsys
Kramer nicht Vorsatz oder grobe Fahrlässigkeit zu vertreten
hat. Dies gilt auch für Ansprüche auf Ersatz von Folgeschäden
wie Datenverlust.
Microsoft, Access, Word, Excel, Outlook, Outlook Express, Visual Basic und Windows sind eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.