Skip to main content
Glama

mcp-google-sheets

new-email.ts3.18 kB
import { FilesService, Property, TriggerStrategy, createTrigger, } from '@activepieces/pieces-framework'; import { imapAuth } from '../..'; import { convertAttachment, imapCommon } from '../common'; import { ParsedMail } from 'mailparser'; const filterInstructions = ` **Filter Emails:** You can add Branch Piece to filter emails based on the subject, to, from, cc or other fields. `; export const newEmail = createTrigger({ auth: imapAuth, name: 'new_email', displayName: 'New Email', description: 'Trigger when a new email is received.', props: { mailbox: imapCommon.mailbox, filterInstructions: Property.MarkDown({ value: filterInstructions, }), }, type: TriggerStrategy.POLLING, onEnable: async (context) => { await context.store.put('lastPoll', Date.now()); }, onDisable: async (context) => { await context.store.delete('lastPoll'); return; }, run: async (context) => { const { auth, store, propsValue, files } = context; const mailbox = propsValue.mailbox; const lastEpochMilliSeconds = (await store.get<number>('lastPoll')) ?? 0; const items = await imapCommon.fetchEmails({ auth, lastEpochMilliSeconds, mailbox, files, }); const newLastEpochMilliSeconds = items.reduce( (acc, item) => Math.max(acc, item.epochMilliSeconds), lastEpochMilliSeconds ); await store.put('lastPoll', newLastEpochMilliSeconds); const filteredEmail = items .filter((f) => f.epochMilliSeconds > lastEpochMilliSeconds); return enrichAttachments(filteredEmail, files); }, test: async (context) => { const { auth, propsValue, files } = context; const mailbox = propsValue.mailbox; const lastEpochMilliSeconds = 0; const items = await imapCommon.fetchEmails({ auth, lastEpochMilliSeconds, mailbox, files, }); const filteredEmails = getFirstFiveOrAll(items); return enrichAttachments(filteredEmails, files); }, sampleData: { html: 'My email body', text: 'My email body', 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>', }, }); async function enrichAttachments(item: { data: ParsedMail; epochMilliSeconds: number; }[], files: FilesService) { return Promise.all(item.map(async (item) => { const { attachments, ...rest } = item.data return { data:{...rest}, epochMilliSeconds: item.epochMilliSeconds, attachments: await convertAttachment(item.data.attachments, files), } })); } function getFirstFiveOrAll<T>(array: T[]) { if (array.length <= 5) { return array; } else { return array.slice(0, 5); } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server