Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Mailanhänge aus Lotus Notes in Ordner ablegen

Mailanhänge aus Lotus Notes in Ordner ablegen
01.04.2017 21:49:59
Henner
Guten Abend Excelaner
Ich muss aus einem Postfach in Lotus Notes alle E-Mails auslesen und die Dateianhänge (*.jpg) in Ordner im Pfad "C:/images/" ablegen. Der Ordner muss aus der ersten Zahl des Betreffs der jeweiligen E-Mail bestehen.
Dazu habe ich hier einiges an Code gefunden, der macht aber natürlich nicht das was ich benötige:

https://dbwiki.net/wiki/VBA_Tipp:_E-Mails_mit_Attachments_aus_Notes_auslesen
Hier noch einige Anforderungen:
- Der Betreff jeder E-Mail hat das Format 12345678 (123456). Der Ordner, in dem die Fotos aus dieser E-Mail abgelegt werden sollen, muss in diesem Fall "12345678" heissen (Kann auch das Zeichen "-" enthalten).
- Es gibt E-Mails ohne Fotos und E-Mails mit mehreren Fotos. Es kann auch mehrere E-Mails mit dem gleichen Betreff und/oder der gleichen Zahl am Anfang geben. Somit kann es vorkommen, dass der zu erstellende Ordner bereits existiert.
- Die Fotos sollen unter dem Namen im jeweiligen Ordner gepseichert werden, den sie auch in der E-Mail haben (z.B.: "IMG_2319.jpg").
Ich habe den Code mal in eine Excel Datei kopiert und "Mailfile" und "Server" hinzugefügt sowie einige Korrekturen vorgenommen.
Vielen vielen Dank im Voraus, schönen Abend & Gruss
Henner

https://www.herber.de/bbs/user/112555.xlsm _
a>

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
03.04.2017 10:44:42
mumpel
Hallo!
Frag mal im Notes-Forum nach. Das Notes Forum
Gruß, René
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
03.04.2017 14:41:24
Henner
Hallo René,
danke für Deine Antwort. Da der Code die grundsätzlichen Funktionen wie Auslesen einer Notes Datenbank und Extrahieren von Dateianhängen bereits mitbringt, hatte ich die Hoffnung dass ein versierter VBAler die entsprechenenden Änderungen vornehmen könnte.
Ich warte nochmal ob jemand eine Lösung liefern kann und würde mich ansonsten an das genannte Forum wenden und den Thread verlinken.
Gruss Henner
Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
03.04.2017 17:08:20
Sven
Hi, so funktioniert es...
Du musst halt noch Server und Mailfile hinterlegen. Diese Angaben findest Du in Notes unter
DATEI -> ANWENDUNGEN -> EINSTELLUNGEN

