Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Blockly
  5. Mail mit mehr als 2 Anhängen?

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    492

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.6k

Mail mit mehr als 2 Anhängen?

Geplant Angeheftet Gesperrt Verschoben Blockly
blocklycommunication
37 Beiträge 4 Kommentatoren 2.0k Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • lost in translationL Offline
    lost in translationL Offline
    lost in translation
    schrieb am zuletzt editiert von
    #28
    var von, an, betreff, text, bilder, Bildzaehler, wgetsleeptime, MailSender, EmailEmpfaenger, Bilderpfad, Name_Kamera1, Name_Kamera2, IP_Kamera1, IP_Kamera2, IP_NAS, UserName_NAS, NAS_Zielpfad, Name_Kamera, IP_Kamera, Bilderliste, datum, zeit, dateiname_1, dateimitpfad1, dateiname_2, dateimitpfad2, i;
    /**
     * Beschreibe diese Funktion …
     */
    function sendmail(von, an, betreff, text, bilder) {
        var attaches = [];
        
        for(var bild in bilder) {
            attaches.push({path: bilder[bild], cid: "image" + bild});
        }
        
        console.log(JSON.stringify(attaches));
        
        sendTo("email", {
            from:    von,
            to:      an,
            subject: betreff,
            html: text,
           attachments: attaches
        });
    }
    
    function listsRepeat(value, n) {
      var array = [];
      for (var i = 0; i < n; i++) {
        array[i] = value;
      }
      return array;
    }
    
    
    Bildzaehler = 0;
    wgetsleeptime = 0.3;
    MailSender = 'iobroker@meinedomain.de';
    EmailEmpfaenger = 'ich@meinedomain.de';
    Bilderpfad = '/opt/iobroker/kameras/';
    Name_Kamera1 = 'xx';
    Name_Kamera2 = 'yy';
    IP_Kamera1 = '192.168.xx.nn';
    IP_Kamera2 = '192.168.yy.nn';
    IP_NAS = '192.168.yy.nn';
    UserName_NAS = 'gandalf_der_zarte';
    NAS_Zielpfad = '/vol1/files/Bilder/Kameras/';
    Name_Kamera = Name_Kamera1;
    IP_Kamera = IP_Kamera1;
    Bilderliste = listsRepeat('/opt/iobroker/kameras/noimage.jpg', 1);
    datum = formatDate(new Date(), "JJJJ-MM-TT");
    // Ab hier Bilder holen
    zeit = formatDate(new Date(), "SS.mm.ss");
    dateiname_1 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'_',Bildzaehler,'.jpg'].join('');
    dateimitpfad1 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_1].join('');
    exec((['wget --output-document ',dateimitpfad1,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\''].join('')), function (error, result, stderr) {
        Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad1);
      Name_Kamera = Name_Kamera2;
      IP_Kamera = IP_Kamera2;
      Bildzaehler = (typeof Bildzaehler == 'number' ? Bildzaehler : 0) + 1;
      zeit = formatDate(new Date(), "SS.mm.ss");
      dateiname_2 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'_',Bildzaehler,'.jpg'].join('');
      dateimitpfad2 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_2].join('');
      exec((['wget --output-document ',dateimitpfad2,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\'','  &&sleep ' + String(wgetsleeptime)].join('')), function (error, result, stderr) {
          Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad2);
        Name_Kamera = Name_Kamera1;
        IP_Kamera = IP_Kamera1;
        Bildzaehler = (typeof Bildzaehler == 'number' ? Bildzaehler : 0) + 1;
    // hier Bilder geholt    
    Bilderliste.pop();
    sendmail(MailSender, EmailEmpfaenger, 'Testbetreff', 'TestBilder', Bilderliste);
    for (var i_index in Bilderliste) {
        i = Bilderliste[i_index];
        exec(([['sleep ',10 + Math.random() * 5,' && scp '].join(''),i,[' ',UserName_NAS,'@',IP_NAS,':',NAS_Zielpfad,'Haustuer/'].join(''),datum,'/ && rm ' + String(i)].join('')));
        console.log("exec: " + ([['sleep ',10 + Math.random() * 5,' && scp '].join(''),i,[' ',UserName_NAS,'@',IP_NAS,':',NAS_Zielpfad,'Haustuer/'].join(''),datum,'/ && rm ' + String(i)].join('')));
        };
      })})
                                                                                
    
    

    Hab ich jetzt mal aus der Javascript Ansicht meines Blockly kopiert und es schickt eine Mail mit 2 Attachements. Jetzt müsste ich ja eigentlich "nur noch" diese Abhängigkeit auflösen und stattdessen mit dem await hantieren.

    Es ist fast zu einfach...

    Frank

    1 Antwort Letzte Antwort
    0
    • lost in translationL Offline
      lost in translationL Offline
      lost in translation
      schrieb am zuletzt editiert von
      #29

      Meinst Du mit Node 8+ das hier:

      /opt/iobroker$ node --version

      v8.16.0

      ?

      ciao
      frank

      AlCalzoneA 1 Antwort Letzte Antwort
      0
      • lost in translationL lost in translation

        Meinst Du mit Node 8+ das hier:

        /opt/iobroker$ node --version

        v8.16.0

        ?

        ciao
        frank

        AlCalzoneA Offline
        AlCalzoneA Offline
        AlCalzone
        Developer
        schrieb am zuletzt editiert von
        #30

        @lost-in-translation sagte in Mail mit mehr als 2 Anhängen?:

        Meinst Du mit Node 8+ das hier:

        ja!

        Ich bin mir gerade nicht sicher, wo du hängst. Am besten mal ein Minimalbeispiel posten (ohne überflüssigen Schnickschnack).

        Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

        lost in translationL 1 Antwort Letzte Antwort
        0
        • AlCalzoneA AlCalzone

          @lost-in-translation sagte in Mail mit mehr als 2 Anhängen?:

          Meinst Du mit Node 8+ das hier:

          ja!

          Ich bin mir gerade nicht sicher, wo du hängst. Am besten mal ein Minimalbeispiel posten (ohne überflüssigen Schnickschnack).

          lost in translationL Offline
          lost in translationL Offline
          lost in translation
          schrieb am zuletzt editiert von
          #31

          @AlCalzone

          // Du brauchst eine async-Funktion, die kannst du aber normal aufrufen
          async function wgetsfeuern() {
           // wichtig: let für block-scoped Variablen, sonst hast du den Ärger, 
           // dass nur das letzte Bild hochgeladen wird
           for (let i = 0; i < 20; i++) {
             zeit = formatDate(new Date(), "SS.mm.ss");
             dateiname_1 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'__',i,'.jpg'].join('');
             dateimitpfad1 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_1].join('');
             Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad1);
             // await hält die Funktion an, bis execAsync wirklich fertig ist
             await execAsync(['wget --output-document ',dateimitpfad1,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\'', '  &&sleep ' + String(wgetsleeptime)].join(''));
           }
           // Code hier wird nach allen exec-Befehlen ausgeführt.
          }
          
          
          

          Das läuft soweit, dass alle Dateien auf dem Raspi rumliegen, aber aus mir nicht erkennbaren Gründen wird die List nicht entsprechend erweitert und es wird dadurch weder gemailt, noch kopiert.

          Das mit dem alles gleichzeitig losfeuern ist total lästig, wenn man sequentiell denkt. Und Schleifen sind für mich sequentiell.

          ciao

          frank

          AlCalzoneA 1 Antwort Letzte Antwort
          0
          • lost in translationL lost in translation

            @AlCalzone

            // Du brauchst eine async-Funktion, die kannst du aber normal aufrufen
            async function wgetsfeuern() {
             // wichtig: let für block-scoped Variablen, sonst hast du den Ärger, 
             // dass nur das letzte Bild hochgeladen wird
             for (let i = 0; i < 20; i++) {
               zeit = formatDate(new Date(), "SS.mm.ss");
               dateiname_1 = [datum,'_',zeit,'_','Uhr_',Name_Kamera,'__',i,'.jpg'].join('');
               dateimitpfad1 = [Bilderpfad,Name_Kamera.toLowerCase(),'/',dateiname_1].join('');
               Bilderliste.splice(((Bilderliste.indexOf('/opt/iobroker/kameras/noimage.jpg') + 1) - 1), 0, dateimitpfad1);
               // await hält die Funktion an, bis execAsync wirklich fertig ist
               await execAsync(['wget --output-document ',dateimitpfad1,' \'http://',IP_Kamera,'/media/?user=admin&pwd=&action=snapshot\'', '  &&sleep ' + String(wgetsleeptime)].join(''));
             }
             // Code hier wird nach allen exec-Befehlen ausgeführt.
            }
            
            
            

            Das läuft soweit, dass alle Dateien auf dem Raspi rumliegen, aber aus mir nicht erkennbaren Gründen wird die List nicht entsprechend erweitert und es wird dadurch weder gemailt, noch kopiert.

            Das mit dem alles gleichzeitig losfeuern ist total lästig, wenn man sequentiell denkt. Und Schleifen sind für mich sequentiell.

            ciao

            frank

            AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            schrieb am zuletzt editiert von
            #32

            @lost-in-translation
            Du hast eine komische Art, Strings zu verbinden. Erinnert mich irgendwie an Matlab.
            Und das +1 - 1 versteh ich auch nicht. Ist es wichtig, wo die Bilder in der Liste eingefügt werden? Am Ende täte es auch ein .push(...)

            Um ganz sicher zu gehen: Du rufst die Funktion auch auf, oder? Und wo verarbeitest du die Bilderliste? Nach dem Kommentar in Zeile 13 oder komplett außerhalb der Funktion? Letzeres wird auch mehr oder weniger sofort ausgeführt, ohne auf die wgets zu warten.

            Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

            lost in translationL 1 Antwort Letzte Antwort
            0
            • AlCalzoneA AlCalzone

              @lost-in-translation
              Du hast eine komische Art, Strings zu verbinden. Erinnert mich irgendwie an Matlab.
              Und das +1 - 1 versteh ich auch nicht. Ist es wichtig, wo die Bilder in der Liste eingefügt werden? Am Ende täte es auch ein .push(...)

              Um ganz sicher zu gehen: Du rufst die Funktion auch auf, oder? Und wo verarbeitest du die Bilderliste? Nach dem Kommentar in Zeile 13 oder komplett außerhalb der Funktion? Letzeres wird auch mehr oder weniger sofort ausgeführt, ohne auf die wgets zu warten.

              lost in translationL Offline
              lost in translationL Offline
              lost in translation
              schrieb am zuletzt editiert von
              #33

              @AlCalzone

              genau genommen habe ich die Strings nicht so verbunden. Ich habe in Blockly die Javascript Ansicht eingeschaltet und dann copy-paste gemacht. Daher auch die interessante Art die Liste zu erweitern.

              ciao
              frank

              AlCalzoneA 1 Antwort Letzte Antwort
              0
              • lost in translationL lost in translation

                @AlCalzone

                genau genommen habe ich die Strings nicht so verbunden. Ich habe in Blockly die Javascript Ansicht eingeschaltet und dann copy-paste gemacht. Daher auch die interessante Art die Liste zu erweitern.

                ciao
                frank

                AlCalzoneA Offline
                AlCalzoneA Offline
                AlCalzone
                Developer
                schrieb am zuletzt editiert von
                #34

                @lost-in-translation Ok das erklärts. Wie siehts aus mit den Fragen im zweiten Absatz meines Posts? ;)

                Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                lost in translationL 1 Antwort Letzte Antwort
                0
                • AlCalzoneA AlCalzone

                  @lost-in-translation Ok das erklärts. Wie siehts aus mit den Fragen im zweiten Absatz meines Posts? ;)

                  lost in translationL Offline
                  lost in translationL Offline
                  lost in translation
                  schrieb am zuletzt editiert von
                  #35

                  @AlCalzone said in Mail mit mehr als 2 Anhängen?:

                  @lost-in-translation Ok das erklärts. Wie siehts aus mit den Fragen im zweiten Absatz meines Posts? ;)

                  :-) aufgerufen habe ich die Funktion. Die wgets werden offenbar auch ausgeführt, sonst hätte ich die Dateien nicht im Filesystem liegen. Den Rest muss ich nachgucken, wenn ich wieder Zugriff auf den Raspi habe :-)

                  ciao

                  frank

                  1 Antwort Letzte Antwort
                  0
                  • lost in translationL Offline
                    lost in translationL Offline
                    lost in translation
                    schrieb am zuletzt editiert von
                    #36

                    Hat eigentlich schonmal jemand die persönlichen Daten in ein conf-File ausgelagert? Dann könnte man ein Skript viel einfacher sharen ohne mit dem Zensurstempel drüber zu rasen.

                    Vielleicht gehe ich aber auch grundsätzlich falsch an die Sache ran.
                    Was ich will:
                    von 2 Kameras jeweils 20 Bilder in 30 Sekunden holen.
                    Am liebsten wäre es mir, wenn ich nach dem holen des Bildes so lange warten könnte bis 1,5 Sekunden vergangen sind. Also Bild Kamera 1 holen dauert 0,2 Sekunden -> 1,3 Sekunden Warten -> nächstes Bild (dauert 0,8 Sekunden -> 0,7 Sekunden warten -> nächstes Bild (dauert 2,7 Sekunden) -> 0Sekunden warten - >nächstes Bild ...
                    vor jedem Bild will ich einen Dateinamen mit aktuellem Zeitstempel darin erzeugen.
                    Das die Bilder von Kamera 1 und Kamera 2 parallel geholt werden, wäre für mich Ok. Oder auch jeweils hintereinander (hole Bild Kam1 (0,2s), hole Bild Kam 2 (0,2s), warte 1,1s, hole Bild2 Kam1 ...

                    Also im Prinzip will ich pacen. Wenn das mit Blockly auch anders erreicht werden kann, dann wäre ich über Hinweise dankbar.
                    In Blockly ging es bisher so, dass ich den folgenden wget in die Ergebnisbehandlung des vorherigen gepastet habe und an den einzelnen wget noch einen sleep befehl angehängt habe. Der ist allerdings starr und würde sich nicht reduzieren, wenn der Download von der Kamera mal länger braucht.

                    Vielleicht denke ich auch komplett falsch und sollte jeweils 20 timer setzen, die Bilder zu holen und einen weiteren, sie danach zu verschicken?

                    so weit mal meine Gedanken dazu, wo ich gerade den iobroker nicht zur Hand habe.

                    AlCalzoneA 1 Antwort Letzte Antwort
                    0
                    • lost in translationL lost in translation

                      Hat eigentlich schonmal jemand die persönlichen Daten in ein conf-File ausgelagert? Dann könnte man ein Skript viel einfacher sharen ohne mit dem Zensurstempel drüber zu rasen.

                      Vielleicht gehe ich aber auch grundsätzlich falsch an die Sache ran.
                      Was ich will:
                      von 2 Kameras jeweils 20 Bilder in 30 Sekunden holen.
                      Am liebsten wäre es mir, wenn ich nach dem holen des Bildes so lange warten könnte bis 1,5 Sekunden vergangen sind. Also Bild Kamera 1 holen dauert 0,2 Sekunden -> 1,3 Sekunden Warten -> nächstes Bild (dauert 0,8 Sekunden -> 0,7 Sekunden warten -> nächstes Bild (dauert 2,7 Sekunden) -> 0Sekunden warten - >nächstes Bild ...
                      vor jedem Bild will ich einen Dateinamen mit aktuellem Zeitstempel darin erzeugen.
                      Das die Bilder von Kamera 1 und Kamera 2 parallel geholt werden, wäre für mich Ok. Oder auch jeweils hintereinander (hole Bild Kam1 (0,2s), hole Bild Kam 2 (0,2s), warte 1,1s, hole Bild2 Kam1 ...

                      Also im Prinzip will ich pacen. Wenn das mit Blockly auch anders erreicht werden kann, dann wäre ich über Hinweise dankbar.
                      In Blockly ging es bisher so, dass ich den folgenden wget in die Ergebnisbehandlung des vorherigen gepastet habe und an den einzelnen wget noch einen sleep befehl angehängt habe. Der ist allerdings starr und würde sich nicht reduzieren, wenn der Download von der Kamera mal länger braucht.

                      Vielleicht denke ich auch komplett falsch und sollte jeweils 20 timer setzen, die Bilder zu holen und einen weiteren, sie danach zu verschicken?

                      so weit mal meine Gedanken dazu, wo ich gerade den iobroker nicht zur Hand habe.

                      AlCalzoneA Offline
                      AlCalzoneA Offline
                      AlCalzone
                      Developer
                      schrieb am zuletzt editiert von
                      #37

                      @lost-in-translation

                      Am liebsten wäre es mir, wenn ich nach dem holen des Bildes so lange warten könnte bis 1,5 Sekunden vergangen sind

                      z.B. so:

                      // ...
                      const wgetInterval = 1500; // ms
                      
                      function wait(ms) {
                          return new Promise((resolve) => {
                              setTimeout(resolve, ms);
                          });
                      }
                      
                      for (let i = 0; i < 20; i++) {
                          const startTime = Date.now();
                          await execAsync("Befehl...");
                          // Dauer des Befehls in ms ermitteln
                          const duration = Date.now() - startTime;
                          // Wenn der Befehl zu schnell war, bis zur Mindestzeit warten
                          if (duration < wgetInterval) await wait(wgetInterval - duration);
                      }
                      
                      // ...
                      

                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      521

                      Online

                      32.5k

                      Benutzer

                      81.8k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe