2019-06-23 03:35:23 -07:00
import {
BINARY_ENCODING ,
2021-02-22 06:07:53 -08:00
IExecuteFunctions ,
2019-06-23 03:35:23 -07:00
} from 'n8n-core' ;
import {
IDataObject ,
INodeExecutionData ,
INodeType ,
2020-10-01 05:01:39 -07:00
INodeTypeDescription ,
2021-04-16 09:33:36 -07:00
NodeApiError ,
NodeOperationError ,
2019-06-23 03:35:23 -07:00
} from 'n8n-workflow' ;
export class Mailgun implements INodeType {
description : INodeTypeDescription = {
displayName : 'Mailgun' ,
name : 'mailgun' ,
2021-06-12 12:00:37 -07:00
icon : 'file:mailgun.svg' ,
2019-06-23 03:35:23 -07:00
group : [ 'output' ] ,
version : 1 ,
2021-07-03 05:40:16 -07:00
description : 'Sends an email via Mailgun' ,
2019-06-23 03:35:23 -07:00
defaults : {
name : 'Mailgun' ,
2019-07-26 02:41:08 -07:00
color : '#c02428' ,
2019-06-23 03:35:23 -07:00
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'mailgunApi' ,
required : true ,
2020-10-22 06:46:03 -07:00
} ,
2019-06-23 03:35:23 -07:00
] ,
properties : [
{
displayName : 'From Email' ,
name : 'fromEmail' ,
type : 'string' ,
default : '' ,
required : true ,
placeholder : 'Admin <admin@example.com>' ,
description : 'Email address of the sender optional with name.' ,
} ,
{
displayName : 'To Email' ,
name : 'toEmail' ,
type : 'string' ,
default : '' ,
required : true ,
placeholder : 'info@example.com' ,
description : 'Email address of the recipient. Multiple ones can be separated by comma.' ,
} ,
{
displayName : 'Cc Email' ,
name : 'ccEmail' ,
type : 'string' ,
default : '' ,
placeholder : '' ,
description : 'Cc Email address of the recipient. Multiple ones can be separated by comma.' ,
} ,
{
displayName : 'Bcc Email' ,
name : 'bccEmail' ,
type : 'string' ,
default : '' ,
placeholder : '' ,
description : 'Bcc Email address of the recipient. Multiple ones can be separated by comma.' ,
} ,
{
displayName : 'Subject' ,
name : 'subject' ,
type : 'string' ,
default : '' ,
placeholder : 'My subject line' ,
description : 'Subject line of the email.' ,
} ,
{
displayName : 'Text' ,
name : 'text' ,
type : 'string' ,
typeOptions : {
alwaysOpenEditWindow : true ,
rows : 5 ,
} ,
default : '' ,
description : 'Plain text message of email.' ,
} ,
{
displayName : 'HTML' ,
name : 'html' ,
type : 'string' ,
typeOptions : {
rows : 5 ,
} ,
default : '' ,
description : 'HTML text message of email.' ,
} ,
{
displayName : 'Attachments' ,
name : 'attachments' ,
type : 'string' ,
default : '' ,
description : 'Name of the binary properties which contain<br />data which should be added to email as attachment.<br />Multiple ones can be comma separated.' ,
} ,
] ,
} ;
2021-03-29 02:20:10 -07:00
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
2021-02-22 06:07:53 -08:00
const items = this . getInputData ( ) ;
2021-03-29 02:20:10 -07:00
2021-02-22 06:07:53 -08:00
const returnData : INodeExecutionData [ ] = [ ] ;
const length = items . length as unknown as number ;
let item : INodeExecutionData ;
2019-06-23 03:35:23 -07:00
2021-02-22 06:07:53 -08:00
for ( let itemIndex = 0 ; itemIndex < length ; itemIndex ++ ) {
2021-07-19 23:58:54 -07:00
try {
item = items [ itemIndex ] ;
const fromEmail = this . getNodeParameter ( 'fromEmail' , itemIndex ) as string ;
const toEmail = this . getNodeParameter ( 'toEmail' , itemIndex ) as string ;
const ccEmail = this . getNodeParameter ( 'ccEmail' , itemIndex ) as string ;
const bccEmail = this . getNodeParameter ( 'bccEmail' , itemIndex ) as string ;
const subject = this . getNodeParameter ( 'subject' , itemIndex ) as string ;
const text = this . getNodeParameter ( 'text' , itemIndex ) as string ;
const html = this . getNodeParameter ( 'html' , itemIndex ) as string ;
const attachmentPropertyString = this . getNodeParameter ( 'attachments' , itemIndex ) as string ;
const credentials = this . getCredentials ( 'mailgunApi' ) ;
if ( credentials === undefined ) {
throw new NodeOperationError ( this . getNode ( ) , 'No credentials got returned!' ) ;
}
2021-02-22 06:07:53 -08:00
2021-07-19 23:58:54 -07:00
const formData : IDataObject = {
from : fromEmail ,
to : toEmail ,
subject ,
text ,
html ,
} ;
2021-02-22 06:07:53 -08:00
2021-07-19 23:58:54 -07:00
if ( ccEmail . length !== 0 ) {
formData . cc = ccEmail ;
}
if ( bccEmail . length !== 0 ) {
formData . bcc = bccEmail ;
}
2021-02-22 06:07:53 -08:00
2021-07-19 23:58:54 -07:00
if ( attachmentPropertyString && item . binary ) {
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
const attachments = [ ] ;
const attachmentProperties : string [ ] = attachmentPropertyString . split ( ',' ) . map ( ( propertyName ) = > {
return propertyName . trim ( ) ;
} ) ;
2021-02-22 06:07:53 -08:00
2021-07-19 23:58:54 -07:00
for ( const propertyName of attachmentProperties ) {
if ( ! item . binary . hasOwnProperty ( propertyName ) ) {
continue ;
}
attachments . push ( {
value : Buffer.from ( item . binary [ propertyName ] . data , BINARY_ENCODING ) ,
options : {
filename : item.binary [ propertyName ] . fileName || 'unknown' ,
} ,
} ) ;
}
2019-06-23 03:35:23 -07:00
2021-07-19 23:58:54 -07:00
if ( attachments . length ) {
// @ts-ignore
formData . attachment = attachments ;
2021-02-22 06:07:53 -08:00
}
2021-07-19 23:58:54 -07:00
}
2021-02-22 06:07:53 -08:00
2021-07-19 23:58:54 -07:00
const options = {
method : 'POST' ,
formData ,
uri : ` https:// ${ credentials . apiDomain } /v3/ ${ credentials . emailDomain } /messages ` ,
auth : {
user : 'api' ,
pass : credentials.apiKey as string ,
} ,
json : true ,
} ;
let responseData ;
try {
responseData = await this . helpers . request ( options ) ;
} catch ( error ) {
throw new NodeApiError ( this . getNode ( ) , error ) ;
2021-02-22 06:07:53 -08:00
}
2021-07-19 23:58:54 -07:00
returnData . push ( {
json : responseData ,
} ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { json : { error : error.message } } ) ;
continue ;
2021-02-22 06:07:53 -08:00
}
2021-07-19 23:58:54 -07:00
throw error ;
2021-02-22 06:07:53 -08:00
}
2021-03-29 02:20:10 -07:00
}
return this . prepareOutputData ( returnData ) ;
2019-06-23 03:35:23 -07:00
}
}