first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,281 @@
import type { INodeProperties } from 'n8n-workflow';
export const draftOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['draft'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a new email draft',
action: 'Create a draft',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a draft',
action: 'Delete a draft',
},
{
name: 'Get',
value: 'get',
description: 'Get a single draft',
action: 'Get a draft',
},
{
name: 'Send',
value: 'send',
description: 'Send an existing draft message',
action: 'Send a draft',
},
{
name: 'Update',
value: 'update',
description: 'Update a draft',
action: 'Update a draft',
},
],
default: 'create',
},
];
export const draftFields: INodeProperties[] = [
{
displayName: 'Message ID',
name: 'messageId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['draft'],
operation: ['delete', 'get', 'send', 'update'],
},
},
},
// draft:create
{
displayName: 'Subject',
name: 'subject',
description: 'The subject of the message',
displayOptions: {
show: {
resource: ['draft'],
operation: ['create'],
},
},
type: 'string',
default: '',
},
{
displayName: 'Body Content',
name: 'bodyContent',
description: 'Message body content',
type: 'string',
displayOptions: {
show: {
resource: ['draft'],
operation: ['create'],
},
},
default: '',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['draft'],
operation: ['create'],
},
},
options: [
{
displayName: 'Attachments',
name: 'attachments',
type: 'fixedCollection',
placeholder: 'Add Attachment',
default: {},
typeOptions: {
multipleValues: true,
},
options: [
{
name: 'attachments',
displayName: 'Attachment',
values: [
{
displayName: 'Binary Property Name',
name: 'binaryPropertyName',
type: 'string',
default: '',
description:
'Name of the binary property containing the data to be added to the email as an attachment',
},
],
},
],
},
{
displayName: 'BCC Recipients',
name: 'bccRecipients',
description: 'Email addresses of BCC recipients',
type: 'string',
default: '',
},
{
displayName: 'Body Content Type',
name: 'bodyContentType',
description: 'Message body content type',
type: 'options',
options: [
{
name: 'HTML',
value: 'html',
},
{
name: 'Text',
value: 'Text',
},
],
default: 'html',
},
{
displayName: 'Category Names or IDs',
name: 'categories',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getCategories',
},
default: [],
},
{
displayName: 'CC Recipients',
name: 'ccRecipients',
description: 'Email addresses of CC recipients',
type: 'string',
default: '',
},
{
displayName: 'Custom Headers',
name: 'internetMessageHeaders',
placeholder: 'Add Header',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
name: 'headers',
displayName: 'Header',
values: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the header',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
description: 'Value to set for the header',
},
],
},
],
},
{
displayName: 'From',
name: 'from',
description:
'The owner of the mailbox which the message is sent. Must correspond to the actual mailbox used.',
type: 'string',
default: '',
},
{
displayName: 'Importance',
name: 'importance',
description: 'The importance of the message',
type: 'options',
options: [
{
name: 'Low',
value: 'Low',
},
{
name: 'Normal',
value: 'Normal',
},
{
name: 'High',
value: 'High',
},
],
default: 'Low',
},
{
displayName: 'Read Receipt Requested',
name: 'isReadReceiptRequested',
description: 'Whether a read receipt is requested for the message',
type: 'boolean',
default: false,
},
{
displayName: 'Recipients',
name: 'toRecipients',
description: 'Email addresses of recipients. Multiple can be added separated by comma.',
type: 'string',
default: '',
},
{
displayName: 'Reply To',
name: 'replyTo',
description: 'Email addresses to use when replying',
type: 'string',
default: '',
},
],
},
// draft:send
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['draft'],
operation: ['send'],
},
},
options: [
{
displayName: 'Recipients',
name: 'recipients',
description: 'Email addresses of recipients. Mutiple can be set separated by comma.',
type: 'string',
default: '',
},
],
},
];
@@ -0,0 +1,206 @@
import type { INodeProperties } from 'n8n-workflow';
export const draftMessageSharedFields: INodeProperties[] = [
// Get & Get All operations
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['draft', 'message'],
operation: ['get', 'getAll'],
},
},
options: [
{
displayName: 'Attachments Prefix',
name: 'dataPropertyAttachmentsPrefixName',
type: 'string',
default: 'attachment_',
description:
'Prefix for name of the binary property to which to write the attachments. An index starting with 0 will be added. So if name is "attachment_" the first attachment is saved to "attachment_0"',
},
{
displayName: 'Fields',
name: 'fields',
type: 'string',
default: '',
description: 'Fields the response will contain. Multiple can be added separated by comma.',
},
{
displayName: 'Filter',
name: 'filter',
type: 'string',
default: '',
placeholder: 'isRead eq false',
description:
'Microsoft Graph API OData $filter query. Information about the syntax can be found <a href="https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter">here</a>.',
},
],
},
// Update operation
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['draft', 'message'],
operation: ['update'],
},
},
options: [
{
displayName: 'BCC Recipients',
name: 'bccRecipients',
description: 'Email addresses of BCC recipients',
type: 'string',
default: '',
},
{
displayName: 'Body Content',
name: 'bodyContent',
description: 'Message body content',
type: 'string',
default: '',
},
{
displayName: 'Body Content Type',
name: 'bodyContentType',
description: 'Message body content type',
type: 'options',
options: [
{
name: 'HTML',
value: 'html',
},
{
name: 'Text',
value: 'Text',
},
],
default: 'html',
},
{
displayName: 'Category Names or IDs',
name: 'categories',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getCategories',
},
default: [],
},
{
displayName: 'CC Recipients',
name: 'ccRecipients',
description: 'Email addresses of CC recipients',
type: 'string',
default: '',
},
{
displayName: 'Custom Headers',
name: 'internetMessageHeaders',
placeholder: 'Add Header',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
name: 'headers',
displayName: 'Header',
values: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the header',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
description: 'Value to set for the header',
},
],
},
],
},
{
displayName: 'From',
name: 'from',
description:
'The owner of the mailbox which the message is sent. Must correspond to the actual mailbox used.',
type: 'string',
default: '',
},
{
displayName: 'Importance',
name: 'importance',
description: 'The importance of the message',
type: 'options',
options: [
{
name: 'Low',
value: 'Low',
},
{
name: 'Normal',
value: 'Normal',
},
{
name: 'High',
value: 'High',
},
],
default: 'Low',
},
{
displayName: 'Is Read',
name: 'isRead',
description: 'Whether the message has been read',
type: 'boolean',
default: false,
},
{
displayName: 'Read Receipt Requested',
name: 'isReadReceiptRequested',
description: 'Whether a read receipt is requested for the message',
type: 'boolean',
default: false,
},
{
displayName: 'Recipients',
name: 'toRecipients',
description: 'Email addresses of recipients. Multiple can be added separated by comma.',
type: 'string',
default: '',
},
{
displayName: 'Reply To',
name: 'replyTo',
description: 'Email addresses to use when replying',
type: 'string',
default: '',
},
{
displayName: 'Subject',
name: 'subject',
description: 'The subject of the message',
type: 'string',
default: '',
},
],
},
];
@@ -0,0 +1,258 @@
import type { INodeProperties } from 'n8n-workflow';
export const folderOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['folder'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: "Create a new mail folder in the root folder of the user's mailbox",
action: 'Create a folder',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a folder',
action: 'Delete a folder',
},
{
name: 'Get',
value: 'get',
description: 'Get a single folder details',
action: 'Get a folder',
},
{
name: 'Get Children',
value: 'getChildren',
description: 'Lists all child folders under the folder',
action: 'Get items in a folder',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many folders under the root folder of the signed-in user',
action: 'Get many folders',
},
],
default: 'create',
},
];
export const folderFields: INodeProperties[] = [
{
displayName: 'Folder ID',
name: 'folderId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['delete', 'get', 'getChildren', 'update'],
},
},
},
// folder:list, getChildren, listMessages
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll', 'getChildren'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll', 'getChildren'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 500,
},
default: 100,
description: 'Max number of results to return',
},
// folder:create
{
displayName: 'Type',
name: 'folderType',
description: 'Folder Type',
type: 'options',
options: [
{
name: 'Folder',
value: 'folder',
},
{
name: 'Search Folder',
value: 'searchFolder',
},
],
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
},
},
default: 'folder',
},
{
displayName: 'Display Name',
name: 'displayName',
description: 'Name of the folder',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
},
},
},
{
displayName: 'Include Nested Folders',
name: 'includeNestedFolders',
description: 'Whether to include child folders in the search',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
folderType: ['searchFolder'],
},
},
},
{
displayName: 'Source Folder IDs',
name: 'sourceFolderIds',
description: 'The mailbox folders that should be mined',
type: 'string',
typeOptions: {
multipleValues: true,
},
default: [],
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
folderType: ['searchFolder'],
},
},
},
{
displayName: 'Filter Query',
name: 'filterQuery',
description: 'The OData query to filter the messages',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
folderType: ['searchFolder'],
},
},
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['folder'],
operation: ['get', 'getAll', 'getChildren'],
},
},
options: [
{
displayName: 'Fields',
name: 'fields',
type: 'string',
default: '',
description: 'Fields the response will contain. Multiple can be added separated by ,.',
},
{
displayName: 'Filter',
name: 'filter',
type: 'string',
default: '',
description:
'Microsoft Graph API OData $filter query. Information about the syntax can be found <a href="https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter">here</a>.',
},
],
},
// folder:update
{
displayName: 'Update Fields',
name: 'updateFields',
description: 'Fields to update',
type: 'collection',
default: {},
displayOptions: {
show: {
resource: ['folder'],
operation: ['update'],
},
},
options: [
{
displayName: 'Display Name',
name: 'displayName',
description: 'Name of the folder',
type: 'string',
default: '',
},
{
displayName: 'Filter Query',
name: 'filterQuery',
description: 'The OData query to filter the messages. Only for search folders.',
type: 'string',
default: '',
},
{
displayName: 'Include Nested Folders',
name: 'includeNestedFolders',
description: 'Whether to include child folders in the search. Only for search folders.',
type: 'boolean',
default: false,
},
{
displayName: 'Source Folder IDs',
name: 'sourceFolderIds',
description: 'The mailbox folders that should be mined. Only for search folders.',
type: 'string',
typeOptions: {
multipleValues: true,
},
default: [],
},
],
},
];
@@ -0,0 +1,101 @@
import type { INodeProperties } from 'n8n-workflow';
export const folderMessageOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['folderMessage'],
},
},
options: [
{
name: 'Get Many',
value: 'getAll',
description: 'Get many messages in a folder',
action: 'Get many folder messages',
},
],
default: 'create',
},
];
export const folderMessageFields: INodeProperties[] = [
{
displayName: 'Folder ID',
name: 'folderId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['folderMessage'],
operation: ['getAll'],
},
},
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['folderMessage'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['folderMessage'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 500,
},
default: 100,
description: 'Max number of results to return',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['folderMessage'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Fields',
name: 'fields',
type: 'string',
default: '',
description: 'Fields the response will contain. Multiple can be added separated by ,.',
},
{
displayName: 'Filter',
name: 'filter',
type: 'string',
default: '',
description:
'Microsoft Graph API OData $filter query. Information about the syntax can be found <a href="https://docs.microsoft.com/en-us/graph/query-parameters#filter-parameter">here</a>.',
},
],
},
];
@@ -0,0 +1,224 @@
import type {
IDataObject,
IExecuteFunctions,
IHttpRequestMethods,
ILoadOptionsFunctions,
INodeExecutionData,
IRequestOptions,
JsonObject,
} from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow';
export async function microsoftApiRequest(
this: IExecuteFunctions | ILoadOptionsFunctions,
method: IHttpRequestMethods,
resource: string,
body: any = {},
qs: IDataObject = {},
uri?: string,
headers: IDataObject = {},
option: IDataObject = { json: true },
): Promise<any> {
const credentials = await this.getCredentials('microsoftOutlookOAuth2Api');
let apiUrl = `https://graph.microsoft.com/v1.0/me${resource}`;
// If accessing shared mailbox
if (credentials.useShared && credentials.userPrincipalName) {
apiUrl = `https://graph.microsoft.com/v1.0/users/${credentials.userPrincipalName}${resource}`;
}
const options: IRequestOptions = {
headers: {
'Content-Type': 'application/json',
},
method,
body,
qs,
uri: uri || apiUrl,
};
try {
Object.assign(options, option);
if (Object.keys(headers).length !== 0) {
options.headers = Object.assign({}, options.headers, headers);
}
if (Object.keys(body as IDataObject).length === 0) {
delete options.body;
}
return await this.helpers.requestOAuth2.call(this, 'microsoftOutlookOAuth2Api', options);
} catch (error) {
throw new NodeApiError(this.getNode(), error as JsonObject);
}
}
export async function microsoftApiRequestAllItems(
this: IExecuteFunctions | ILoadOptionsFunctions,
propertyName: string,
method: IHttpRequestMethods,
endpoint: string,
body: any = {},
query: IDataObject = {},
headers: IDataObject = {},
): Promise<any> {
const returnData: IDataObject[] = [];
let responseData;
let uri: string | undefined;
query.$top = 100;
do {
responseData = await microsoftApiRequest.call(
this,
method,
endpoint,
body,
query,
uri,
headers,
);
uri = responseData['@odata.nextLink'];
returnData.push.apply(returnData, responseData[propertyName] as IDataObject[]);
} while (responseData['@odata.nextLink'] !== undefined);
return returnData;
}
export async function microsoftApiRequestAllItemsSkip(
this: IExecuteFunctions | ILoadOptionsFunctions,
propertyName: string,
method: IHttpRequestMethods,
endpoint: string,
body: any = {},
query: IDataObject = {},
headers: IDataObject = {},
): Promise<any> {
const returnData: IDataObject[] = [];
let responseData;
query.$top = 100;
query.$skip = 0;
do {
responseData = await microsoftApiRequest.call(
this,
method,
endpoint,
body,
query,
undefined,
headers,
);
query.$skip += query.$top;
returnData.push.apply(returnData, responseData[propertyName] as IDataObject[]);
} while (responseData.value.length !== 0);
return returnData;
}
export function makeRecipient(email: string) {
return {
emailAddress: {
address: email,
},
};
}
export function createMessage(fields: IDataObject) {
const message: IDataObject = {};
// Create body object
if (fields.bodyContent || fields.bodyContentType) {
const bodyObject = {
content: fields.bodyContent,
contentType: fields.bodyContentType,
};
message.body = bodyObject;
delete fields.bodyContent;
delete fields.bodyContentType;
}
// Handle custom headers
if (
'internetMessageHeaders' in fields &&
'headers' in (fields.internetMessageHeaders as IDataObject)
) {
fields.internetMessageHeaders = (fields.internetMessageHeaders as IDataObject).headers;
}
// Handle recipient fields
['bccRecipients', 'ccRecipients', 'replyTo', 'sender', 'toRecipients'].forEach((key) => {
if (Array.isArray(fields[key])) {
fields[key] = (fields[key] as string[]).map((email) => makeRecipient(email));
} else if (fields[key] !== undefined) {
fields[key] = (fields[key] as string)
.split(',')
.map((recipient: string) => makeRecipient(recipient));
}
});
['from', 'sender'].forEach((key) => {
if (fields[key] !== undefined) {
fields[key] = makeRecipient(fields[key] as string);
}
});
Object.assign(message, fields);
return message;
}
export async function downloadAttachments(
this: IExecuteFunctions,
messages: IDataObject[] | IDataObject,
prefix: string,
) {
const elements: INodeExecutionData[] = [];
if (!Array.isArray(messages)) {
messages = [messages];
}
for (const message of messages) {
const element: INodeExecutionData = {
json: message,
binary: {},
};
if (message.hasAttachments === true) {
const attachments = await microsoftApiRequestAllItems.call(
this,
'value',
'GET',
`/messages/${message.id}/attachments`,
{},
);
for (const [index, attachment] of attachments.entries()) {
const response = await microsoftApiRequest.call(
this,
'GET',
`/messages/${message.id}/attachments/${attachment.id}/$value`,
undefined,
{},
undefined,
{},
{ encoding: null, resolveWithFullResponse: true },
);
const data = Buffer.from(response.body as string, 'utf8');
element.binary![`${prefix}${index}`] = await this.helpers.prepareBinaryData(
data as unknown as Buffer,
attachment.name as string,
attachment.contentType as string,
);
}
}
if (Object.keys(element.binary!).length === 0) {
delete element.binary;
}
elements.push(element);
}
return elements;
}
@@ -0,0 +1,178 @@
import type { INodeProperties } from 'n8n-workflow';
export const messageAttachmentOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['messageAttachment'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add an attachment to a message',
action: 'Add a message attachment',
},
{
name: 'Download',
value: 'download',
description: 'Download attachment content',
action: 'Download a message attachment',
},
{
name: 'Get',
value: 'get',
description: 'Get an attachment from a message',
action: 'Get a message attachment',
},
{
name: 'Get Many',
value: 'getAll',
description: "Get many message's attachments",
action: 'Get many message attachments',
},
],
default: 'add',
},
];
export const messageAttachmentFields: INodeProperties[] = [
{
displayName: 'Message ID',
name: 'messageId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['add', 'download', 'get', 'getAll'],
},
},
},
{
displayName: 'Attachment ID',
name: 'attachmentId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['download', 'get'],
},
},
},
// messageAttachment:getAll, messageAttachment:listAttachments
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 500,
},
default: 100,
description: 'Max number of results to return',
},
// messageAttachment:create, messageAttachment:update, messageAttachment:send
// File operations
{
displayName: 'Put Output File in Field',
name: 'binaryPropertyName',
hint: 'The name of the output binary field to put the file in',
type: 'string',
required: true,
default: 'data',
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['add', 'download'],
},
},
},
// messageAttachment:add
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['add'],
},
},
options: [
{
displayName: 'File Name',
name: 'fileName',
description:
'Filename of the attachment. If not set will the file-name of the binary property be used, if it exists.',
type: 'string',
default: '',
},
],
},
// Get & Get All operations
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['messageAttachment'],
operation: ['get', 'getAll'],
},
},
options: [
{
displayName: 'Fields',
name: 'fields',
type: 'string',
default: '',
description: 'Fields the response will contain. Multiple can be added separated by ,.',
},
{
displayName: 'Filter',
name: 'filter',
type: 'string',
default: '',
description: 'Microsoft Graph API OData $filter query',
},
],
},
];
@@ -0,0 +1,591 @@
import type { INodeProperties } from 'n8n-workflow';
export const messageOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['message'],
},
},
options: [
{
name: 'Delete',
value: 'delete',
description: 'Delete a message',
action: 'Delete a message',
},
{
name: 'Get',
value: 'get',
description: 'Get a single message',
action: 'Get a message',
},
{
name: 'Get Many',
value: 'getAll',
description: "Get many messages in the signed-in user's mailbox",
action: 'Get many messages',
},
{
name: 'Get MIME Content',
value: 'getMime',
description: 'Get MIME content of a message',
action: 'Get MIME Content of a message',
},
{
name: 'Move',
value: 'move',
description: 'Move a message',
action: 'Move a message',
},
{
name: 'Reply',
value: 'reply',
description: 'Create reply to a message',
action: 'Reply to a message',
},
{
name: 'Send',
value: 'send',
description: 'Send a message',
action: 'Send a message',
},
{
name: 'Update',
value: 'update',
description: 'Update a message',
action: 'Update a message',
},
],
default: 'send',
},
];
export const messageFields: INodeProperties[] = [
{
displayName: 'Message ID',
name: 'messageId',
type: 'string',
required: true,
default: '',
displayOptions: {
show: {
resource: ['message'],
operation: [
'addAttachment',
'delete',
'get',
'getAttachment',
'getMime',
'move',
'update',
'reply',
],
},
},
},
// message:reply
{
displayName: 'Reply Type',
name: 'replyType',
type: 'options',
options: [
{
name: 'Reply',
value: 'reply',
},
{
name: 'Reply All',
value: 'replyAll',
},
],
default: 'reply',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['reply'],
},
},
},
{
displayName: 'Comment',
name: 'comment',
description: 'A comment to include. Can be an empty string.',
displayOptions: {
show: {
resource: ['message'],
operation: ['reply'],
},
},
type: 'string',
default: '',
},
{
displayName: 'Send',
name: 'send',
description:
'Whether to send the reply message directly. If not set, it will be saved as draft.',
displayOptions: {
show: {
resource: ['message'],
operation: ['reply'],
},
},
type: 'boolean',
default: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['message'],
operation: ['reply'],
replyType: ['reply'],
},
},
options: [
{
displayName: 'Attachments',
name: 'attachments',
type: 'fixedCollection',
placeholder: 'Add Attachment',
default: {},
typeOptions: {
multipleValues: true,
},
options: [
{
name: 'attachments',
displayName: 'Attachment',
values: [
{
displayName: 'Binary Property Name',
name: 'binaryPropertyName',
type: 'string',
default: '',
description:
'Name of the binary property containing the data to be added to the email as an attachment',
},
],
},
],
},
{
displayName: 'BCC Recipients',
name: 'bccRecipients',
description: 'Email addresses of BCC recipients',
type: 'string',
default: '',
},
{
displayName: 'Body Content',
name: 'bodyContent',
description: 'Message body content',
type: 'string',
default: '',
},
{
displayName: 'Body Content Type',
name: 'bodyContentType',
description: 'Message body content type',
type: 'options',
options: [
{
name: 'HTML',
value: 'html',
},
{
name: 'Text',
value: 'Text',
},
],
default: 'html',
},
{
displayName: 'CC Recipients',
name: 'ccRecipients',
description: 'Email addresses of CC recipients',
type: 'string',
default: '',
},
{
displayName: 'Custom Headers',
name: 'internetMessageHeaders',
placeholder: 'Add Header',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
name: 'headers',
displayName: 'Header',
values: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the header',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
description: 'Value to set for the header',
},
],
},
],
},
{
displayName: 'From',
name: 'from',
description:
'The owner of the mailbox which the message is sent. Must correspond to the actual mailbox used.',
type: 'string',
default: '',
},
{
displayName: 'Importance',
name: 'importance',
description: 'The importance of the message',
type: 'options',
options: [
{
name: 'Low',
value: 'Low',
},
{
name: 'Normal',
value: 'Normal',
},
{
name: 'High',
value: 'High',
},
],
default: 'Low',
},
{
displayName: 'Read Receipt Requested',
name: 'isReadReceiptRequested',
description: 'Whether a read receipt is requested for the message',
type: 'boolean',
default: false,
},
{
displayName: 'Recipients',
name: 'toRecipients',
description: 'Email addresses of recipients. Multiple can be added separated by comma.',
type: 'string',
default: '',
},
{
displayName: 'Reply To',
name: 'replyTo',
description: 'Email addresses to use when replying',
type: 'string',
default: '',
},
{
displayName: 'Subject',
name: 'subject',
description: 'The subject of the message',
type: 'string',
default: '',
},
],
},
// message:getAll
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['message'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['message'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 500,
},
default: 100,
description: 'Max number of results to return',
},
// message:create, message:update, message:send
{
displayName: 'Subject',
name: 'subject',
description: 'The subject of the message',
displayOptions: {
show: {
resource: ['message'],
operation: ['create', 'send'],
},
},
type: 'string',
default: '',
},
{
displayName: 'Body Content',
name: 'bodyContent',
description: 'Message body content',
type: 'string',
displayOptions: {
show: {
resource: ['message'],
operation: ['create', 'send'],
},
},
default: '',
},
{
displayName: 'Recipients',
name: 'toRecipients',
description: 'Email addresses of recipients. Multiple can be added separated by comma.',
type: 'string',
displayOptions: {
show: {
resource: ['message'],
operation: ['send'],
},
},
required: true,
default: '',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['message'],
operation: ['send'],
},
},
options: [
{
displayName: 'Attachments',
name: 'attachments',
type: 'fixedCollection',
placeholder: 'Add Attachment',
default: {},
typeOptions: {
multipleValues: true,
},
options: [
{
name: 'attachments',
displayName: 'Attachment',
values: [
{
displayName: 'Binary Property Name',
name: 'binaryPropertyName',
type: 'string',
default: '',
description:
'Name of the binary property containing the data to be added to the email as an attachment',
},
],
},
],
},
{
displayName: 'BCC Recipients',
name: 'bccRecipients',
description: 'Email addresses of BCC recipients',
type: 'string',
default: '',
},
{
displayName: 'Body Content Type',
name: 'bodyContentType',
description: 'Message body content type',
type: 'options',
options: [
{
name: 'HTML',
value: 'html',
},
{
name: 'Text',
value: 'Text',
},
],
default: 'html',
},
{
displayName: 'Category Names or IDs',
name: 'categories',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getCategories',
},
default: [],
},
{
displayName: 'CC Recipients',
name: 'ccRecipients',
description: 'Email addresses of CC recipients',
type: 'string',
default: '',
},
{
displayName: 'Custom Headers',
name: 'internetMessageHeaders',
placeholder: 'Add Header',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
name: 'headers',
displayName: 'Header',
values: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
description: 'Name of the header',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
description: 'Value to set for the header',
},
],
},
],
},
{
displayName: 'From',
name: 'from',
description:
'The owner of the mailbox which the message is sent. Must correspond to the actual mailbox used.',
type: 'string',
default: '',
},
{
displayName: 'Importance',
name: 'importance',
description: 'The importance of the message',
type: 'options',
options: [
{
name: 'Low',
value: 'Low',
},
{
name: 'Normal',
value: 'Normal',
},
{
name: 'High',
value: 'High',
},
],
default: 'Low',
},
{
displayName: 'Read Receipt Requested',
name: 'isReadReceiptRequested',
description: 'Whether a read receipt is requested for the message',
type: 'boolean',
default: false,
},
{
displayName: 'Recipients',
name: 'toRecipients',
description: 'Email addresses of recipients. Multiple can be added separated by comma.',
type: 'string',
default: '',
},
{
displayName: 'Reply To',
name: 'replyTo',
description: 'Email addresses to use when replying',
type: 'string',
default: '',
},
{
displayName: 'Save To Sent Items',
name: 'saveToSentItems',
description: 'Whether to save the message in Sent Items',
type: 'boolean',
default: true,
},
],
},
// File operations
{
displayName: 'Put Output File in Field',
name: 'binaryPropertyName',
hint: 'The name of the output binary field to put the file in',
type: 'string',
required: true,
default: 'data',
displayOptions: {
show: {
resource: ['message'],
operation: ['getMime'],
},
},
},
// message:move
{
displayName: 'Folder ID',
name: 'folderId',
description: 'Target Folder ID',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['message'],
operation: ['move'],
},
},
},
];
File diff suppressed because it is too large Load Diff