Add Activepieces integration for workflow automation
- Add Activepieces fork with SmoothSchedule custom piece - Create integrations app with Activepieces service layer - Add embed token endpoint for iframe integration - Create Automations page with embedded workflow builder - Add sidebar visibility fix for embed mode - Add list inactive customers endpoint to Public API - Include SmoothSchedule triggers: event created/updated/cancelled - Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Filtratge de correus:**\n\nAfegeix un element Enrutador per filtrar correus basats en l'assumpte, destinatari, remitent, CC o altres camps.\n",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Usuaris de Gmail:**\n<br><br>\nAssegureu-vos del següent:\n<br>\n* IMAP està activat a la configuració de Gmail (https://support.google.com/mail/answer/7126229?hl=ca)\n* Heu creat una contrasenya d'aplicació per iniciar sessió (https://support.google.com/accounts/answer/185833?hl=ca)\n* Activeu TLS i configureu el port a 993 i l'amfitrió a imap.gmail.com\n",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Eliminació Permanent:**\n\nAquesta acció elimina permanentment el correu. Aquesta acció no es pot desfer. Per moure un correu a la carpeta de Paperera, utilitzeu l'acció Moure Correu en el seu lloc.\n",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Marqueu per indicar com a llegit, desmarqueu per indicar com a no llegit.",
|
||||
"Copy an email to another mailbox": "Copiar un correu a una altra bústia",
|
||||
"Copy Email": "Copiar Correu",
|
||||
"Delete Email": "Eliminar Correu",
|
||||
"Destination folder for the email": "Carpeta de destinació per al correu",
|
||||
"Enable TLS certificate validation (recommended for production).": "Activar la validació de certificats TLS (recomanat per a producció).",
|
||||
"Folder to copy the email from.": "Carpeta des de la qual copiar el correu.",
|
||||
"Folder to copy the email to.": "Carpeta a la qual copiar el correu.",
|
||||
"Folder to delete the email from.": "Carpeta des de la qual eliminar el correu.",
|
||||
"Folder to move the email from.": "Carpeta des de la qual moure el correu.",
|
||||
"Host": "Host",
|
||||
"Mailbox": "Bústia",
|
||||
"Mark as Read": "Marcar com a llegit",
|
||||
"Mark Email as Read/Unread": "Marcar correu com a llegit/no llegit",
|
||||
"Markdown": "Markdown",
|
||||
"Message UID": "UID del missatge",
|
||||
"Move an email to another mailbox": "Moure un correu a una altra bústia",
|
||||
"Move Email": "Moure Correu",
|
||||
"New Email": "Nou correu electrònic",
|
||||
"Parent Folder": "Carpeta pare",
|
||||
"Password": "Contrasenya",
|
||||
"Permanently delete an email": "Eliminar permanentment un correu",
|
||||
"Please connect your account first": "Si us plau, connecteu primer el vostre compte",
|
||||
"Port": "Port",
|
||||
"Receive new email trigger": "Activador de nou correu electrònic",
|
||||
"Select the mailbox to search.": "Selecciona la bústia per cercar.",
|
||||
"Select the parent folder containing the email.": "Seleccioneu la carpeta pare que conté el correu electrònic.",
|
||||
"Sets the read status of an email": "Estableix l'estat de lectura d'un correu electrònic",
|
||||
"Source Folder": "Carpeta d'origen",
|
||||
"Target Folder": "Carpeta de destinació",
|
||||
"The UID of the email to copy": "L'UID del correu a copiar",
|
||||
"The UID of the email to delete": "L'UID del correu a eliminar",
|
||||
"The UID of the email to mark.": "L'UID del correu electrònic a marcar.",
|
||||
"The UID of the email to move": "L'UID del correu a moure",
|
||||
"Trigger when a new email is received": "S'activa quan es rep un nou correu electrònic",
|
||||
"Use TLS": "Usar TLS",
|
||||
"Username": "Nom d'usuari",
|
||||
"Validate TLS Certificates": "Validar certificats TLS"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Neuen E-Mail-Auslöser erhalten",
|
||||
"Host": "Host",
|
||||
"Username": "Benutzername",
|
||||
"Password": "Kennwort",
|
||||
"Port": "Port",
|
||||
"Use TLS": "TLS verwenden",
|
||||
"Validate TLS Certificates": "TLS Zertifikate validieren",
|
||||
"Enable TLS certificate validation (recommended for production).": "TLS-Zertifikatsüberprüfung aktivieren (empfohlen für die Produktion).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Benutzer:**\n<br><br>\nStellen Sie folgendes sicher:\n<br>\n* IMAP ist in Ihren Gmail-Einstellungen aktiviert (https://support. oogle. om/mail/answer/7126229?hl=de)\n* Du hast ein App-Passwort erstellt mit dem du dich einloggen kannst (https://support.google. om/accounts/answer/185833?hl=de)\n* Aktiviere TLS und setze den Port auf 993 und den Host auf imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "E-Mail als gelesen / ungelesen markieren",
|
||||
"Copy Email": "E-Mail kopieren",
|
||||
"Move Email": "E-Mail verschieben",
|
||||
"Delete Email": "E-Mail löschen",
|
||||
"Sets the read status of an email": "Legt den Lesestatus einer E-Mail fest",
|
||||
"Copy an email to another mailbox": "Eine E-Mail in ein anderes Postfach kopieren",
|
||||
"Move an email to another mailbox": "E-Mail in ein anderes Postfach verschieben",
|
||||
"Permanently delete an email": "E-Mail dauerhaft löschen",
|
||||
"Parent Folder": "Eltern-Ordner",
|
||||
"Message UID": "Nachrichten-UID",
|
||||
"Mark as Read": "Als gelesen markieren",
|
||||
"Source Folder": "Quellordner",
|
||||
"Target Folder": "Zielordner",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Wählen Sie den übergeordneten Ordner, der die E-Mail enthält.",
|
||||
"The UID of the email to mark.": "Die UID der zu markierenden E-Mail.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Markieren als gelesen markieren, deaktivieren als ungelesen markieren.",
|
||||
"Folder to copy the email from.": "Ordner aus dem die E-Mail kopiert werden soll.",
|
||||
"The UID of the email to copy.": "Die UID der zu kopierenden E-Mail.",
|
||||
"Folder to copy the email to.": "Ordner zum Kopieren der E-Mail.",
|
||||
"Folder to move the email from.": "Ordner um die E-Mail zu verschieben.",
|
||||
"The UID of the email to move.": "Die UID der zu verschiebenden E-Mail.",
|
||||
"Destination folder for the email.": "Zielordner für die E-Mail.",
|
||||
"Folder to delete the email from.": "Ordner aus dem die E-Mail gelöscht werden soll.",
|
||||
"The UID of the email to delete.": "Die UID der zu löschenden E-Mail.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanente Löschung:**\n\nDiese Aktion löscht die E-Mail unwiderruflich. Diese Aktion kann nicht rückgängig gemacht werden. Um eine E-Mail in den Papierkorb zu verschieben, verwenden Sie stattdessen die Funktion E-Mail verschieben.\n",
|
||||
"New Email": "Neue E-Mail",
|
||||
"Trigger when a new email is received": "Wird ausgelöst, wenn eine neue E-Mail empfangen wird",
|
||||
"Mailbox": "Postfach",
|
||||
"Select the mailbox to search.": "Wählen Sie das Postfach für die Suche.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**E-Mails filtern:**\n\nFügen Sie ein Router Piece hinzu, um E-Mails nach dem Thema zu filtern, voneinander, cc oder anderen Feldern.\n"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Recibir nuevo disparador de correo",
|
||||
"Host": "Anfitrión",
|
||||
"Username": "Usuario",
|
||||
"Password": "Contraseña",
|
||||
"Port": "Puerto",
|
||||
"Use TLS": "Usar TLS",
|
||||
"Validate TLS Certificates": "Validar certificados TLS",
|
||||
"Enable TLS certificate validation (recommended for production).": "Habilitar validación de certificados TLS (recomendado para la producción).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "Marcar email como leído/no leído",
|
||||
"Copy Email": "Copiar Email",
|
||||
"Move Email": "Mover Email",
|
||||
"Delete Email": "Eliminar Email",
|
||||
"Sets the read status of an email": "Establece el estado de lectura de un correo electrónico",
|
||||
"Copy an email to another mailbox": "Copiar un correo electrónico a otro buzón",
|
||||
"Move an email to another mailbox": "Mover un correo a otro buzón",
|
||||
"Permanently delete an email": "Borrar permanentemente un correo electrónico",
|
||||
"Parent Folder": "Carpeta padre",
|
||||
"Message UID": "UID del mensaje",
|
||||
"Mark as Read": "Marcar como leído",
|
||||
"Source Folder": "Carpeta de origen",
|
||||
"Target Folder": "Carpeta de destino",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Seleccione la carpeta padre que contiene el correo electrónico.",
|
||||
"The UID of the email to mark.": "El UID del correo electrónico a marcar.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Marca para marcar como leído, no marcar como no leído.",
|
||||
"Folder to copy the email from.": "Carpeta desde la que copiar el correo electrónico.",
|
||||
"The UID of the email to copy.": "El UID del correo electrónico a copiar.",
|
||||
"Folder to copy the email to.": "Carpeta a la que copiar el correo electrónico.",
|
||||
"Folder to move the email from.": "Carpeta desde la que mover el correo electrónico.",
|
||||
"The UID of the email to move.": "El UID del correo electrónico para mover.",
|
||||
"Destination folder for the email.": "Carpeta de destino para el correo electrónico.",
|
||||
"Folder to delete the email from.": "Carpeta de la que eliminar el correo electrónico.",
|
||||
"The UID of the email to delete.": "El UID del correo electrónico a eliminar.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n",
|
||||
"New Email": "Nuevo Email",
|
||||
"Trigger when a new email is received": "Activar cuando se recibe un nuevo correo electrónico",
|
||||
"Mailbox": "Buzón",
|
||||
"Select the mailbox to search.": "Seleccione el buzón para buscar.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Recevoir un nouvel e-mail de déclenchement",
|
||||
"Host": "Hôte",
|
||||
"Username": "Nom d'utilisateur",
|
||||
"Password": "Password",
|
||||
"Port": "Port",
|
||||
"Use TLS": "Utiliser TLS",
|
||||
"Validate TLS Certificates": "Valider les certificats TLS",
|
||||
"Enable TLS certificate validation (recommended for production).": "Activer la validation du certificat TLS (recommandé en production).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Utilisateurs Gmail :**\n<br><br>\nAssurez vous de ce qui suit :\n<br>\n* IMAP est activé dans vos paramètres Gmail (https://support. oignon. om/mail/answer/7126229?hl=fr)\n* Vous avez créé un mot de passe pour vous connecter avec (https://support.google. om/accounts/answer/185833?hl=fr)\n* Activez TLS et réglez le port sur 993 et l'hôte sur imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "Marquer l'e-mail comme lu/non lu",
|
||||
"Copy Email": "Copier l'e-mail",
|
||||
"Move Email": "Déplacer l'e-mail",
|
||||
"Delete Email": "Supprimer l'e-mail",
|
||||
"Sets the read status of an email": "Définit le statut de lecture d'un e-mail",
|
||||
"Copy an email to another mailbox": "Copier un e-mail dans une autre boîte aux lettres",
|
||||
"Move an email to another mailbox": "Déplacer un e-mail vers une autre boîte aux lettres",
|
||||
"Permanently delete an email": "Supprimer définitivement un e-mail",
|
||||
"Parent Folder": "Dossier parent",
|
||||
"Message UID": "UID du message",
|
||||
"Mark as Read": "Marquer comme lu",
|
||||
"Source Folder": "Dossier source",
|
||||
"Target Folder": "Dossier cible",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Sélectionnez le dossier parent contenant l'email.",
|
||||
"The UID of the email to mark.": "L'UID de l'e-mail à marquer.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Cocher pour marquer comme lu, décocher pour marquer comme non lu.",
|
||||
"Folder to copy the email from.": "Dossier à partir duquel copier l'email.",
|
||||
"The UID of the email to copy.": "L'UID de l'e-mail à copier.",
|
||||
"Folder to copy the email to.": "Dossier vers lequel copier l'email.",
|
||||
"Folder to move the email from.": "Dossier depuis lequel déplacer l'email.",
|
||||
"The UID of the email to move.": "L'UID de l'e-mail à déplacer.",
|
||||
"Destination folder for the email.": "Répertoire de destination pour l'email.",
|
||||
"Folder to delete the email from.": "Dossier à partir duquel supprimer l'email.",
|
||||
"The UID of the email to delete.": "L'UID de l'e-mail à supprimer.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Suppression permanente :**\n\nCette action supprime définitivement l'email. Cette action ne peut pas être annulée. Pour déplacer un e-mail dans le dossier Corbeille, utilisez l'action Déplacer Email à la place.\n",
|
||||
"New Email": "Nouvel e-mail",
|
||||
"Trigger when a new email is received": "Déclencher quand un nouvel e-mail est reçu",
|
||||
"Mailbox": "Boîte aux lettres",
|
||||
"Select the mailbox to search.": "Sélectionnez la boîte aux lettres à rechercher.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**ईमेल फिल्टरिंग:**\n\nविषय, प्राप्तकर्ता, भेजने वाला, CC या अन्य क्षेत्रों के आधार पर ईमेल फिल्टर करने के लिए एक राउटर घटक जोड़ें।\n",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail उपयोगकर्ता:**\n<br><br>\nनिम्नलिखित सुनिश्चित करें:\n<br>\n* आपकी Gmail सेटिंग्स में IMAP सक्षम है (https://support.google.com/mail/answer/7126229?hl=hi)\n* आपने लॉगिन के लिए एक ऐप पासवर्ड बनाया है (https://support.google.com/accounts/answer/185833?hl=hi)\n* TLS सक्षम करें और पोर्ट को 993 और होस्ट को imap.gmail.com पर सेट करें\n",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**स्थायी विलोपन:**\n\nयह क्रिया ईमेल को स्थायी रूप से हटा देती है। इस क्रिया को पूर्ववत नहीं किया जा सकता। ईमेल को ट्रैश फोल्डर में ले जाने के लिए, इसके बजाय ईमेल स्थानांतरित करें क्रिया का उपयोग करें।\n",
|
||||
"Check to mark as read, uncheck to mark as unread.": "पढ़ा हुआ चिह्नित करने के लिए चेक करें, नहीं पढ़ा गया चिह्नित करने के लिए अनचेक करें।",
|
||||
"Copy an email to another mailbox": "ईमेल को दूसरे मेलबॉक्स में कॉपी करें",
|
||||
"Copy Email": "ईमेल कॉपी करें",
|
||||
"Delete Email": "ईमेल हटाएं",
|
||||
"Destination folder for the email": "ईमेल के लिए गंतव्य फ़ोल्डर",
|
||||
"Enable TLS certificate validation (recommended for production).": "TLS प्रमाणपत्र सत्यापन सक्रिय करें (प्रोडक्शन के लिए सुझाए गए)।",
|
||||
"Folder to copy the email from.": "ईमेल कॉपी करने के लिए फ़ोल्डर।",
|
||||
"Folder to copy the email to.": "ईमेल कॉपी करने के लिए गंतव्य फ़ोल्डर।",
|
||||
"Folder to delete the email from.": "ईमेल हटाने के लिए फ़ोल्डर।",
|
||||
"Folder to move the email from.": "ईमेल को स्थानांतरित करने के लिए स्रोत फ़ोल्डर।",
|
||||
"Host": "होस्ट",
|
||||
"Mailbox": "मेलबॉक्स",
|
||||
"Mark as Read": "पढ़ा हुआ के रूप में चिह्नित करें",
|
||||
"Mark Email as Read/Unread": "ईमेल को पढ़ा हुआ/नहीं पढ़ा गया के रूप में चिह्नित करें",
|
||||
"Markdown": "Markdown",
|
||||
"Message UID": "संदेश UID",
|
||||
"Move an email to another mailbox": "ईमेल को दूसरे मेलबॉक्स में स्थानांतरित करें",
|
||||
"Move Email": "ईमेल स्थानांतरित करें",
|
||||
"New Email": "नया ईमेल",
|
||||
"Parent Folder": "पैरेंट फ़ोल्डर",
|
||||
"Password": "पासवर्ड",
|
||||
"Permanently delete an email": "ईमेल को स्थायी रूप से हटाएं",
|
||||
"Please connect your account first": "कृपया पहले अपना खाता कनेक्ट करें",
|
||||
"Port": "पोर्ट",
|
||||
"Receive new email trigger": "नया ईमेल ट्रिगर",
|
||||
"Select the mailbox to search.": "खोजने के लिए मेलबॉक्स चुनें",
|
||||
"Select the parent folder containing the email.": "ईमेल युक्त पैरेंट फ़ोल्डर चुनें।",
|
||||
"Sets the read status of an email": "ईमेल की पढ़ी गई स्थिति सेट करता है",
|
||||
"Source Folder": "स्रोत फ़ोल्डर",
|
||||
"Target Folder": "लक्ष्य फ़ोल्डर",
|
||||
"The UID of the email to copy": "कॉपी करने के लिए ईमेल का UID",
|
||||
"The UID of the email to delete": "हटाने के लिए ईमेल का UID",
|
||||
"The UID of the email to mark.": "चिह्नित करने के लिए ईमेल का UID।",
|
||||
"The UID of the email to move": "स्थानांतरित करने के लिए ईमेल का UID",
|
||||
"Trigger when a new email is received": "नया ईमेल प्राप्त होने पर ट्रिगर।",
|
||||
"Use TLS": "TLS का उपयोग करें",
|
||||
"Username": "उपयोगकर्ता नाम",
|
||||
"Validate TLS Certificates": "TLS प्रमाणपत्र का सत्यापन"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Penyaringan email:**\n\nTambahkan komponen Router untuk menyaring email berdasarkan subjek, penerima, pengirim, CC atau bidang lainnya.\n",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Pengguna Gmail:**\n<br><br>\nPastikan hal-hal berikut:\n<br>\n* IMAP telah diaktifkan di pengaturan Gmail Anda (https://support.google.com/mail/answer/7126229?hl=id)\n* Anda telah membuat Kata Sandi Aplikasi untuk login (https://support.google.com/accounts/answer/185833?hl=id)\n* Aktifkan TLS dan atur port ke 993 dan host ke imap.gmail.com\n",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Penghapusan Permanen:**\n\nTindakan ini menghapus email secara permanen. Tindakan ini tidak dapat dibatalkan. Untuk memindahkan email ke folder Sampah, gunakan tindakan Pindahkan Email sebagai gantinya.\n",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Centang untuk menandai sebagai terbaca, hapus centang untuk menandai sebagai belum dibaca.",
|
||||
"Copy an email to another mailbox": "Salin email ke kotak surat lain",
|
||||
"Copy Email": "Salin Email",
|
||||
"Delete Email": "Hapus Email",
|
||||
"Destination folder for the email": "Folder tujuan untuk email",
|
||||
"Enable TLS certificate validation (recommended for production).": "Aktifkan validasi sertifikat TLS (disarankan untuk produksi).",
|
||||
"Folder to copy the email from.": "Folder untuk menyalin email.",
|
||||
"Folder to copy the email to.": "Folder tujuan untuk menyalin email.",
|
||||
"Folder to delete the email from.": "Folder untuk menghapus email.",
|
||||
"Folder to move the email from.": "Folder untuk memindahkan email.",
|
||||
"Host": "Host",
|
||||
"Mailbox": "Kotak Surat",
|
||||
"Mark as Read": "Tandai sebagai Terbaca",
|
||||
"Mark Email as Read/Unread": "Tandai Email sebagai Terbaca/Belum Dibaca",
|
||||
"Markdown": "Markdown",
|
||||
"Message UID": "UID Pesan",
|
||||
"Move an email to another mailbox": "Pindahkan email ke kotak surat lain",
|
||||
"Move Email": "Pindahkan Email",
|
||||
"New Email": "Email Baru",
|
||||
"Parent Folder": "Folder Induk",
|
||||
"Password": "Kata Sandi",
|
||||
"Permanently delete an email": "Hapus email secara permanen",
|
||||
"Please connect your account first": "Harap hubungkan akun Anda terlebih dahulu",
|
||||
"Port": "Port",
|
||||
"Receive new email trigger": "Pemicu email baru",
|
||||
"Select the mailbox to search.": "Pilih kotak surat untuk dicari.",
|
||||
"Select the parent folder containing the email.": "Pilih folder induk yang berisi email.",
|
||||
"Sets the read status of an email": "Mengatur status baca email",
|
||||
"Source Folder": "Folder Sumber",
|
||||
"Target Folder": "Folder Target",
|
||||
"The UID of the email to copy": "UID email yang akan disalin",
|
||||
"The UID of the email to delete": "UID email yang akan dihapus",
|
||||
"The UID of the email to mark.": "UID email yang akan ditandai.",
|
||||
"The UID of the email to move": "UID email yang akan dipindahkan",
|
||||
"Trigger when a new email is received": "Dipicu ketika email baru diterima",
|
||||
"Use TLS": "Gunakan TLS",
|
||||
"Username": "Nama Pengguna",
|
||||
"Validate TLS Certificates": "Validasi sertifikat TLS"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "新しいメールトリガーを受信する",
|
||||
"Host": "ホスト",
|
||||
"Username": "ユーザー名",
|
||||
"Password": "Password",
|
||||
"Port": "ポート",
|
||||
"Use TLS": "TLS を使用",
|
||||
"Validate TLS Certificates": "TLS 証明書を検証する",
|
||||
"Enable TLS certificate validation (recommended for production).": "TLS 証明書の検証を有効にする (本番環境で推奨)。",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "電子メールを既読/未読としてマーク",
|
||||
"Copy Email": "メールをコピー",
|
||||
"Move Email": "メールを移動",
|
||||
"Delete Email": "メールを削除",
|
||||
"Sets the read status of an email": "メールの既読ステータスを設定します。",
|
||||
"Copy an email to another mailbox": "別のメールボックスにメールをコピー",
|
||||
"Move an email to another mailbox": "メールを別のメールボックスに移動する",
|
||||
"Permanently delete an email": "メールを完全に削除する",
|
||||
"Parent Folder": "親フォルダ",
|
||||
"Message UID": "メッセージUID",
|
||||
"Mark as Read": "既読にする",
|
||||
"Source Folder": "ソースフォルダ",
|
||||
"Target Folder": "ターゲットフォルダ",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "メールを含む親フォルダを選択します。",
|
||||
"The UID of the email to mark.": "マークするメールのUID。",
|
||||
"Check to mark as read, uncheck to mark as unread.": "既読にする場合はチェックし、未読にする場合はチェックを外します。",
|
||||
"Folder to copy the email from.": "メールをコピーするフォルダ。",
|
||||
"The UID of the email to copy.": "コピーするメールのUID。",
|
||||
"Folder to copy the email to.": "メールをコピーするフォルダ。",
|
||||
"Folder to move the email from.": "メールを移動するフォルダ。",
|
||||
"The UID of the email to move.": "移動するメールのUID。",
|
||||
"Destination folder for the email.": "メールの宛先フォルダ。",
|
||||
"Folder to delete the email from.": "メールを削除するフォルダ。",
|
||||
"The UID of the email to delete.": "削除するメールのUID。",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n",
|
||||
"New Email": "新しいメール",
|
||||
"Trigger when a new email is received": "新しいメールを受信したときにトリガーする",
|
||||
"Mailbox": "受信箱",
|
||||
"Select the mailbox to search.": "検索するメールボックスを選択してください.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**メールフィルタリング:**\n\n件名、to、cc、その他の項目に基づいてメールをフィルタリングするルーターピースを追加します。\n"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Ontvang nieuwe e-mail trigger",
|
||||
"Host": "Hostnaam",
|
||||
"Username": "Gebruikersnaam",
|
||||
"Password": "Wachtwoord",
|
||||
"Port": "Poort",
|
||||
"Use TLS": "TLS gebruiken",
|
||||
"Validate TLS Certificates": "TLS-certificaten valideren",
|
||||
"Enable TLS certificate validation (recommended for production).": "Activeer TLS-certificaat validatie (aanbevolen voor productie).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Users:**\n<br><br>\nMaak de volgende weg:\n<br>\n* IMAP is ingeschakeld in je Gmail instellingen (https://support. oog. om/mail/answer/7126229?hl=en)\n* Je hebt een app-wachtwoord aangemaakt om in te loggen met (https://support.google. Toon/accounts/antwoord/185833?hl=en)\n* Zet TLS aan en zet de poort op 993 en de host op imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "E-mail markeren als gelezen/ongelezen",
|
||||
"Copy Email": "E-mail kopiëren",
|
||||
"Move Email": "Verplaats E-Mail",
|
||||
"Delete Email": "Verwijder E-Mail",
|
||||
"Sets the read status of an email": "Stelt de leesstatus van een e-mail in",
|
||||
"Copy an email to another mailbox": "Kopieer een e-mail naar een andere mailbox",
|
||||
"Move an email to another mailbox": "Verplaats een e-mail naar een andere mailbox",
|
||||
"Permanently delete an email": "E-mail permanent verwijderen",
|
||||
"Parent Folder": "Bovenliggende map",
|
||||
"Message UID": "Bericht UID",
|
||||
"Mark as Read": "Markeren als gelezen",
|
||||
"Source Folder": "Bron map",
|
||||
"Target Folder": "Doel map",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Selecteer de bovenliggende map die de e-mail bevat.",
|
||||
"The UID of the email to mark.": "De UID van de te beoordelen e-mailadres.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Vink aan om te markeren als gelezen, uitschakelen om als ongelezen te markeren.",
|
||||
"Folder to copy the email from.": "Map om de e-mail van te kopiëren.",
|
||||
"The UID of the email to copy.": "De UID van de e-mail te kopiëren.",
|
||||
"Folder to copy the email to.": "Map om de e-mail naar te kopiëren.",
|
||||
"Folder to move the email from.": "Map om e-mail van te verplaatsen.",
|
||||
"The UID of the email to move.": "De UID van de te verplaatsen e-mailadres.",
|
||||
"Destination folder for the email.": "Bestemmingsmap voor de e-mail.",
|
||||
"Folder to delete the email from.": "Map om e-mail van te verwijderen.",
|
||||
"The UID of the email to delete.": "De UID van de e-mail om te verwijderen.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent verwijderen:**\n\nDeze actie verwijdert de e-mail permanent. Deze actie kan niet ongedaan worden gemaakt. Om een e-mail naar de prullenbak te verplaatsen, gebruik in plaats daarvan de 'E-mail verplaatsen'.\n",
|
||||
"New Email": "Nieuw e-mailadres",
|
||||
"Trigger when a new email is received": "Trigger wanneer een nieuwe e-mail is ontvangen",
|
||||
"Mailbox": "Brievenbus",
|
||||
"Select the mailbox to search.": "Selecteer het postvak in om te zoeken.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Emails filtering:**\n\nVoeg een Router Piece toe om e-mails te filteren op basis van het onderwerp, van, cc of andere velden.\n"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Receber novo gatilho de e-mail",
|
||||
"Host": "Servidor",
|
||||
"Username": "Usuário:",
|
||||
"Password": "Senha",
|
||||
"Port": "Porta",
|
||||
"Use TLS": "Usar TLS",
|
||||
"Validate TLS Certificates": "Validar certificados TLS",
|
||||
"Enable TLS certificate validation (recommended for production).": "Habilitar validação do certificado TLS (recomendado para produção).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Usuários do Gmail:**\n<br><br>\nTer a certeza do seguinte:\n<br>\n* IMAP está ativado nas suas configurações do Gmail (https://support. oóleo. Um/mail/answer/7126229?hl=en)\n* Você criou uma senha para fazer login no aplicativo (https://support.google. Um/contas/answer/185833?hl=en)\n* Habilitar TLS e definir a porta para 993 e o host para imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "Marcar E-mail como lido/não lido",
|
||||
"Copy Email": "Copiar e-mail",
|
||||
"Move Email": "Mover De E-Mail",
|
||||
"Delete Email": "Excluir Email",
|
||||
"Sets the read status of an email": "Define o status de leitura de um e-mail",
|
||||
"Copy an email to another mailbox": "Copiar um e-mail para outra caixa de correio",
|
||||
"Move an email to another mailbox": "Mover um e-mail para outra caixa de correio",
|
||||
"Permanently delete an email": "Excluir permanentemente um e-mail",
|
||||
"Parent Folder": "Pasta pai",
|
||||
"Message UID": "UID da mensagem",
|
||||
"Mark as Read": "Marcar Como Lida",
|
||||
"Source Folder": "Pasta de origem",
|
||||
"Target Folder": "Pasta de destino",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Selecione a pasta pai que contém o e-mail.",
|
||||
"The UID of the email to mark.": "A UID do email a ser avaliada.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Marcar como lida, desmarque para marcar como não lida.",
|
||||
"Folder to copy the email from.": "Pasta para copiar o e-mail de.",
|
||||
"The UID of the email to copy.": "O UID do e-mail a ser copiado.",
|
||||
"Folder to copy the email to.": "Pasta para copiar o e-mail para.",
|
||||
"Folder to move the email from.": "Pasta para mover o e-mail.",
|
||||
"The UID of the email to move.": "O UID do e-mail a ser movido.",
|
||||
"Destination folder for the email.": "Pasta de destino para o e-mail.",
|
||||
"Folder to delete the email from.": "Pasta para excluir o e-mail.",
|
||||
"The UID of the email to delete.": "A UID do e-mail a ser excluída.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n",
|
||||
"New Email": "Novo E-mail",
|
||||
"Trigger when a new email is received": "Aciona quando um novo email é recebido",
|
||||
"Mailbox": "Caixa postal",
|
||||
"Select the mailbox to search.": "Selecione a caixa de correio para pesquisa.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Filtros de e-mail:**\n\nAdicione um Pedaço de roteador para filtrar e-mails com base no assunto, a, cc ou outros campos.\n"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Фильтрация писем:**\n\nДобавьте элемент Маршрутизатор для фильтрации писем по теме, получателю, отправителю, копии или другим полям.\n",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Пользователи Gmail:**\n<br><br>\nУбедитесь в следующем:\n<br>\n* IMAP включен в настройках Gmail (https://support.google.com/mail/answer/7126229?hl=ru)\n* Вы создали пароль приложения для входа в систему (https://support.google.com/accounts/answer/185833?hl=ru)\n* Включите TLS и установите порт 993 и хост imap.gmail.com\n",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Безвозвратное Удаление:**\n\nЭто действие навсегда удаляет письмо. Это действие нельзя отменить. Чтобы переместить письмо в папку Корзина, используйте вместо этого действие Переместить письмо.\n",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Установите флажок, чтобы отметить как прочитанное, снимите флажок, чтобы отметить как непрочитанное.",
|
||||
"Copy an email to another mailbox": "Копировать письмо в другой почтовый ящик",
|
||||
"Copy Email": "Копировать письмо",
|
||||
"Delete Email": "Удалить письмо",
|
||||
"Destination folder for the email": "Папка назначения для письма",
|
||||
"Enable TLS certificate validation (recommended for production).": "Включить проверку TLS-сертификатов (рекомендуется для продакшн).",
|
||||
"Folder to copy the email from.": "Папка для копирования письма.",
|
||||
"Folder to copy the email to.": "Папка для копирования письма в.",
|
||||
"Folder to delete the email from.": "Папка для удаления письма.",
|
||||
"Folder to move the email from.": "Папка для перемещения письма.",
|
||||
"Host": "Хост",
|
||||
"Mailbox": "Почтовый ящик",
|
||||
"Mark as Read": "Отметить как прочитанное",
|
||||
"Mark Email as Read/Unread": "Отметить письмо как прочитанное/непрочитанное",
|
||||
"Markdown": "Markdown",
|
||||
"Message UID": "UID сообщения",
|
||||
"Move an email to another mailbox": "Переместить письмо в другой почтовый ящик",
|
||||
"Move Email": "Переместить письмо",
|
||||
"New Email": "Новое письмо",
|
||||
"Parent Folder": "Родительская папка",
|
||||
"Password": "Пароль",
|
||||
"Permanently delete an email": "Удалить письмо навсегда",
|
||||
"Please connect your account first": "Пожалуйста, сначала подключите свой аккаунт",
|
||||
"Port": "Порт",
|
||||
"Receive new email trigger": "Триггер нового письма",
|
||||
"Select the mailbox to search.": "Выберите почтовый ящик для поиска.",
|
||||
"Select the parent folder containing the email.": "Выберите родительскую папку, содержащую письмо.",
|
||||
"Sets the read status of an email": "Устанавливает статус прочитанного для письма",
|
||||
"Source Folder": "Исходная папка",
|
||||
"Target Folder": "Целевая папка",
|
||||
"The UID of the email to copy": "UID письма для копирования",
|
||||
"The UID of the email to delete": "UID письма для удаления",
|
||||
"The UID of the email to mark.": "UID письма для отметки.",
|
||||
"The UID of the email to move": "UID письма для перемещения",
|
||||
"Trigger when a new email is received": "Срабатывать при получении нового письма",
|
||||
"Use TLS": "Использовать TLS",
|
||||
"Username": "Имя пользователя",
|
||||
"Validate TLS Certificates": "Проверить TLS-сертификаты"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Receive new email trigger",
|
||||
"Host": "Host",
|
||||
"Username": "Username",
|
||||
"Password": "Password",
|
||||
"Port": "Port",
|
||||
"Use TLS": "Use TLS",
|
||||
"Validate TLS Certificates": "Validate TLS Certificates",
|
||||
"Enable TLS certificate validation (recommended for production).": "Enable TLS certificate validation (recommended for production).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "Mark Email as Read/Unread",
|
||||
"Copy Email": "Copy Email",
|
||||
"Move Email": "Move Email",
|
||||
"Delete Email": "Delete Email",
|
||||
"Sets the read status of an email": "Sets the read status of an email",
|
||||
"Copy an email to another mailbox": "Copy an email to another mailbox",
|
||||
"Move an email to another mailbox": "Move an email to another mailbox",
|
||||
"Permanently delete an email": "Permanently delete an email",
|
||||
"Parent Folder": "Parent Folder",
|
||||
"Message UID": "Message UID",
|
||||
"Mark as Read": "Mark as Read",
|
||||
"Source Folder": "Source Folder",
|
||||
"Target Folder": "Target Folder",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Select the parent folder containing the email.",
|
||||
"The UID of the email to mark.": "The UID of the email to mark.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Check to mark as read, uncheck to mark as unread.",
|
||||
"Folder to copy the email from.": "Folder to copy the email from.",
|
||||
"The UID of the email to copy.": "The UID of the email to copy.",
|
||||
"Folder to copy the email to.": "Folder to copy the email to.",
|
||||
"Folder to move the email from.": "Folder to move the email from.",
|
||||
"The UID of the email to move.": "The UID of the email to move.",
|
||||
"Destination folder for the email.": "Destination folder for the email.",
|
||||
"Folder to delete the email from.": "Folder to delete the email from.",
|
||||
"The UID of the email to delete.": "The UID of the email to delete.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n",
|
||||
"New Email": "New Email",
|
||||
"Trigger when a new email is received": "Trigger when a new email is received",
|
||||
"Mailbox": "Mailbox",
|
||||
"Select the mailbox to search.": "Select the mailbox to search.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n"
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Lọc email:**\n\nThêm một thành phần Router để lọc email dựa trên chủ đề, người nhận, người gửi, CC hoặc các trường khác.\n",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Người dùng Gmail:**\n<br><br>\nHãy đảm bảo các điều sau:\n<br>\n* IMAP đã được bật trong cài đặt Gmail của bạn (https://support.google.com/mail/answer/7126229?hl=vi)\n* Bạn đã tạo một Mật khẩu ứng dụng để đăng nhập (https://support.google.com/accounts/answer/185833?hl=vi)\n* Kích hoạt TLS và đặt cổng thành 993 và máy chủ thành imap.gmail.com\n",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Xóa Vĩnh Viễn:**\n\nHành động này xóa vĩnh viễn email. Hành động này không thể hoàn tác. Để di chuyển email vào thư mục Thùng rác, hãy sử dụng hành động Di chuyển Email thay thế.\n",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Đánh dấu để đánh dấu là đã đọc, bỏ đánh dấu để đánh dấu là chưa đọc.",
|
||||
"Copy an email to another mailbox": "Sao chép email sang hộp thư khác",
|
||||
"Copy Email": "Sao chép Email",
|
||||
"Delete Email": "Xóa Email",
|
||||
"Destination folder for the email": "Thư mục đích cho email",
|
||||
"Enable TLS certificate validation (recommended for production).": "Kích hoạt xác thực chứng chỉ TLS (được khuyến nghị cho sản xuất).",
|
||||
"Folder to copy the email from.": "Thư mục để sao chép email từ đó.",
|
||||
"Folder to copy the email to.": "Thư mục để sao chép email đến.",
|
||||
"Folder to delete the email from.": "Thư mục để xóa email từ đó.",
|
||||
"Folder to move the email from.": "Thư mục để di chuyển email từ đó.",
|
||||
"Host": "Máy chủ",
|
||||
"Mailbox": "Hộp thư",
|
||||
"Mark as Read": "Đánh dấu là Đã đọc",
|
||||
"Mark Email as Read/Unread": "Đánh dấu Email là Đã đọc/Chưa đọc",
|
||||
"Markdown": "Markdown",
|
||||
"Message UID": "UID Tin nhắn",
|
||||
"Move an email to another mailbox": "Di chuyển email sang hộp thư khác",
|
||||
"Move Email": "Di chuyển Email",
|
||||
"New Email": "Email Mới",
|
||||
"Parent Folder": "Thư mục Cha",
|
||||
"Password": "Mật khẩu",
|
||||
"Permanently delete an email": "Xóa vĩnh viễn một email",
|
||||
"Please connect your account first": "Vui lòng kết nối tài khoản của bạn trước",
|
||||
"Port": "Cổng",
|
||||
"Receive new email trigger": "Kích hoạt email mới",
|
||||
"Select the mailbox to search.": "Chọn hộp thư để tìm kiếm.",
|
||||
"Select the parent folder containing the email.": "Chọn thư mục cha chứa email.",
|
||||
"Sets the read status of an email": "Đặt trạng thái đã đọc của email",
|
||||
"Source Folder": "Thư mục Nguồn",
|
||||
"Target Folder": "Thư mục Đích",
|
||||
"The UID of the email to copy": "UID của email cần sao chép",
|
||||
"The UID of the email to delete": "UID của email cần xóa",
|
||||
"The UID of the email to mark.": "UID của email cần đánh dấu.",
|
||||
"The UID of the email to move": "UID của email cần di chuyển",
|
||||
"Trigger when a new email is received": "Kích hoạt khi nhận được email mới",
|
||||
"Use TLS": "Sử dụng TLS",
|
||||
"Username": "Tên người dùng",
|
||||
"Validate TLS Certificates": "Xác thực chứng chỉ TLS"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"Receive new email trigger": "Receive new email trigger",
|
||||
"Host": "主机",
|
||||
"Username": "用户名",
|
||||
"Password": "Password",
|
||||
"Port": "端口",
|
||||
"Use TLS": "Use TLS",
|
||||
"Validate TLS Certificates": "Validate TLS Certificates",
|
||||
"Enable TLS certificate validation (recommended for production).": "Enable TLS certificate validation (recommended for production).",
|
||||
"\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n": "\n**Gmail Users:**\n<br><br>\nMake Sure of the following:\n<br>\n* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)\n* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)\n* Enable TLS and set the port to 993 and the host to imap.gmail.com\n",
|
||||
"Mark Email as Read/Unread": "Mark Email as Read/Unread",
|
||||
"Copy Email": "Copy Email",
|
||||
"Move Email": "Move Email",
|
||||
"Delete Email": "Delete Email",
|
||||
"Sets the read status of an email": "Sets the read status of an email",
|
||||
"Copy an email to another mailbox": "Copy an email to another mailbox",
|
||||
"Move an email to another mailbox": "Move an email to another mailbox",
|
||||
"Permanently delete an email": "Permanently delete an email",
|
||||
"Parent Folder": "父文件夹",
|
||||
"Message UID": "Message UID",
|
||||
"Mark as Read": "Mark as Read",
|
||||
"Source Folder": "Source Folder",
|
||||
"Target Folder": "Target Folder",
|
||||
"Markdown": "Markdown",
|
||||
"Select the parent folder containing the email.": "Select the parent folder containing the email.",
|
||||
"The UID of the email to mark.": "The UID of the email to mark.",
|
||||
"Check to mark as read, uncheck to mark as unread.": "Check to mark as read, uncheck to mark as unread.",
|
||||
"Folder to copy the email from.": "Folder to copy the email from.",
|
||||
"The UID of the email to copy.": "The UID of the email to copy.",
|
||||
"Folder to copy the email to.": "Folder to copy the email to.",
|
||||
"Folder to move the email from.": "Folder to move the email from.",
|
||||
"The UID of the email to move.": "The UID of the email to move.",
|
||||
"Destination folder for the email.": "Destination folder for the email.",
|
||||
"Folder to delete the email from.": "Folder to delete the email from.",
|
||||
"The UID of the email to delete.": "The UID of the email to delete.",
|
||||
"\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n": "\n**Permanent Deletion:**\n\nThis action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.\n",
|
||||
"New Email": "New Email",
|
||||
"Trigger when a new email is received": "Trigger when a new email is received",
|
||||
"Mailbox": "Mailbox",
|
||||
"Select the mailbox to search.": "Select the mailbox to search.",
|
||||
"\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n": "\n**Emails Filtering:**\n\nAdd a Router Piece to filter emails based on the subject, to, from, cc or other fields.\n"
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import { createPiece } from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { newEmail } from './lib/triggers/new-email';
|
||||
import { imapAuth } from './lib/common';
|
||||
import { markEmailAsRead } from './lib/actions/mark-email-read';
|
||||
import { copyEmail } from './lib/actions/copy-email';
|
||||
import { deleteEmail } from './lib/actions/delete-email';
|
||||
import { moveEmail } from './lib/actions/move-email';
|
||||
|
||||
export const imapPiece = createPiece({
|
||||
displayName: 'IMAP',
|
||||
description: 'Receive new email trigger',
|
||||
minimumSupportedRelease: '0.30.0',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/imap.png',
|
||||
categories: [PieceCategory.BUSINESS_INTELLIGENCE],
|
||||
authors: ['kishanprmr', 'MoShizzle', 'khaledmashaly', 'abuaboud', 'simonc'],
|
||||
auth: imapAuth,
|
||||
actions: [
|
||||
markEmailAsRead,
|
||||
copyEmail,
|
||||
moveEmail,
|
||||
deleteEmail,
|
||||
],
|
||||
triggers: [newEmail],
|
||||
});
|
||||
@@ -0,0 +1,36 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
imapAuth,
|
||||
mailboxDropdown,
|
||||
copyEmail as copyImapEmail,
|
||||
} from '../common';
|
||||
|
||||
const props = {
|
||||
sourceMailbox: mailboxDropdown({
|
||||
displayName: 'Source Folder',
|
||||
description: 'Folder to copy the email from.',
|
||||
required: true,
|
||||
}),
|
||||
uid: Property.Number({
|
||||
displayName: 'Message UID',
|
||||
description: 'The UID of the email to copy.',
|
||||
required: true,
|
||||
}),
|
||||
targetMailbox: mailboxDropdown({
|
||||
displayName: 'Target Folder',
|
||||
description: 'Folder to copy the email to.',
|
||||
required: true,
|
||||
}),
|
||||
};
|
||||
|
||||
export const copyEmail = createAction({
|
||||
auth: imapAuth,
|
||||
name: 'copy_email',
|
||||
displayName: 'Copy Email',
|
||||
description: 'Copy an email to another mailbox',
|
||||
props,
|
||||
async run({ auth, propsValue }) {
|
||||
const { uid, sourceMailbox, targetMailbox } = propsValue;
|
||||
return await copyImapEmail({ auth, uid, sourceMailbox: sourceMailbox!, targetMailbox: targetMailbox! });
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,36 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { imapAuth, deleteEmail as deleteImapEmail, mailboxDropdown } from '../common';
|
||||
|
||||
const permanentDeletionNotice = `
|
||||
**Permanent Deletion:**
|
||||
|
||||
This action permanently deletes the email. This action cannot be undone. To move an email to the Trash folder, use the Move Email action instead.
|
||||
`;
|
||||
|
||||
const props = {
|
||||
mailbox: mailboxDropdown({
|
||||
displayName: 'Parent Folder',
|
||||
description: 'Folder to delete the email from.',
|
||||
required: true,
|
||||
}),
|
||||
uid: Property.Number({
|
||||
displayName: 'Message UID',
|
||||
description: 'The UID of the email to delete.',
|
||||
required: true,
|
||||
}),
|
||||
permanentDeletionNotice: Property.MarkDown({
|
||||
value: permanentDeletionNotice,
|
||||
}),
|
||||
};
|
||||
|
||||
export const deleteEmail = createAction({
|
||||
auth: imapAuth,
|
||||
name: 'delete_email',
|
||||
displayName: 'Delete Email',
|
||||
description: 'Permanently delete an email',
|
||||
props,
|
||||
async run({ auth, propsValue }) {
|
||||
const { uid, mailbox } = propsValue;
|
||||
return await deleteImapEmail({ auth, uid, mailbox: mailbox! });
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,38 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { imapAuth, setEmailReadStatus, mailboxDropdown } from '../common';
|
||||
|
||||
const props = {
|
||||
mailbox: mailboxDropdown({
|
||||
displayName: 'Parent Folder',
|
||||
description: 'Select the parent folder containing the email.',
|
||||
required: true,
|
||||
}),
|
||||
uid: Property.Number({
|
||||
displayName: 'Message UID',
|
||||
description: 'The UID of the email to mark.',
|
||||
required: true,
|
||||
}),
|
||||
markAsRead: Property.Checkbox({
|
||||
displayName: 'Mark as Read',
|
||||
description: 'Check to mark as read, uncheck to mark as unread.',
|
||||
defaultValue: true,
|
||||
required: false,
|
||||
}),
|
||||
};
|
||||
|
||||
export const markEmailAsRead = createAction({
|
||||
auth: imapAuth,
|
||||
name: 'mark_email_read',
|
||||
displayName: 'Mark Email as Read/Unread',
|
||||
description: 'Sets the read status of an email',
|
||||
props,
|
||||
async run({ auth, propsValue }) {
|
||||
const { uid, markAsRead, mailbox } = propsValue;
|
||||
return await setEmailReadStatus({
|
||||
auth,
|
||||
uid,
|
||||
mailbox: mailbox!,
|
||||
markAsRead: !!markAsRead,
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,32 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { imapAuth, mailboxDropdown, moveEmail as moveImapEmail } from '../common';
|
||||
|
||||
const props = {
|
||||
sourceMailbox: mailboxDropdown({
|
||||
displayName: 'Source Folder',
|
||||
description: 'Folder to move the email from.',
|
||||
required: true,
|
||||
}),
|
||||
uid: Property.Number({
|
||||
displayName: 'Message UID',
|
||||
description: 'The UID of the email to move.',
|
||||
required: true,
|
||||
}),
|
||||
targetMailbox: mailboxDropdown({
|
||||
displayName: 'Target Folder',
|
||||
description: 'Destination folder for the email.',
|
||||
required: true,
|
||||
}),
|
||||
};
|
||||
|
||||
export const moveEmail = createAction({
|
||||
auth: imapAuth,
|
||||
name: 'move_email',
|
||||
displayName: 'Move Email',
|
||||
description: 'Move an email to another mailbox',
|
||||
props,
|
||||
async run({ auth, propsValue }) {
|
||||
const { uid, sourceMailbox, targetMailbox } = propsValue;
|
||||
return await moveImapEmail({ auth, uid, sourceMailbox: sourceMailbox!, targetMailbox: targetMailbox! });
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,71 @@
|
||||
import {
|
||||
PieceAuth,
|
||||
Property,
|
||||
PiecePropValueSchema,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { performImapOperation } from './imap';
|
||||
import { AppConnectionType } from '@activepieces/shared';
|
||||
|
||||
const description = `
|
||||
**Gmail Users:**
|
||||
<br><br>
|
||||
Make Sure of the following:
|
||||
<br>
|
||||
* IMAP is enabled in your Gmail settings (https://support.google.com/mail/answer/7126229?hl=en)
|
||||
* You have created an App Password to login with (https://support.google.com/accounts/answer/185833?hl=en)
|
||||
* Enable TLS and set the port to 993 and the host to imap.gmail.com
|
||||
`;
|
||||
|
||||
export const imapAuth = PieceAuth.CustomAuth({
|
||||
description: description,
|
||||
props: {
|
||||
host: Property.ShortText({
|
||||
displayName: 'Host',
|
||||
required: true,
|
||||
}),
|
||||
username: Property.ShortText({
|
||||
displayName: 'Username',
|
||||
required: true,
|
||||
}),
|
||||
password: PieceAuth.SecretText({
|
||||
displayName: 'Password',
|
||||
required: true,
|
||||
}),
|
||||
port: Property.Number({
|
||||
displayName: 'Port',
|
||||
required: true,
|
||||
defaultValue: 143,
|
||||
}),
|
||||
tls: Property.Checkbox({
|
||||
displayName: 'Use TLS',
|
||||
defaultValue: false,
|
||||
required: true,
|
||||
}),
|
||||
validateCertificates: Property.Checkbox({
|
||||
displayName: 'Validate TLS Certificates',
|
||||
description:
|
||||
'Enable TLS certificate validation (recommended for production).',
|
||||
defaultValue: false,
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async validate({
|
||||
auth,
|
||||
}): Promise<{ valid: true } | { valid: false; error: string }> {
|
||||
try {
|
||||
return (await performImapOperation({ type: AppConnectionType.CUSTOM_AUTH, props: auth }, async (imapClient) => {
|
||||
imapClient.noop();
|
||||
return { valid: true };
|
||||
})) as { valid: true };
|
||||
} catch (e) {
|
||||
return {
|
||||
valid: false,
|
||||
error: e instanceof Error ? e.message : 'Unknown error',
|
||||
};
|
||||
}
|
||||
},
|
||||
required: true,
|
||||
});
|
||||
|
||||
export type ImapAuth = AppConnectionValueForAuthProperty<typeof imapAuth>;
|
||||
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* Default lookback hours for fetching emails
|
||||
* Indicates how far back in time to fetch emails on the first fetch.
|
||||
*/
|
||||
export const DEFAULT_LOOKBACK_HOURS = 2;
|
||||
@@ -0,0 +1,78 @@
|
||||
export interface ImapClientError extends Error {
|
||||
code?: string;
|
||||
responseText?: string;
|
||||
}
|
||||
|
||||
export class ImapError extends Error {
|
||||
constructor(message: string) {
|
||||
super(`IMAP error: ${message}`);
|
||||
this.name = 'ImapGenericError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapAuthenticationError extends ImapError {
|
||||
constructor() {
|
||||
super('Authentication failed. Check username and password.');
|
||||
this.name = 'ImapAuthenticationError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapConnectionLostError extends ImapError {
|
||||
constructor() {
|
||||
super('IMAP connection lost while fetching emails.');
|
||||
this.name = 'ImapConnectionLostError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapConnectionRefusedError extends ImapError {
|
||||
constructor() {
|
||||
super('Connection refused. Check host and port settings.');
|
||||
this.name = 'ImapConnectionRefusedError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapConnectionTimeoutError extends ImapError {
|
||||
constructor() {
|
||||
super(
|
||||
'Connection timed out. Check network connectivity and server availability.'
|
||||
);
|
||||
this.name = 'ImapConnectionTimeoutError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapCertificateError extends ImapError {
|
||||
constructor() {
|
||||
super(
|
||||
'TLS certificate validation failed. Consider disabling certificate validation for testing.'
|
||||
);
|
||||
this.name = 'ImapCertificateError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapEmailNotFoundError extends ImapError {
|
||||
constructor() {
|
||||
super('Email not found in the specified mailbox.');
|
||||
this.name = 'ImapEmailNotFoundError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapHostNotFoundError extends ImapError {
|
||||
constructor() {
|
||||
super('Host not found. Please verify the IMAP server address.');
|
||||
this.name = 'ImapHostNotFoundError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapMailboxNotFoundError extends ImapError {
|
||||
constructor() {
|
||||
super('The specified mailbox/folder does not exist on the server.');
|
||||
this.name = 'ImapMailboxNotFoundError';
|
||||
}
|
||||
}
|
||||
|
||||
export class ImapSslPacketLengthTooLongError extends ImapError {
|
||||
constructor() {
|
||||
super('SSL packet length too long. The specified server port is probably incorrect.');
|
||||
this.name = 'ImapSslPacketLengthTooLongError';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,320 @@
|
||||
import {
|
||||
ImapFlow,
|
||||
type CopyResponseObject,
|
||||
type ListResponse,
|
||||
type MailboxLockObject,
|
||||
} from 'imapflow';
|
||||
import { type Attachment, type ParsedMail, simpleParser } from 'mailparser';
|
||||
import { Readable } from 'stream';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
import { type ImapAuth } from './auth';
|
||||
import { DEFAULT_LOOKBACK_HOURS } from './constants';
|
||||
import {
|
||||
type ImapClientError,
|
||||
ImapConnectionRefusedError,
|
||||
ImapHostNotFoundError,
|
||||
ImapSslPacketLengthTooLongError,
|
||||
ImapConnectionTimeoutError,
|
||||
ImapAuthenticationError,
|
||||
ImapCertificateError,
|
||||
ImapError,
|
||||
ImapMailboxNotFoundError,
|
||||
ImapConnectionLostError,
|
||||
ImapEmailNotFoundError,
|
||||
} from './errors';
|
||||
|
||||
type Message = {
|
||||
data: ParsedMail & { uid: number };
|
||||
epochMilliSeconds: number;
|
||||
};
|
||||
|
||||
function buildImapClient(auth: ImapAuth): ImapFlow {
|
||||
const imapConfig = {
|
||||
host: auth.props.host,
|
||||
port: auth.props.port,
|
||||
secure: auth.props.tls,
|
||||
auth: { user: auth.props.username, pass: auth.props.password },
|
||||
tls: { rejectUnauthorized: auth.props.validateCertificates },
|
||||
};
|
||||
|
||||
return new ImapFlow({ ...imapConfig, logger: false });
|
||||
}
|
||||
|
||||
async function confirmEmailExists(
|
||||
imapClient: ImapFlow,
|
||||
uid: number
|
||||
): Promise<void> {
|
||||
const searchResult = await imapClient.search(
|
||||
{ uid: uid.toString() },
|
||||
{ uid: true }
|
||||
);
|
||||
|
||||
if (!searchResult || searchResult.length === 0) {
|
||||
throw new ImapEmailNotFoundError();
|
||||
}
|
||||
}
|
||||
|
||||
function detectMissingMailbox(error: unknown): void {
|
||||
if (
|
||||
error &&
|
||||
typeof error === 'object' &&
|
||||
'mailboxMissing' in error &&
|
||||
(error as { mailboxMissing: boolean }).mailboxMissing
|
||||
) {
|
||||
throw new ImapMailboxNotFoundError();
|
||||
}
|
||||
}
|
||||
|
||||
async function copyEmail<T extends { success: boolean; newUid?: number }>({
|
||||
auth,
|
||||
sourceMailbox,
|
||||
targetMailbox,
|
||||
uid,
|
||||
}: {
|
||||
auth: ImapAuth;
|
||||
sourceMailbox: string;
|
||||
targetMailbox: string;
|
||||
uid: number;
|
||||
}): Promise<T> {
|
||||
return (await performMailboxOperation(
|
||||
auth,
|
||||
sourceMailbox,
|
||||
async (imapClient) => {
|
||||
await confirmEmailExists(imapClient, uid);
|
||||
|
||||
const result: false | CopyResponseObject = await imapClient.messageCopy(
|
||||
{ uid: uid.toString() },
|
||||
targetMailbox,
|
||||
{ uid: true }
|
||||
);
|
||||
|
||||
if (!result) {
|
||||
throw new ImapError('Failed to copy email.');
|
||||
}
|
||||
|
||||
const newUid = result.uidMap?.get(uid);
|
||||
return { success: true, newUid };
|
||||
}
|
||||
)) as T;
|
||||
}
|
||||
|
||||
async function deleteEmail<T extends { success: boolean }>({
|
||||
auth,
|
||||
mailbox,
|
||||
uid,
|
||||
}: {
|
||||
auth: ImapAuth;
|
||||
mailbox: string;
|
||||
uid: number;
|
||||
}): Promise<T> {
|
||||
return (await performMailboxOperation(auth, mailbox, async (imapClient) => {
|
||||
await confirmEmailExists(imapClient, uid);
|
||||
await imapClient.messageDelete({ uid: uid.toString() }, { uid: true });
|
||||
|
||||
return { success: true };
|
||||
})) as T;
|
||||
}
|
||||
|
||||
async function fetchEmails<T extends Message[]>({
|
||||
auth,
|
||||
lastPoll,
|
||||
mailbox,
|
||||
}: {
|
||||
auth: ImapAuth;
|
||||
lastPoll: number;
|
||||
mailbox: string;
|
||||
}): Promise<T> {
|
||||
return (await performMailboxOperation(auth, mailbox, async (imapClient) => {
|
||||
const messages = [];
|
||||
const since =
|
||||
lastPoll === 0
|
||||
? dayjs().subtract(DEFAULT_LOOKBACK_HOURS, 'hour').toISOString()
|
||||
: dayjs(lastPoll).toISOString();
|
||||
const res = imapClient.fetch({ since }, { source: true });
|
||||
|
||||
for await (const message of res) {
|
||||
const { source, uid } = message;
|
||||
const castedItem = await parseStream(source as unknown as Readable);
|
||||
messages.push({
|
||||
data: { ...castedItem, uid },
|
||||
epochMilliSeconds: dayjs(castedItem.date).valueOf(),
|
||||
});
|
||||
}
|
||||
|
||||
return messages;
|
||||
})) as T;
|
||||
}
|
||||
|
||||
async function fetchMailboxes<T extends ListResponse[]>(
|
||||
auth: ImapAuth
|
||||
): Promise<T> {
|
||||
return (await performImapOperation(auth, async (imapClient) => {
|
||||
return await imapClient.list();
|
||||
})) as T;
|
||||
}
|
||||
|
||||
async function moveEmail<T extends { success: boolean; newUid?: number }>({
|
||||
auth,
|
||||
sourceMailbox,
|
||||
targetMailbox,
|
||||
uid,
|
||||
}: {
|
||||
auth: ImapAuth;
|
||||
sourceMailbox: string;
|
||||
targetMailbox: string;
|
||||
uid: number;
|
||||
}): Promise<T> {
|
||||
return (await performMailboxOperation(
|
||||
auth,
|
||||
sourceMailbox,
|
||||
async (imapClient) => {
|
||||
await confirmEmailExists(imapClient, uid);
|
||||
|
||||
const result: false | CopyResponseObject = await imapClient.messageMove(
|
||||
{ uid: uid.toString() },
|
||||
targetMailbox,
|
||||
{ uid: true }
|
||||
);
|
||||
|
||||
if (result) {
|
||||
const newUid = result.uidMap?.get(uid);
|
||||
return { success: true, newUid };
|
||||
}
|
||||
|
||||
return { success: false };
|
||||
}
|
||||
)) as T;
|
||||
}
|
||||
|
||||
async function parseStream(stream: Readable) {
|
||||
return new Promise<ParsedMail>((resolve, reject) => {
|
||||
simpleParser(stream, (err, parsed) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(parsed);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function performImapOperation(
|
||||
auth: ImapAuth,
|
||||
callback: (imapClient: ImapFlow) => Promise<unknown>
|
||||
) {
|
||||
let imapClient: ImapFlow | null = null;
|
||||
|
||||
try {
|
||||
imapClient = buildImapClient(auth);
|
||||
await imapClient.connect();
|
||||
return await callback(imapClient);
|
||||
} catch (error) {
|
||||
const imapError = error as ImapClientError;
|
||||
|
||||
if (imapError.code === 'ECONNREFUSED') {
|
||||
throw new ImapConnectionRefusedError();
|
||||
} else if (imapError.code === 'ENOTFOUND') {
|
||||
throw new ImapHostNotFoundError();
|
||||
} else if (imapError.code === 'ETIMEDOUT') {
|
||||
throw new ImapConnectionTimeoutError();
|
||||
} else if (imapError.code === 'ERR_SSL_PACKET_LENGTH_TOO_LONG') {
|
||||
throw new ImapSslPacketLengthTooLongError();
|
||||
} else if (imapError.responseText?.includes('AUTH')) {
|
||||
throw new ImapAuthenticationError();
|
||||
} else if (imapError.message?.includes('IMAP connection')) {
|
||||
throw new ImapConnectionLostError();
|
||||
} else if (imapError.message?.includes('certificate')) {
|
||||
throw new ImapCertificateError();
|
||||
} else if (imapError instanceof ImapError) {
|
||||
throw imapError;
|
||||
}
|
||||
|
||||
throw new ImapError(
|
||||
imapError.message || 'Failed to perform IMAP operation'
|
||||
);
|
||||
} finally {
|
||||
try {
|
||||
if (imapClient?.usable) {
|
||||
await imapClient.logout();
|
||||
}
|
||||
} catch (e) {
|
||||
// Ignore logout errors during cleanup
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function performMailboxOperation<T>(
|
||||
auth: ImapAuth,
|
||||
mailbox: string,
|
||||
callback: (imapClient: ImapFlow) => Promise<T>,
|
||||
options: { readOnly?: boolean } = {}
|
||||
) {
|
||||
const { readOnly = true } = options;
|
||||
return (await performImapOperation(auth, async (imapClient) => {
|
||||
let lock: MailboxLockObject | null = null;
|
||||
|
||||
try {
|
||||
lock = await imapClient.getMailboxLock(mailbox, { readOnly: readOnly });
|
||||
return await callback(imapClient);
|
||||
} catch (error) {
|
||||
detectMissingMailbox(error);
|
||||
throw error;
|
||||
} finally {
|
||||
try {
|
||||
lock?.release();
|
||||
} catch (e) {
|
||||
// Ignore lock release errors during cleanup
|
||||
}
|
||||
}
|
||||
})) as T;
|
||||
}
|
||||
|
||||
async function setEmailReadStatus<T extends { success: true }>({
|
||||
auth,
|
||||
mailbox,
|
||||
uid,
|
||||
markAsRead,
|
||||
}: {
|
||||
auth: ImapAuth;
|
||||
mailbox: string;
|
||||
uid: number;
|
||||
markAsRead: boolean;
|
||||
}): Promise<T> {
|
||||
return (await performMailboxOperation(
|
||||
auth,
|
||||
mailbox,
|
||||
async (imapClient) => {
|
||||
await confirmEmailExists(imapClient, uid);
|
||||
|
||||
if (markAsRead) {
|
||||
await imapClient.messageFlagsAdd({ uid: uid.toString() }, ['\\Seen'], { uid: true });
|
||||
} else {
|
||||
await imapClient.messageFlagsRemove({ uid: uid.toString() }, ['\\Seen'], { uid: true });
|
||||
}
|
||||
|
||||
return { success: true };
|
||||
},
|
||||
{ readOnly: false }
|
||||
)) as T;
|
||||
}
|
||||
|
||||
export {
|
||||
// Types
|
||||
type Attachment,
|
||||
type Message,
|
||||
|
||||
// Helper functions
|
||||
performImapOperation,
|
||||
performMailboxOperation,
|
||||
|
||||
// Email actions
|
||||
copyEmail,
|
||||
deleteEmail,
|
||||
fetchEmails,
|
||||
moveEmail,
|
||||
setEmailReadStatus,
|
||||
|
||||
// Mailbox actions
|
||||
fetchMailboxes,
|
||||
};
|
||||
@@ -0,0 +1,5 @@
|
||||
export * from './auth';
|
||||
export * from './constants';
|
||||
export * from './errors';
|
||||
export * from './imap';
|
||||
export * from './props';
|
||||
@@ -0,0 +1,45 @@
|
||||
import { Property } from '@activepieces/pieces-framework';
|
||||
import { fetchMailboxes } from './imap';
|
||||
import { imapAuth, type ImapAuth } from './auth';
|
||||
|
||||
interface DropdownParams {
|
||||
description?: string;
|
||||
displayName: string;
|
||||
required: boolean;
|
||||
}
|
||||
|
||||
export const mailboxDropdown = (params: DropdownParams) =>
|
||||
Property.Dropdown<string,boolean,typeof imapAuth>({
|
||||
auth: imapAuth,
|
||||
displayName: params.displayName,
|
||||
description: params.description,
|
||||
required: params.required,
|
||||
refreshers: [],
|
||||
async options({ auth }) {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const mailboxes = await fetchMailboxes(auth);
|
||||
const options = mailboxes.map(
|
||||
({ name, path }: { name: string; path: string }) => ({
|
||||
label: name,
|
||||
value: path,
|
||||
})
|
||||
);
|
||||
|
||||
return { disabled: false, options };
|
||||
} catch (error: any) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error: ${error.message}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,165 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
AppConnectionValueForAuthProperty,
|
||||
FilesService,
|
||||
PiecePropValueSchema,
|
||||
Property,
|
||||
StaticPropsValue,
|
||||
TriggerStrategy,
|
||||
createTrigger,
|
||||
} from '@activepieces/pieces-framework';
|
||||
|
||||
import {
|
||||
type Attachment,
|
||||
type Message,
|
||||
imapAuth,
|
||||
mailboxDropdown,
|
||||
fetchEmails,
|
||||
} from '../common';
|
||||
|
||||
const filterInstructions = `
|
||||
**Emails Filtering:**
|
||||
|
||||
Add a Router Piece to filter emails based on the subject, to, from, cc or other fields.
|
||||
`;
|
||||
|
||||
const props = {
|
||||
mailbox: mailboxDropdown({
|
||||
displayName: 'Mailbox',
|
||||
description: 'Select the mailbox to search.',
|
||||
required: true,
|
||||
}),
|
||||
filterInstructions: Property.MarkDown({
|
||||
value: filterInstructions,
|
||||
}),
|
||||
};
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof imapAuth>,
|
||||
StaticPropsValue<typeof props>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS: lastPoll }) => {
|
||||
const { mailbox } = propsValue;
|
||||
const records = await fetchEmails({
|
||||
auth,
|
||||
lastPoll,
|
||||
mailbox: mailbox as string,
|
||||
});
|
||||
|
||||
return records.map((record) => ({
|
||||
epochMilliSeconds: record.epochMilliSeconds,
|
||||
data: record,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
// This wrapper's only purpose is to reverse the messages array to ensure that
|
||||
// test polling returns the 5 most recent messages.
|
||||
const testPolling: typeof polling = {
|
||||
...polling,
|
||||
items: async (...args) => {
|
||||
const messages = await polling.items(...args);
|
||||
return messages.reverse();
|
||||
},
|
||||
};
|
||||
|
||||
export const newEmail = createTrigger({
|
||||
auth: imapAuth,
|
||||
name: 'new_email',
|
||||
displayName: 'New Email',
|
||||
description: 'Trigger when a new email is received',
|
||||
props,
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
async test(context) {
|
||||
const messages = await pollingHelper.test(testPolling, context);
|
||||
return enrichAttachments(messages as Message[], context.files);
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onEnable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onDisable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const messages = await pollingHelper.poll(polling, context);
|
||||
return enrichAttachments(messages as Message[], context.files);
|
||||
},
|
||||
|
||||
sampleData: {
|
||||
html: '<p>My email body</p>',
|
||||
text: 'My email body',
|
||||
attachments: [],
|
||||
textAsHtml: '<p>My email body</p>',
|
||||
subject: 'Email Subject',
|
||||
date: '2023-06-18T11:30:09.000Z',
|
||||
to: {
|
||||
value: [
|
||||
{
|
||||
address: 'email@address.com',
|
||||
name: 'Name',
|
||||
},
|
||||
],
|
||||
},
|
||||
from: {
|
||||
value: [
|
||||
{
|
||||
address: 'email@address.com',
|
||||
name: 'Name',
|
||||
},
|
||||
],
|
||||
},
|
||||
cc: {
|
||||
value: [
|
||||
{
|
||||
address: 'email@address.com',
|
||||
name: 'Name',
|
||||
},
|
||||
],
|
||||
},
|
||||
messageId:
|
||||
'<CxE49ifJT5YZN9OE2O6j6Ef+BYgkKWq7X-deg483GkM1ui1xj3g@mail.gmail.com>',
|
||||
uid: 123,
|
||||
},
|
||||
});
|
||||
|
||||
export async function convertAttachment(
|
||||
attachments: Attachment[],
|
||||
files: FilesService
|
||||
) {
|
||||
const promises = attachments.map(async (attachment) => {
|
||||
return files.write({
|
||||
fileName: attachment.filename ?? `attachment-${Date.now()}`,
|
||||
data: attachment.content,
|
||||
});
|
||||
});
|
||||
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
async function enrichAttachments(items: Message[], files: FilesService) {
|
||||
return Promise.all(
|
||||
items.map(async (item) => {
|
||||
const { attachments, ...rest } = item.data;
|
||||
const convertedAttachments = attachments
|
||||
? await convertAttachment(attachments, files)
|
||||
: [];
|
||||
|
||||
return {
|
||||
...rest,
|
||||
attachments: convertedAttachments,
|
||||
// epochMilliSeconds: item.epochMilliSeconds,
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user