Const myServer As String = "HIER SERVER EINTRAGEN"
Const myMailfile As String = "HIER MAILFILE EINTRAGEN"
Public Function NotesEMailsAnzeigen() As Integer
On Error GoTo ErrBeh
Dim intErgebnis As Integer
Dim objNotes As Object
Dim LNdb As Object
Dim LNView As Object
Dim LNDoc As Object
Dim LNItem As Object
Dim strSubject As String
Dim LNWorkspace As Object
Dim LNAttachment As Variant
intErgebnis = 0
Set objNotes = GetObject("", "Notes.NotesSession")
Set LNdb = objNotes.GETDATABASE(myServer, myMailfile)
Set LNWorkspace = CreateObject("notes.notesuiworkspace")
LNWorkspace.OpenDatabase myServer, myMailfile
If Not (LNdb Is Nothing) Then
Set LNView = LNdb.GETVIEW("$Inbox")
If Not (LNView Is Nothing) Then
Call LNView.Refresh
Set LNDoc = LNView.GETFIRSTDOCUMENT
Do While Not LNDoc Is Nothing
Set LNItem = LNDoc.GETFIRSTITEM("Subject")
Debug.Print LNItem.Text
Select Case MsgBox("Soll die Mail mit dem Subject: " + vbNewLine + vbNewLine +  _
LNItem.Text + vbNewLine + " angezeigt werden?", vbYesNo)
Case vbYes
LNWorkspace.EDITDOCUMENT True, LNDoc, False, "", True, True
End Select
Set LNItem = LNDoc.GETFIRSTITEM("Body")
Debug.Print LNItem.Text
If LNDoc.HasEmbedded Then
Debug.Print vbNewLine + "Attached Files:"
For Each LNAttachment In LNItem.EmbeddedObjects
Debug.Print LNAttachment.Name
Select Case MsgBox("Attachment: " & _
LNAttachment.Name & _
" nach C:\ extrahieren?", vbYesNo)
Case vbYes
LNAttachment.ExtractFile ("C:\" + LNAttachment.Name)
End Select
Next
Debug.Print vbNewLine
End If
Set LNDoc = LNView.GETNEXTDOCUMENT(LNDoc)
Loop
End If
End If
GoTo Ende
ErrBeh:
Err.Clear
intErgebnis = 1
Ende:
Set objNotes = Nothing
Set LNdb = Nothing
Set LNView = Nothing
Set LNItem = Nothing
Set LNWorkspace = Nothing
Set LNDoc = Nothing
NotesEMailsAnzeigen = intErgebnis
End Function

Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
03.04.2017 17:52:34
Henner
Hallo Sven
Vielen Dank für Deine Antwort. Das sieht soweit schonmal sehr gut aus. Ich habe die msgBox Abfragen auskommentiert und den Code durchlaufen lassen. Die Fotos werden jetzt exportiert und abgelegt.
Allerdings funktionieren 2 Sachen noch nicht:
- Die Fotos werden nicht in einen Unterordner gespeichert, der als Namen den 1. Teil des E-Mail Betreffs tragen soll, sondern alle in einen Ordner gespeichert.
- Der Code hört nach 253 Fotos resp. 89 E-Mails auf zu arbeiten. Würde es helfen jede Mail nach dem Auslesen wieder zu schliessen? Wenn ja, wie ginge das? Oder woran könnte es sonst liegen?
Vielen Vielen Dank für Deine Hilfe und Gruss
Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
04.04.2017 15:58:07
Sven
Hi, kommt nach der ersten Zahl bei Dir immer ein "Blank"? Ansonsten schau ich nochmal über den Code, bzgl. dem 2. Punkt von Dir...
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
04.04.2017 16:33:50
Sven
So, habe nochmals etwas angepasst...
Unter

Const savePath As String = "D:\"
musst Du noch den Pfad setzen, wo die Dateien gespeichert werden sollen. Die Unterordner (z.B. 12345678) werden automatisch generiert und das Attachment darin abgelegt.

Const myServer As String = "LNT04110/SRV/DACH041/DACHSER/DE"
Const myMailfile As String = "mail\ssoellne.nsf"
Const savePath As String = "D:\"
Public Function NotesEMailsAnzeigen() As Integer
On Error GoTo ErrBeh
Dim filePath As String
Dim intErgebnis As Integer
Dim objNotes As Object
Dim LNdb As Object
Dim LNView As Object
Dim LNDoc As Object
Dim LNItem As Object
Dim strSubject As String
Dim LNWorkspace As Object
Dim LNAttachment As Variant
intErgebnis = 0
Set objNotes = GetObject("", "Notes.NotesSession")
Set LNdb = objNotes.GETDATABASE(myServer, myMailfile)
Set LNWorkspace = CreateObject("notes.notesuiworkspace")
LNWorkspace.OpenDatabase myServer, myMailfile
If Not (LNdb Is Nothing) Then
Set LNView = LNdb.GETVIEW("$Inbox")
If Not (LNView Is Nothing) Then
Call LNView.Refresh
Set LNDoc = LNView.GETFIRSTDOCUMENT
Do While Not LNDoc Is Nothing
Set LNItem = LNDoc.GETFIRSTITEM("Subject")
On Error Resume Next
filePath = Trim(Left(LNItem.Text, InStr(1, LNItem.Text, " ", vbTextCompare)) _
)
Debug.Print filePath
MkDir savePath
MkDir savePath & "\" & filePath
On Error GoTo 0
Debug.Print LNItem.Text
Set LNItem = LNDoc.GETFIRSTITEM("Body")
If LNDoc.HasEmbedded Then
For Each LNAttachment In LNItem.EmbeddedObjects
Debug.Print LNAttachment.Name
LNAttachment.ExtractFile (savePath + "\" + filePath + "\" +  _
LNAttachment.Name)
Next
End If
Set LNDoc = LNView.GETNEXTDOCUMENT(LNDoc)
Loop
End If
End If
GoTo Ende
ErrBeh:
Err.Clear
intErgebnis = 1
Ende:
Set objNotes = Nothing
Set LNdb = Nothing
Set LNView = Nothing
Set LNItem = Nothing
Set LNWorkspace = Nothing
Set LNDoc = Nothing
NotesEMailsAnzeigen = intErgebnis
End Function

Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
04.04.2017 20:13:38
Henner
Hallo Sven,
tausend Dank für Dein Engagement - der Code funktioniert super!
- Würdest Du mir noch sagen wie ich die Anzahl der E-Mails in dem Postfach ermitteln kann? Da der ganze Prozess relativ lange dauert würde ich gerne eine progress bar einbauen. Das Einbauen der Anzeige ist für mich kein Problem, ich muss nur wissen wie ich die Anzahl der auszulesenden Dokumente ermitteln kann.
- Wäre es noch möglich dass nur alle Fotos abgelegt werden die "Q3" oder "Q4" in ihrem Dateinamen haben?
Nochmal: Vielen vielen Dank! Gruss Henner
Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
04.04.2017 20:35:47
Henner
Ich nochmal...
Ich habe den Code jetzt soweit umbauen können, dass nur Fotos abgelegt werden die in ihrem Dateinamen "Q3" oder "Q4" enthalten und auch nur ein Ordner angelegt wird wenn auch Fotos abgelegt werden. Die UserForm mit dem Counter ist auch schon drin, da fehlt mir allerdings jetzt noch der Zielwert (Gesamt Anzahl E-Mails im Postfach).
Wäre super wenn Du mir die Zeile noch verraten würdest. DANKE! Gruss Henner

Public Function NotesEMailsAnzeigen() As Integer
On Error GoTo ErrBeh
Dim filePath As String
Dim intErgebnis As Integer
Dim objNotes As Object
Dim LNdb As Object
Dim LNView As Object
Dim LNDoc As Object
Dim LNItem As Object
Dim strSubject As String
Dim LNWorkspace As Object
Dim LNAttachment As Variant
Dim savePath As String
Dim myMailfile As String
Dim myServer As String
savePath = ThisWorkbook.Path & "\img2\"
myServer = "CHSDBNN12/SCH"
myMailfile = "MAIL/SCH/mailin/quickche.nsf"
intErgebnis = 0
Set objNotes = GetObject("", "Notes.NotesSession")
Set LNdb = objNotes.GETDATABASE(myServer, myMailfile)
Set LNWorkspace = CreateObject("notes.notesuiworkspace")
LNWorkspace.OpenDatabase myServer, myMailfile
UserForm1.Show vbModeless
UserForm1.Label1.Caption = 1
If Not (LNdb Is Nothing) Then
Set LNView = LNdb.GETVIEW("$Inbox")
If Not (LNView Is Nothing) Then
Call LNView.Refresh
Set LNDoc = LNView.GETFIRSTDOCUMENT
Do While Not LNDoc Is Nothing
Set LNItem = LNDoc.GETFIRSTITEM("Subject")
On Error GoTo 0
Debug.Print LNItem.Text
Set LNItem = LNDoc.GETFIRSTITEM("Body")
If LNDoc.HasEmbedded Then
For Each LNAttachment In LNItem.EmbeddedObjects
Debug.Print LNAttachment.Name
If InStr(LNAttachment.Name, "Q3") > 0 = True Or InStr(LNAttachment.Name, _
"Q4") > 0 = True Then
Set LNItem = LNDoc.GETFIRSTITEM("Subject")
On Error Resume Next
filePath = Trim(Left(LNItem.Text, InStr(1, LNItem.Text, " ",  _
vbTextCompare)))
Debug.Print filePath
MkDir savePath
MkDir savePath & "\" & filePath
LNAttachment.ExtractFile (savePath & "\" & filePath + "\" &  _
LNAttachment.Name)
End If
UserForm1.Label1.Caption = UserForm1.Label1.Caption + 1
DoEvents
Next
End If
Set LNDoc = LNView.GETNEXTDOCUMENT(LNDoc)
Loop
End If
End If
Unload UserForm1
GoTo Ende
ErrBeh:
Err.Clear
intErgebnis = 1
Ende:
Set objNotes = Nothing
Set LNdb = Nothing
Set LNView = Nothing
Set LNItem = Nothing
Set LNWorkspace = Nothing
Set LNDoc = Nothing
NotesEMailsAnzeigen = intErgebnis
End Function

Anzeige
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
04.04.2017 21:08:51
Henner
Sorry, noch eine Frage.
Wie kann ich diese Function aus einer Sub heraus aufrufen? Danke und Gruss
AW: Mailanhänge aus Lotus Notes in Ordner ablegen
05.04.2017 08:45:37
Sven
Hi,
so ermittelst Du die Anzahl der Mails...

Dim cntMails as Long
cntMails = LNView.allentries.Count
Diese Code am besten unter die Zeile
Set LNView = LNdb.GETVIEW("$Inbox")
Die Function rufst Du ganz simple über die Sub wie folgt auf:
public sub test()
NotesEMailsAnzeigen
end sub

Anzeige
(ERL&RM) AW: Mailanhänge aus Lotus Notes in Ordner
06.04.2017 09:32:47
Henner
Hi Sven,
funktioniert jetzt perfekt.
Beim Aufrufen der Function hatte ich übrigens noch n ganz anderen Fehler drin - daher erledigt.
Wenn Du wüsstest wie viel Handarbeit Du mir erspart hast... DANKE!
Schönen Tag und Gruss
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Mailanhänge aus Lotus Notes in Ordner ablegen


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung öffnen: Öffne Excel und gehe in die Entwicklertools, um das VBA-Editor-Fenster zu öffnen.

  2. Neues Modul erstellen: Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Code einfügen: Kopiere den folgenden VBA-Code in das Modul. Achte darauf, den Server und das Mailfile anzupassen.

    Const myServer As String = "HIER SERVER EINTRAGEN"
    Const myMailfile As String = "HIER MAILFILE EINTRAGEN"
    Const savePath As String = "C:\images\"
    
    Public Function NotesEMailsAnzeigen() As Integer
       On Error GoTo ErrBeh
       Dim filePath As String
       Dim intErgebnis As Integer
       Dim objNotes As Object
       Dim LNdb As Object
       Dim LNView As Object
       Dim LNDoc As Object
       Dim LNItem As Object
       Dim LNAttachment As Variant
       intErgebnis = 0
       Set objNotes = GetObject("", "Notes.NotesSession")
       Set LNdb = objNotes.GETDATABASE(myServer, myMailfile)
       Set LNView = LNdb.GETVIEW("$Inbox")
       Call LNView.Refresh
       Set LNDoc = LNView.GETFIRSTDOCUMENT
    
       Do While Not LNDoc Is Nothing
           Set LNItem = LNDoc.GETFIRSTITEM("Subject")
           filePath = Trim(Left(LNItem.Text, InStr(1, LNItem.Text, " ", vbTextCompare)))
           MkDir savePath & "\" & filePath
    
           If LNDoc.HasEmbedded Then
               For Each LNAttachment In LNItem.EmbeddedObjects
                   LNAttachment.ExtractFile (savePath & "\" & filePath & "\" & LNAttachment.Name)
               Next
           End If
           Set LNDoc = LNView.GETNEXTDOCUMENT(LNDoc)
       Loop
    
       GoTo Ende
    ErrBeh:
       Err.Clear
    Ende:
       Set objNotes = Nothing
       Set LNdb = Nothing
       Set LNView = Nothing
       Set LNItem = Nothing
       Set LNDoc = Nothing
       NotesEMailsAnzeigen = intErgebnis
    End Function
  4. Code anpassen: Stelle sicher, dass der savePath korrekt zu deinem gewünschten Ordner (z.B. C:\images\) zeigt.

  5. Funktion ausführen: Du kannst die Funktion über eine Sub aufrufen:

    Public Sub StartExport()
       NotesEMailsAnzeigen
    End Sub

Häufige Fehler und Lösungen

  • Fehler beim Erstellen von Ordnern: Wenn der Code beim Erstellen der Ordner fehlschlägt, prüfe, ob der savePath korrekt ist und ob du die nötigen Berechtigungen hast.

  • Keine Anhänge exportiert: Stelle sicher, dass die E-Mails tatsächlich Anhänge haben und dass die Funktion HasEmbedded korrekt überprüft wird.

  • E-Mails werden nicht geladen: Überprüfe, ob der Server und das Mailfile korrekt angegeben sind.


Alternative Methoden

Falls du keine VBA-Lösung verwenden möchtest, kannst du auch:

  • Lotus Notes Mail exportieren: Über die "Exportieren"-Funktion in Lotus Notes die Mails in ein anderes Format speichern und dann mit einem Skript weiterverarbeiten.

  • Drittanbieter-Tools: Es gibt spezielle Tools zur Automatisierung von Lotus Notes, die die E-Mail-Extraktion vereinfachen können.


Praktische Beispiele

  • Exportieren von Bildern: Der oben gezeigte Code exportiert alle JPG-Dateien aus den E-Mails in die entsprechenden Ordner, die nach dem Betreff der E-Mail benannt sind.

  • Filtern von E-Mails: Du kannst den Code erweitern, um nur E-Mails mit bestimmten Kriterien (z.B. Betreffsanfang) zu exportieren.


Tipps für Profis

  • Fehlerbehandlung verbessern: Implementiere eine detaillierte Fehlerprotokollierung, um Probleme bei der Verarbeitung zu identifizieren.

  • Performance optimieren: Füge einen Fortschrittsbalken hinzu, um den Status des Exports anzuzeigen, besonders wenn viele E-Mails verarbeitet werden.

  • Batch-Verarbeitung: Überlege, den Export in Batches durchzuführen, um die Leistung zu steigern und die Belastung des Systems zu reduzieren.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur die gewünschten Anhänge exportiert werden?
Du kannst die Bedingungen im Code anpassen, um nur bestimmte Dateitypen oder Dateinamen zu exportieren.

2. Wie zähle ich die Anzahl der E-Mails im Postfach?
Verwende den folgenden Code, um die Anzahl der E-Mails zu ermitteln:

Dim cntMails as Long
cntMails = LNView.allentries.Count

3. Kann ich den Code anpassen, um nur E-Mails mit bestimmten Betreffs zu exportieren?
Ja, füge einfach eine Bedingung in die Schleife ein, die prüft, ob der Betreff den gewünschten Text enthält.

4. Wie kann ich die Funktion aus einer anderen Sub aufrufen?
Rufe die Funktion einfach auf, indem du den Funktionsnamen in deiner Sub verwendest, z.B.:

Public Sub Test()
    NotesEMailsAnzeigen
End Sub

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige