Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

240
Views
React + EmailJS is sending me tons of emails in onClick method

I'm new to web development in general but I'm trying to create my own Contact page on my website and I'm having trouble. I'm using React, Gatsby, and Emailjs. I have my form set up so that the inputs are passed into the state onChange. Then I have a "send message" button that should send an email using EmailJS using the tokens and the state vars. This does all work and the email sends successfully, but it's sending dozens of emails. I believe what's happening is it's calling sendEmail every time the state is set and the DOM re-renders, or basically once for each character that's input into the fields, but I don't know why.

Bonus points if you can help me figure out why pressing the send message button also sends me to a 404 /# route on my site.

import React from 'react'
import emailjs from 'emailjs-com

class Main extends React.Component {

  constructor(){
    super()
    this.state = {
      fromName:'',
      message:'',
      fromEmail:''
    }
  }

  render() {
    return (
      <div ...
      >
        ...

        <article>
          ...
          <form method="post" action="#">
            <div className="field half first">
              <label htmlFor="name">Name</label>
              <input type="text" name="name" id="name" value={this.state.fromName} onChange={e => this.setState({fromName: e.target.value})}/>
            </div>
            <div className="field half">
              <label htmlFor="email">Email</label>
              <input type="text" name="email" id="email" value={this.state.fromEmail} onChange={e => this.setState({fromEmail: e.target.value})}/>
            </div>
            <div className="field">
              <label htmlFor="message">Message</label>
              <textarea name="message" id="message" rows="4" value={this.state.message} onChange={e => this.setState({message: e.target.value})}
                placeholder = "..."></textarea>
            </div>
            <ul className="actions">
              <li>
                <input type="submit" value="Send Message" className="special" onClick={this.sendEmail()}/>
              </li>
            </ul>
          </form>
        </article>
      </div>
    )
  }

  sendEmail() {
    const serviceId='...'
    const templateId='...'
    const userId='...'
    emailjs.send(serviceId, templateId, this.state, userId)
  }

}

export default Main
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

The issue is that you never followed the emailjs documentation well and you never prevented the default form action. According to the emailjs documentation you should have set the onClick function with the send email function (without invoking it) on the form's opening tag NOT on your submit button. (but the button is still necessary so that it can send the sign that the form needs to be submitted). You also invoked the sendEmail function which is inappropriate and leads to problems. You must also add event as a parameter in your sendEmail function when creating this function. Then inside the sendEmail function call the event.preventDefault() function .

import React from 'react'
import emailjs from 'emailjs-com

class Main extends React.Component {

  constructor(){
    super()
    this.state = {
      fromName:'',
      message:'',
      fromEmail:''
    }
  }

  render() {
    return (
      <div>
        <article>
          <form method="post" onClick={this.sendEmail} action="#">
            <div className="field half first">
              <label htmlFor="name">Name</label>
              <input type="text" name="name" id="name" value={this.state.fromName} onChange={e => this.setState({fromName: e.target.value})}/>
            </div>
            <div className="field half">
              <label htmlFor="email">Email</label>
              <input type="text" name="email" id="email" value={this.state.fromEmail} onChange={e => this.setState({fromEmail: e.target.value})}/>
            </div>
            <div className="field">
              <label htmlFor="message">Message</label>
              <textarea name="message" id="message" rows="4" value={this.state.message} onChange={e => this.setState({message: e.target.value})}
                placeholder = "..."></textarea>
            </div>
            <ul className="actions">
              <li>
                <input type="submit" value="Send Message" className="special"/>
              </li>
            </ul>
          </form>
        </article>
      </div>
    )
  }

  sendEmail(event) {
    event.preventDefault();
    const serviceId='...'
    const templateId='...'
    const userId='...'
    emailjs.send(serviceId, templateId, this.state, userId)
    .then((result) => {
        console.log(result.text);
    }, (error) => {
        console.log(error.text);
    });
  }

}

export default Main
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!