Weweb mail plugin not working?

Hi! I’m getting a 403 error using the weweb mail plugin but I don’t know why, I don’t have any variable formula or anything in the action. Can anyone please help me?

Hi @stevedesignerd :wave:

What do you mean? Can you clarify how you set up the “Send an email” action? How did you tell the action what recipient(s) should receive the email?

It might also help us to see the information in the response of the error message you received. This will give us more information about what the error is and what might be causing it. Here’s an article on how to debug workflows that might help.

Hi Joyce thanks for the quick reply I mean, that I only used static info, like this:

and sure here’s the Error that I got :smiley:

name: "Error"
stack: "Error: Request failed with status code 403 at e.exports (https://editor-cdn.weweb.io/public/js/chunk-vendors.7f825e18.js:1:103697) at e.exports (https://editor-cdn.weweb.io/public/js/chunk-vendors.7f825e18.js:1:106145) at XMLHttpRequest.b (https://editor-cdn.weweb.io/public/js/chunk-vendors.7f825e18.js:1:98276)"
message: "Request failed with status code 403"
isAxiosError: true
toJSON: function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}
config
adapter: function(e){return new Promise((function(t,n){var h,f=e.data,p=e.headers,m=e.responseType;function g(){e.cancelToken&&e.cancelToken.unsubscribe(h),e.signal&&e.signal.removeEventListener("abort",h)}r.isFormData(f)&&delete p["Content-Type"];var _=new XMLHttpRequest;if(e.auth){var y=e.auth.username||"",v=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";p.Authorization="Basic "+btoa(y+":"+v)}var w=s(e.baseURL,e.url);function b(){if(_){var r="getAllResponseHeaders"in _?A(_.getAllResponseHeaders()):null,o=m&&"text"!==m&&"json"!==m?_.response:_.responseText,a={data:o,status:_.status,statusText:_.statusText,headers:r,config:e,request:_};i((function(e){t(e),g()}),(function(e){n(e),g()}),a),_=null}}if(_.open(e.method.toUpperCase(),a(w,e.params,e.paramsSerializer),!0),_.timeout=e.timeout,"onloadend"in _?_.onloadend=b:_.onreadystatechange=function(){_&&4===_.readyState&&(0!==_.status||_.responseURL&&0===_.responseURL.indexOf("file:"))&&setTimeout(b)},_.onabort=function(){_&&(n(c("Request aborted",e,"ECONNABORTED",_)),_=null)},_.onerror=function(){n(c("Network Error",e,null,_)),_=null},_.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||l;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(c(t,e,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",_)),_=null},r.isStandardBrowserEnv()){var B=(e.withCredentials||u(w))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;B&&(p[e.xsrfHeaderName]=B)}"setRequestHeader"in _&&r.forEach(p,(function(e,t){"undefined"===typeof f&&"content-type"===t.toLowerCase()?delete p[t]:_.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(_.withCredentials=!!e.withCredentials),m&&"json"!==m&&(_.responseType=e.responseType),"function"===typeof e.onDownloadProgress&&_.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&_.upload&&_.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(h=function(e){_&&(n(!e||e&&e.type?new d("canceled"):e),_.abort(),_=null)},e.cancelToken&&e.cancelToken.subscribe(h),e.signal&&(e.signal.aborted?h():e.signal.addEventListener("abort",h))),f||(f=null),_.send(f)}))}
timeout: 0
xsrfCookieName: "XSRF-TOKEN"
xsrfHeaderName: "X-XSRF-TOKEN"
maxContentLength: -1
maxBodyLength: -1
validateStatus: function(e){return e>=200&&e<300}
method: "post"
url: "https://api.weweb.io/v1/designs/f41c1e0b-d300-4352-bd09-e3175a5687ab/send-email"
data: "{"recipients":["meli.mail@stevedesingerd.com"],"subject":"test subject","content":"testmail"}"
transitional
silentJSONParsing: true
forcedJSONParsing: true
clarifyTimeoutError: false
transformRequest
0: function(e,t){return i(t,"Accept"),i(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e)?e:r.isArrayBufferView(e)?e.buffer:r.isURLSearchParams(e)?(A(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):r.isObject(e)||t&&"application/json"===t["Content-Type"]?(A(t,"application/json"),c(e)):e}
transformResponse
0: function(e){var t=this.transitional||l.transitional,n=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,a=!n&&"json"===this.responseType;if(a||i&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(s){if(a){if("SyntaxError"===s.name)throw o(s,this,"E_JSON_PARSE");throw s}}return e}
headers
Accept: "application/json, text/plain, */*"
Content-Type: "application/json"
request
onreadystatechange: null
readyState: 4
timeout: 0
withCredentials: false
responseURL: "https://api.weweb.io/v1/designs/f41c1e0b-d300-4352-bd09-e3175a5687ab/send-email"
status: 403
statusText: ""
responseType: ""
response: "{"message":"RATE_LIMIT_EXCEDEED"}"
responseText: "{"message":"RATE_LIMIT_EXCEDEED"}"
responseXML: null
UNSENT: 0
OPENED: 1
HEADERS_RECEIVED: 2
LOADING: 3
DONE: 4
abort: function abort() { [native code] }
getAllResponseHeaders: function getAllResponseHeaders() { [native code] }
getResponseHeader: function getResponseHeader() { [native code] }
open: function open() { [native code] }
overrideMimeType: function overrideMimeType() { [native code] }
send: function send() { [native code] }
setRequestHeader: function setRequestHeader() { [native code] }
onloadstart: null
onprogress: null
onabort: function(){_&&(n(c("Request aborted",e,"ECONNABORTED",_)),_=null)}
onerror: function(){n(c("Network Error",e,null,_)),_=null}
onload: null
ontimeout: function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||l;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(c(t,e,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",_)),_=null}
onloadend: function b(){if(_){var r="getAllResponseHeaders"in _?A(_.getAllResponseHeaders()):null,o=m&&"text"!==m&&"json"!==m?_.response:_.responseText,a={data:o,status:_.status,statusText:_.statusText,headers:r,config:e,request:_};i((function(e){t(e),g()}),(function(e){n(e),g()}),a),_=null}}
addEventListener: function addEventListener() { [native code] }
dispatchEvent: function dispatchEvent() { [native code] }
removeEventListener: function removeEventListener() { [native code] }
upload
Object
response
status: 403
statusText: ""
data
message: "RATE_LIMIT_EXCEDEED"
headers
content-length: "33"
content-type: "application/json; charset=utf-8"
config
adapter: function(e){return new Promise((function(t,n){var h,f=e.data,p=e.headers,m=e.responseType;function g(){e.cancelToken&&e.cancelToken.unsubscribe(h),e.signal&&e.signal.removeEventListener("abort",h)}r.isFormData(f)&&delete p["Content-Type"];var _=new XMLHttpRequest;if(e.auth){var y=e.auth.username||"",v=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";p.Authorization="Basic "+btoa(y+":"+v)}var w=s(e.baseURL,e.url);function b(){if(_){var r="getAllResponseHeaders"in _?A(_.getAllResponseHeaders()):null,o=m&&"text"!==m&&"json"!==m?_.response:_.responseText,a={data:o,status:_.status,statusText:_.statusText,headers:r,config:e,request:_};i((function(e){t(e),g()}),(function(e){n(e),g()}),a),_=null}}if(_.open(e.method.toUpperCase(),a(w,e.params,e.paramsSerializer),!0),_.timeout=e.timeout,"onloadend"in _?_.onloadend=b:_.onreadystatechange=function(){_&&4===_.readyState&&(0!==_.status||_.responseURL&&0===_.responseURL.indexOf("file:"))&&setTimeout(b)},_.onabort=function(){_&&(n(c("Request aborted",e,"ECONNABORTED",_)),_=null)},_.onerror=function(){n(c("Network Error",e,null,_)),_=null},_.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||l;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(c(t,e,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",_)),_=null},r.isStandardBrowserEnv()){var B=(e.withCredentials||u(w))&&e.xsrfCookieName?o.read(e.xsrfCookieName):void 0;B&&(p[e.xsrfHeaderName]=B)}"setRequestHeader"in _&&r.forEach(p,(function(e,t){"undefined"===typeof f&&"content-type"===t.toLowerCase()?delete p[t]:_.setRequestHeader(t,e)})),r.isUndefined(e.withCredentials)||(_.withCredentials=!!e.withCredentials),m&&"json"!==m&&(_.responseType=e.responseType),"function"===typeof e.onDownloadProgress&&_.addEventListener("progress",e.onDownloadProgress),"function"===typeof e.onUploadProgress&&_.upload&&_.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(h=function(e){_&&(n(!e||e&&e.type?new d("canceled"):e),_.abort(),_=null)},e.cancelToken&&e.cancelToken.subscribe(h),e.signal&&(e.signal.aborted?h():e.signal.addEventListener("abort",h))),f||(f=null),_.send(f)}))}
timeout: 0
xsrfCookieName: "XSRF-TOKEN"
xsrfHeaderName: "X-XSRF-TOKEN"
maxContentLength: -1
maxBodyLength: -1
validateStatus: function(e){return e>=200&&e<300}
method: "post"
url: "https://api.weweb.io/v1/designs/f41c1e0b-d300-4352-bd09-e3175a5687ab/send-email"
data: "{"recipients":["meli.mail@stevedesingerd.com"],"subject":"test subject","content":"testmail"}"
transitional
silentJSONParsing: true
forcedJSONParsing: true
clarifyTimeoutError: false
transformRequest
0: function(e,t){return i(t,"Accept"),i(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e)?e:r.isArrayBufferView(e)?e.buffer:r.isURLSearchParams(e)?(A(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):r.isObject(e)||t&&"application/json"===t["Content-Type"]?(A(t,"application/json"),c(e)):e}
transformResponse
0: function(e){var t=this.transitional||l.transitional,n=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,a=!n&&"json"===this.responseType;if(a||i&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(s){if(a){if("SyntaxError"===s.name)throw o(s,this,"E_JSON_PARSE");throw s}}return e}
headers
Accept: "application/json, text/plain, */*"
Content-Type: "application/json"
request
onreadystatechange: null
readyState: 4
timeout: 0
withCredentials: false
responseURL: "https://api.weweb.io/v1/designs/f41c1e0b-d300-4352-bd09-e3175a5687ab/send-email"
status: 403
statusText: ""
responseType: ""
response: "{"message":"RATE_LIMIT_EXCEDEED"}"
responseText: "{"message":"RATE_LIMIT_EXCEDEED"}"
responseXML: null
UNSENT: 0
OPENED: 1
HEADERS_RECEIVED: 2
LOADING: 3
DONE: 4
abort: function abort() { [native code] }
getAllResponseHeaders: function getAllResponseHeaders() { [native code] }
getResponseHeader: function getResponseHeader() { [native code] }
open: function open() { [native code] }
overrideMimeType: function overrideMimeType() { [native code] }
send: function send() { [native code] }
setRequestHeader: function setRequestHeader() { [native code] }
onloadstart: null
onprogress: null
onabort: function(){_&&(n(c("Request aborted",e,"ECONNABORTED",_)),_=null)}
onerror: function(){n(c("Network Error",e,null,_)),_=null}
onload: null
ontimeout: function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",r=e.transitional||l;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),n(c(t,e,r.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",_)),_=null}
onloadend: function b(){if(_){var r="getAllResponseHeaders"in _?A(_.getAllResponseHeaders()):null,o=m&&"text"!==m&&"json"!==m?_.response:_.responseText,a={data:o,status:_.status,statusText:_.statusText,headers:r,config:e,request:_};i((function(e){t(e),g()}),(function(e){n(e),g()}),a),_=null}}
addEventListener: function addEventListener() { [native code] }
dispatchEvent: function dispatchEvent() { [native code] }
removeEventListener: function removeEventListener() { [native code] }
upload
onloadstart: null
onprogress: null
onabort: null
onerror: null
onload: null
ontimeout: null
onloadend: null
addEventListener: function addEventListener() { [native code] }
dispatchEvent: function dispatchEvent() { [native code] }
removeEventListener: function removeEventListener() { [native code] }

