Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

132 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

mailprocessor

GitHubCIGitHub issuesGitHub pull requestCommit activity

Content

About this project

This is a project to automate archiving of documents. Currently, it supports fetching from an email account or working through documents on a folder, being a local folder or on a webdav share.

This project is provided via the MIT-licence, which is free of charge. This is a work-in-progress and done in my spare time.

How to contribute

If you want to participate, feel free to create pull requests, fork this project, create new issues or hit me up with suggestions. When creating an issue or a pull request, please be as detailed as possible.

"I want to participate, but I know nothing about programming 😔"

  • No problem. You can contribute by providing translations for the mappings or contribute by providing feedback, make some suggestions eg.

If you think this project is awesome, you can spend me a beer or a coffee.

BuyMeACoffee

Direct link

How it works

This project uses Camunda BPMN (or see their github repository) for orchestration and DMN for decision tables.

You can access the Camunda Cockpit by going to http://addressofyour.server/camunda

The project is a spring boot project, so it works as a jar file as well as deployed to a tomcat/websphere/glassfish/etc application server. It works closely with my other project called classificator but since it's a simple REST call, you can swap it out to your likings.

BPMN-Process

Configuration

Below there's a sample configuration file in plain old json. Each section can be deactivated by simply deleting the property or using the enabled switch. The path to the configuration is specified in the application.yml.

Example configuration file

[{
"username": "username",
"locale": "en_EN",
"emailproperties": {
"servername": "imap.mail.com",
"port": 993,
"username": "username@mail.com",
"password": "password",
"protocol": "imaps",
"labels": ["inbox", "label1", "label2"],
"markasread": true,
"enabled": false
},
"scanproperties": {
"path": "\\path\\to\\documents",
"port": 0,
"errorfolder": "path\\to\\error",
"successfolder": "path\\to\\success",
"username": "username",
"password": "password",
"scannerprefix": ["scannerprefix"],
"filetypes": ["pdf"],
"enabled": true
},
"archiveproperties": {
"path": "https://webdav.network.share",
"port": 443,
"username": "username",
"password": "password"
},
"reminderproperties": {
"botname": "botname",
"token": "token",
"chatId": "chatId",
"url": "http://url.call",
"enabled": false
}
}]

Explanation of the sections

General properties

  • username: the user for which this entry is for. Mandatory but can be anything you seem fit
  • locale: the locale the topics should be translated to. Can be left out or deleted if there is no translation to be done

emailproperties

This section is about the configuration of fetching emails. It will only process unread emails.

  • servername: the servername of your mailprovider
  • port: the port the mailserver provides
  • username: the username for your mailaccount
  • password: the password for your mailaccount. I strongly encurage you to use a one-time-password like gmail offers
  • protocol: the protocol which you use to talk to your mailserver. IMAP (recommended) or POP3. IMAP differntiates between "imap" and "imaps" (TLS)
  • labels: the labels or folder you want to process. Use "*" to process all labels and sublabels
  • markasread: mark the processed mails as "read"
  • enabled: the flag to enable or disable this service

scanproperties

This section is about the configuration for fetching scans from a local or a network drive

  • path: the path to your files
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • errorfolder: the folder for the not archived documents
  • successfolder: the folder for the archived documents
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • scannerprefix: the prefix of the filename your scanner produces. Use "*" if you want to process all files. Comes in handy if you're using several scanners and only want to process the output of of a specific subset of scanners
  • filetypes: the filetypes you ## Custom DMN-Table For the routing to work, you need to add want to process. Use "*" to process all files
  • enabled: the flag to enable or disable this service

archiveproperties

This section is about the configuration where your documents will be stored

  • path: the path to your target documents folder
  • port: the port to connect to the network drive. Use "0" or delete this property if the documents are stored on a local folder
  • username: the username for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder
  • password: the password for connecting to the network share. Leave empty or delete this property if the documents are stored on a local folder

reminderproperties

This section is about the configuration of reminders, if there is a document with due dates. Currently I only support telegram

  • botname: the name of the bot
  • token: the telegram-api token
  • chatId: the chatId of the chat where the reminders are published to
  • url: the webhook url of the api
  • enabled: the flag to enable or disable this service

DMN-Table

There is a sample dmn table provided (empty.dmn) with the hit policy "First". This means the first rule matching the given criterias wins. The desicion tables are referenced by username provided in the config above. That means the table with the ID "john.doe" belongs to the user "john.doe" and needs to be provided under "/src/main/resources". Feel free to change as you seem fit like adding new rules etc.

| TOPIC | SENDER | PATH_TO_SAVE | REMINDER | NOTES |
|---------------|-----------------|-------------------------------------|-----------|--------------------------------------------|
| - | "UNKNOWN" | "/path/to/review/" | true | Unknown to "review" |
| - | "Insurance ldt" | "/path/to/%sender%/%policyNumber%/" | false | Insurance to the "sender/policyNumber" |
| "CREDITCARD" | - | "/path/to/finance/review/" | true | Credit card statements to folder "review" |
| "OTHER" | - | "/path/to/review/" | true | Unknown topics to folder "review" |
| - | - | "/path/to/%sender%/" | false | The rest will be sorted by sender |

The strings starting and ending with % (%sender%, %policyNumber%) will be replaced with the acutal value detected by the classificator.

About

No description or website provided.

Topics

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages