Workflow: render a valid n8n JSON for Emailreadimap Nextcloud Send
Integrations: emailReadImap, function, nextCloud

{"nodes": [{"name": "IMAP Email", "type": "n8n-nodes-base.emailReadImap", "position": [240, 420], "parameters": {"format": "resolved", "mailbox": "Invoices", "options": {"customEmailConfig": "[\"ALL\"]"}}, "typeVersion": 1}, {"name": "Nextcloud", "type": "n8n-nodes-base.nextCloud", "position": [940, 420], "parameters": {"path": "=Documents/Invoices/{{$json[\"date\"]}}_{{$json[\"from\"]}}_{{$binary.file.fileName}}", "binaryDataUpload": true, "binaryPropertyName": "file"}, "typeVersion": 1}, {"name": "Map each attachment", "type": "n8n-nodes-base.function", "position": [620, 420], "parameters": {"functionCode": "const _ = require('lodash')\n\nconst sanitize = str => _.chain(str)\n  .replace(/[^A-Za-z0-9&.-]/g, '-') // sanitise via whitelist of characters\n  .replace(/-(?=-)/g, '') // remove repeated dashes - https://regexr.com/6ag8h\n  .trim('-') // trim any leading/trailing dashes\n  .truncate({\n    length: 60,\n    omission: '-' // when the string ends with '-', you'll know it was truncated\n  })\n  .value()\n\nconst result = _.flatMap(items.map(item => {\n  //console.log({item})\n\n  // Maps each attachment to a separate item\n  return _.values(item.binary).map(file => {\n    console.log(\"Saving attachement:\", file.fileName, 'from:', ...item.json.from.value)\n    \n    // sanitize filename but exclude extension\n    const filename_parts = file.fileName.split('.')\n    const ext = _.slice(filename_parts, filename_parts.length-1)\n    const filename_main = _.join(_.dropRight(filename_parts), '.')\n    file.fileName = sanitize(filename_main) + '.' + ext\n    \n    return {\n      json: {\n        from: sanitize(item.json.from.value[0].name),\n        date: sanitize(new Date(item.json.date).toISOString().split(\"T\")[0]) // get date part \"2020-01-01\"\n      }, \n      binary: { file }\n    }\n  })\n}))\n\n//console.log(result)\nreturn result"}, "typeVersion": 1}], "connections": {"IMAP Email": {"main": [[{"node": "Map each attachment", "type": "main", "index": 0}]]}, "Map each attachment": {"main": [[{"node": "Nextcloud", "type": "main", "index": 0}]]}}}