Я играл с Go и наконец нашел вариант использования небольшого веб-сервиса, который я мог бы создать.
Он принимает данные JSON через HTTP-запрос POST и отправляет мне электронное письмо через API Mailgun (оно используется для контактной формы на моем веб-сайте).
Я новичок в Go и хотел бы получить отзывы о том, что я мог бы сделать лучше, все, что я упустил, и где я мог бы добиться большего, следуя «методу Go». 🙂
main.go
package main
import (
"fmt"
"log"
"net/http"
"os"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
)
var mailgunDomain string = os.Getenv("MAILGUN_DOMAIN")
var mailgunAPIKey string = os.Getenv("MAILGUN_API_KEY")
var allowedOrigin string = os.Getenv("ALLOWED_ORIGIN")
var port string = os.Getenv("PORT")
func main() {
if port == "" {
panic("Missing environment variable PORT")
}
if mailgunDomain == "" {
panic("Missing environment variable MAILGUN_DOMAIN")
}
if mailgunAPIKey == "" {
panic("Missing environment variable MAILGUN_API_KEY")
}
if allowedOrigin == "" {
panic("Missing environment variable ALLOWED_ORIGIN")
}
r := mux.NewRouter()
r.Use(handlers.CORS(
handlers.AllowedHeaders([]string{"Content-Type"}),
handlers.AllowedOrigins([]string{allowedOrigin}),
))
r.HandleFunc("/", homeHandler).Methods("GET")
r.HandleFunc("/contact", HandleContact(mailgunDomain, mailgunAPIKey)).Methods("POST", "OPTIONS")
log.Fatal(http.ListenAndServe(":"+port, r))
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "API for maxschmitt.me")
}
contact.go
package main
import (
"context"
"encoding/json"
"fmt"
"net/http"
"os"
"time"
"github.com/mailgun/mailgun-go/v4"
)
var mailgunSender string = "email@sender.com"
var mailgunReceiver string = "email@receiver.com"
// HandleContact sends emails to me via the contact form
func HandleContact(mailgunDomain string, mailgunAPIKey string) http.HandlerFunc {
type body struct {
Name string `json:"name"`
Email string `json:"email"`
Message string `json:"message"`
}
mg := mailgun.NewMailgun(mailgunDomain, mailgunAPIKey)
mg.SetAPIBase(mailgun.APIBaseEU)
return func(w http.ResponseWriter, r *http.Request) {
var b body
err := json.NewDecoder(r.Body).Decode(&b)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
message := "From: " + b.Name + "<" + b.Email + ">nn"
message += b.Message
fmt.Fprintln(os.Stdout, "## New message!")
fmt.Fprintln(os.Stdout, message+"n")
mgMsg := mg.NewMessage(mailgunSender, "New contact form submission", message, mailgunReceiver)
mgMsg.SetReplyTo(b.Email)
// Create a 10s timeout for sending the message
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
resp, id, err := mg.Send(ctx, mgMsg)
if err != nil {
fmt.Println("Error sending contact form submission:")
fmt.Println(err)
http.Error(w, "Something went wrong", http.StatusInternalServerError)
return
}
fmt.Fprintln(os.Stdout, "Mailgun response:", resp)
fmt.Fprintln(os.Stdout, "Mailgun ID:", id)
json.NewEncoder(w).Encode(b)
}
}
Я ценю любые отзывы! Спасибо!
