11import { defineAction } from "@pipedream/types" ;
22import app from "../../app/resend.app" ;
3+ import {
4+ getFileStreamAndMetadata , ConfigurationError ,
5+ } from "@pipedream/platform" ;
36
47export default defineAction ( {
58 name : "Send Email" ,
69 description :
710 "Send an email [See the documentation](https://resend.com/docs/api-reference/emails/send-email)" ,
811 key : "resend-send-email" ,
9- version : "0.0.1 " ,
12+ version : "0.0.2 " ,
1013 type : "action" ,
1114 props : {
1215 app,
@@ -40,7 +43,7 @@ export default defineAction({
4043 } ,
4144 cc : {
4245 type : "string" ,
43- label : "CCc " ,
46+ label : "Cc " ,
4447 description : "Cc recipient email address(es)." ,
4548 optional : true ,
4649 } ,
@@ -56,12 +59,67 @@ export default defineAction({
5659 description : "Reply-to email address(es)." ,
5760 optional : true ,
5861 } ,
62+ attachmentFiles : {
63+ type : "string[]" ,
64+ label : "File Paths or URLs" ,
65+ description : "Provide either file URLs or paths to files in the /tmp directory (for example, /tmp/myFile.pdf)" ,
66+ optional : true ,
67+ } ,
68+ attachmentsBase64 : {
69+ type : "string[]" ,
70+ label : "Base64-encoded attachments" ,
71+ description : "Provide base64-encoded attachments" ,
72+ optional : true ,
73+ } ,
74+ base64AttachmentFilenames : {
75+ type : "string[]" ,
76+ label : "Base64-encoded attachment filenames" ,
77+ description : "Provide the filenames for the base64-encoded attachments" ,
78+ optional : true ,
79+ } ,
80+ } ,
81+ methods : {
82+ async streamToBuffer ( stream ) : Promise < Buffer > {
83+ return new Promise ( ( resolve , reject ) => {
84+ const chunks : Buffer [ ] = [ ] ;
85+ stream . on ( "data" , ( chunk ) => chunks . push ( chunk ) ) ;
86+ stream . on ( "end" , ( ) => resolve ( Buffer . concat ( chunks ) ) ) ;
87+ stream . on ( "error" , reject ) ;
88+ } ) ;
89+ } ,
5990 } ,
6091 async run ( { $ } ) {
6192 const {
62- from, to, subject, html, text, cc, bcc, replyTo,
93+ from, to, subject, html, text, cc, bcc, replyTo, attachmentFiles , attachmentsBase64 , base64AttachmentFilenames ,
6394 } = this ;
6495
96+ const attachments = [ ] ;
97+ if ( attachmentFiles ) {
98+ for ( const file of attachmentFiles ) {
99+ const {
100+ stream, metadata,
101+ } = await getFileStreamAndMetadata ( file ) ;
102+ const buffer = await this . streamToBuffer ( stream ) ;
103+ const base64 = buffer . toString ( "base64" ) ;
104+ attachments . push ( {
105+ filename : metadata . name ,
106+ content : base64 ,
107+ } ) ;
108+ }
109+ }
110+
111+ if ( attachmentsBase64 ) {
112+ if ( attachmentsBase64 . length !== base64AttachmentFilenames . length ) {
113+ throw new ConfigurationError ( "The number of base64-encoded attachments must match the number of base64-encoded attachment filenames" ) ;
114+ }
115+ for ( let i = 0 ; i < attachmentsBase64 . length ; i ++ ) {
116+ attachments . push ( {
117+ filename : base64AttachmentFilenames [ i ] ,
118+ content : attachmentsBase64 [ i ] ,
119+ } ) ;
120+ }
121+ }
122+
65123 const params = {
66124 $,
67125 data : {
@@ -73,6 +131,7 @@ export default defineAction({
73131 cc,
74132 bcc,
75133 reply_to : replyTo ,
134+ attachments,
76135 } ,
77136 } ;
78137
0 commit comments