netoik-home/back/pkg/contact/contact.go

98 lines
2.5 KiB
Go

package contact
import (
"encoding/json"
"errors"
"fmt"
"github.com/dchest/captcha"
"gopkg.in/gomail.v2"
"net/http"
"netoik.io/netoik-website/pkg/api"
"netoik.io/netoik-website/pkg/conf"
"os"
"path/filepath"
)
type request struct {
Name string `json:"name"`
Email string `json:"email"`
Phone string `json:"phone"`
Company string `json:"company"`
Message string `json:"message"`
CaptchaId string `json:"captchaId"`
CaptchaDigits string `json:"captchaDigits"`
}
func HandleSend(w http.ResponseWriter, r *http.Request) {
// Check method
if r.Method != "POST" {
api.Reply(w, 405, api.Answer{})
return
}
// Parse json from request body
var data request
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
api.Reply(w, 400, api.Answer{})
return
}
if data.Name == "" || len(data.Name) > 200 {
api.Reply(w, 400, api.Answer{})
return
}
if data.Email == "" || len(data.Email) > 200 {
api.Reply(w, 400, api.Answer{})
return
}
if len(data.Phone) > 200 {
api.Reply(w, 400, api.Answer{})
return
}
if len(data.Company) > 200 {
api.Reply(w, 400, api.Answer{})
return
}
if data.Message == "" || len(data.Message) > 10000 {
api.Reply(w, 400, api.Answer{})
return
}
if data.CaptchaId == "" {
api.Reply(w, 400, api.Answer{})
return
}
if data.CaptchaDigits == "" {
api.Reply(w, 400, api.Answer{})
return
}
// Check captcha digits
if !captcha.VerifyString(data.CaptchaId, data.CaptchaDigits) {
api.Reply(w, 418, api.Answer{})
return
}
// Captcha has been verified, so remove image
path := filepath.Join(conf.Conf.CaptchaDirectory, data.CaptchaId+".png")
if err := os.Remove(path); err != nil && !errors.Is(err, os.ErrNotExist) {
fmt.Fprintf(os.Stderr, "ERROR: cannot remove captcha image %q: %s", path, err.Error())
}
// Build email
msg := gomail.NewMessage()
msg.SetHeader("From", conf.Conf.SMTPUsername)
msg.SetHeader("To", conf.Conf.SMTPReceiver)
msg.SetHeader("Subject", "Message from www.netoik.io")
msg.SetBody("text/plain", fmt.Sprintf(
"You have received a message from frontend.\nname: %s\nemail: %s\nphone: %s\ncompany: %s\n%s",
data.Name, data.Email, data.Phone, data.Company, data.Message))
// Configure SMTP dialer and send email
dialer := gomail.NewDialer(conf.Conf.SMTPHost, conf.Conf.SMTPPort, conf.Conf.SMTPUsername, conf.Conf.SMTPPassword)
if err := dialer.DialAndSend(msg); err != nil {
fmt.Fprintf(os.Stderr, "cannot send email: %s\n", err.Error())
api.Reply(w, 400, api.Answer{})
return
}
api.Reply(w, 200, api.Answer{Success: true})
}