mirror of
https://github.com/Dvorinka/SendMail.git
synced 2026-06-04 00:52:56 +00:00
107 lines
2.9 KiB
Go
107 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"gopkg.in/gomail.v2"
|
|
)
|
|
|
|
type FormData struct {
|
|
Domain string `json:"domain"`
|
|
Name string `json:"name"`
|
|
Email string `json:"email"`
|
|
Subject string `json:"subject"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
type EmailConfig struct {
|
|
Email string
|
|
Password string
|
|
}
|
|
|
|
var domainMap = map[string]EmailConfig{
|
|
"tdvorak.dev": {"info@tdvorak.dev", "%8s3Yad*!b3*t"},
|
|
"vbly.org": {"info@vbly.org", "!N0^e0Q9k*mV"},
|
|
"sportcreative.eu": {"info@sportcreative.eu", "@dN$TZPgG5!"},
|
|
}
|
|
|
|
func sendHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
http.Error(w, "POST only", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
var data FormData
|
|
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
|
|
http.Error(w, "Invalid JSON", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
data.Domain = strings.ToLower(strings.TrimSpace(data.Domain))
|
|
config, ok := domainMap[data.Domain]
|
|
if !ok {
|
|
http.Error(w, "Unknown domain", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
|
|
m := gomail.NewMessage()
|
|
m.SetHeader("From", config.Email)
|
|
m.SetHeader("To", config.Email) // you can change this to forward to another inbox
|
|
m.SetHeader("Subject", data.Subject)
|
|
m.SetBody("text/plain", "Name: "+data.Name+"\nEmail: "+data.Email+"\n\n"+data.Message)
|
|
|
|
d := gomail.NewDialer("smtp.purelymail.com", 465, config.Email, config.Password)
|
|
d.SSL = true // Purelymail recommends SSL on port 465
|
|
|
|
if err := d.DialAndSend(m); err != nil {
|
|
log.Println("Email send error:", err)
|
|
http.Error(w, "Failed to send email", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Write([]byte("Email sent successfully"))
|
|
}
|
|
|
|
func enableCors(handler http.HandlerFunc) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
origin := r.Header.Get("Origin")
|
|
|
|
// Allow localhost development URLs
|
|
if strings.HasPrefix(origin, "http://localhost:") ||
|
|
strings.HasPrefix(origin, "http://127.0.0.1:") {
|
|
w.Header().Set("Access-Control-Allow-Origin", origin)
|
|
w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
|
|
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
|
|
} else {
|
|
// Check production domains
|
|
cleanOrigin := strings.TrimPrefix(strings.TrimPrefix(origin, "http://"), "https://")
|
|
cleanOrigin = strings.Split(cleanOrigin, "/")[0]
|
|
|
|
// Check if the origin's domain is in our domain map
|
|
_, allowed := domainMap[cleanOrigin]
|
|
if allowed {
|
|
w.Header().Set("Access-Control-Allow-Origin", origin)
|
|
w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS")
|
|
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
|
|
}
|
|
}
|
|
|
|
// Handle preflight requests
|
|
if r.Method == http.MethodOptions {
|
|
w.WriteHeader(http.StatusOK)
|
|
return
|
|
}
|
|
|
|
handler(w, r)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
http.HandleFunc("/send", enableCors(sendHandler))
|
|
log.Println("Server running on :8080")
|
|
log.Fatal(http.ListenAndServe(":8080", nil))
|
|
}
|