Hi @stevedesignerd :wave:

It looks like you reached your rate limits. The limit is 10 mails / hour / user / project.

We can increase this for you but you’d need to reach out to @Slavo to discuss your needs & the additional cost attached.

Otherwise, we’d recommend using your own emailing service through your backend. We discuss the Sendgrid + Xano combo in our user docs on creating a “forgot password” flow.

Hi Joyce that’s odd because I haven’t use the mail plugin before and I’m only creating a workflow that sends a single email but it’s not working.

That’s what the error message suggests. Any chance you tested the workflow 10+ times in a row?

Feel free to report a bug here so we can investigate further if you think that can’t be the reason. Maybe wait a few hours without testing the workflow just to make sure.

Hi @Joyce, may I ask about the Xano + Sendgrid combo you suggest? Is it also possible to do the combo with Supabase + Sendgrid?

Thank you.

1 Like

Hi @JamesPan :wave:

I’m sure you can set up a Supabase + Sendgrid combo, yes. In fact, you should be able to set up any backend + email provider combo. Not sure how “no-code” it will be though :confused:

To set up Supabase + Sendgrid specifically, I would recommend looking into:

I use postmark + supabase. I send all my emails from edge functions so I can use custom templates.

1 Like

Thank you, both @Joyce and @jaredgibb, for your answers. :pray: But it seems like both options are a bit out of my league at the moment, so let me focus on different aspects of the website first and come back later regarding the email aspect when I have more time to get deeper into it.

1 Like

Sounds like a plan!

Don’t hesitate to reach out if you need help when you get there :slight_smile:

1 Like

Thank you! :pray: Yes, I will!

1 Like

@stevedesignerd did you find the source of the issue? or was it actually a bug? am experiencing the same

Hey for me it was a bug. I created another project and test it from scratch and it worked