Go Web API для отправки писем через контактную форму

Я играл с 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)
    }
}

Я ценю любые отзывы! Спасибо!

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *