使用Golang API发送邮件的实现方法

使用Golang API发送邮件的实现方法 我有一些JavaScript代码,想通过Go的Gin框架发送邮件,你有什么想法可以实现这个功能吗?

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style.css">
    
</head>
<body>
    <div id="overlay">
        <form onsubmit="event.preventDefault(); validateForm()">
        <h1>Contact Us</h1>
        <label for="name"> Name:</label>
        <input type="text" id="name" placeholder="Your name">
        <small class="error"></small>
        
        <label for="email"> Email: </label>
        <input type="text" id="email" placeholder="Your email">
        <small class="error"></small>
        <label for="message">Message:</label>
        <textarea id="message" placeholder="Your message" rows="6"></textarea>
        <small class="error"></small>
        <div class="center">
            <input type="submit" value="Send Message">
            <p id="success"></p>
            </div> 
        
            
        </form>
        </div>
          
<script src="script.js"></script>
</body>
</html>

script.js

const nameInput = document.querySelector("#name");
const email = document.querySelector("#email");
const message = document.querySelector("#message");
const success = document.querySelector("#success");
const errorNodes = document.querySelectorAll(".error");
// Validate data
function validateForm() {
       
      clearMessages();
      let errorFlang=false;      

    if (nameInput.value.length < 1) {
        errorNodes[0].innerText = "lütfen adınızı girirniz";
        nameInput.classList.add("error-border");
        errorFlang=true;
    }
    if (!emailIsValid(email.value)) {
        errorNodes[1].innerText = "lütfen mail adresi giriniz";
        nameInput.classList.add("error-border");
        errorFlang=true;
    }

    if (message.value.length < 1) {
        errorNodes[2].innerText = "lütfen mesajınızı giriniz";
        message.classList.add("error-border");
        errorFlang=true;
    }
    if (!errorFlag) {
        success.innerText="başarılı";
    }
}
// Clear error / success messages
function clearMessages() {
    for (let i = 0; i < errorNodes.length; i++) {
        errorNodes[i].innerText = "";
    }
    success.innerText="";
    nameInput.classList.remove("error-border");
    email.classList.remove("error-border");
    message.classList.remove("error-border");
}

// Check if email is valid
function emailIsValid(email) {
    let pattern = /\S+@\S+\.\S+/;
    return pattern.test(email);
}

更多关于使用Golang API发送邮件的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

更多关于使用Golang API发送邮件的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 NewSMTPClient 函数创建一个 STMPClient 对象。… 使用 NewMSG 创建一封新的电子邮件。… 之后,您需要使用 server 连接到 SMTP 服务器。… 连接成功后,只需使用 email 函数发送电子邮件(或您想要发送的所有电子邮件)。 更多详情请访问我的网站

https://frencoltd.com/seo-consultant-services/

package main

import (
    "fmt"
    "net/http"
    "net/smtp"
    "github.com/gin-gonic/gin"
)

type ContactForm struct {
    Name    string `json:"name" binding:"required"`
    Email   string `json:"email" binding:"required,email"`
    Message string `json:"message" binding:"required"`
}

func main() {
    r := gin.Default()
    
    // 静态文件服务
    r.Static("/static", "./static")
    r.LoadHTMLGlob("templates/*")
    
    r.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.html", nil)
    })
    
    // 邮件发送API端点
    r.POST("/send-email", sendEmailHandler)
    
    r.Run(":8080")
}

func sendEmailHandler(c *gin.Context) {
    var form ContactForm
    
    if err := c.ShouldBindJSON(&form); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": "无效的表单数据",
            "details": err.Error(),
        })
        return
    }
    
    // 配置SMTP
    smtpHost := "smtp.gmail.com"
    smtpPort := "587"
    from := "your-email@gmail.com"
    password := "your-app-password" // 使用应用专用密码
    to := []string{"recipient@example.com"}
    
    // 邮件内容
    subject := "新联系表单提交"
    body := fmt.Sprintf("姓名: %s\n邮箱: %s\n\n消息:\n%s", 
        form.Name, form.Email, form.Message)
    
    msg := []byte("To: " + to[0] + "\r\n" +
        "Subject: " + subject + "\r\n" +
        "\r\n" + body + "\r\n")
    
    // 认证并发送
    auth := smtp.PlainAuth("", from, password, smtpHost)
    err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg)
    
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": "邮件发送失败",
            "details": err.Error(),
        })
        return
    }
    
    c.JSON(http.StatusOK, gin.H{
        "success": true,
        "message": "邮件发送成功",
    })
}
// script.js 更新部分
function validateForm() {
    clearMessages();
    let errorFlag = false;
    
    if (nameInput.value.length < 1) {
        errorNodes[0].innerText = "lütfen adınızı girirniz";
        nameInput.classList.add("error-border");
        errorFlag = true;
    }
    
    if (!emailIsValid(email.value)) {
        errorNodes[1].innerText = "lütfen mail adresi giriniz";
        email.classList.add("error-border");
        errorFlag = true;
    }
    
    if (message.value.length < 1) {
        errorNodes[2].innerText = "lütfen mesajınızı giriniz";
        message.classList.add("error-border");
        errorFlag = true;
    }
    
    if (!errorFlag) {
        sendToBackend();
    }
}

async function sendToBackend() {
    const formData = {
        name: nameInput.value,
        email: email.value,
        message: message.value
    };
    
    try {
        const response = await fetch('/send-email', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(formData)
        });
        
        const result = await response.json();
        
        if (response.ok) {
            success.innerText = "Mesaj başarıyla gönderildi!";
            clearForm();
        } else {
            success.innerText = "Hata: " + result.error;
        }
    } catch (error) {
        success.innerText = "Bağlantı hatası: " + error.message;
    }
}

function clearForm() {
    nameInput.value = "";
    email.value = "";
    message.value = "";
}
<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Contact Form</title>
</head>
<body>
    <div id="overlay">
        <form onsubmit="event.preventDefault(); validateForm()">
            <h1>Contact Us</h1>
            <label for="name">Name:</label>
            <input type="text" id="name" placeholder="Your name">
            <small class="error"></small>
            
            <label for="email">Email:</label>
            <input type="text" id="email" placeholder="Your email">
            <small class="error"></small>
            
            <label for="message">Message:</label>
            <textarea id="message" placeholder="Your message" rows="6"></textarea>
            <small class="error"></small>
            
            <div class="center">
                <input type="submit" value="Send Message">
                <p id="success"></p>
            </div>
        </form>
    </div>
    
    <script src="/static/script.js"></script>
</body>
</html>
// 使用gomail库的替代方案
package main

import (
    "github.com/gin-gonic/gin"
    "gopkg.in/gomail.v2"
)

func sendEmailWithGomail(c *gin.Context) {
    var form ContactForm
    
    if err := c.ShouldBindJSON(&form); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    
    m := gomail.NewMessage()
    m.SetHeader("From", "sender@example.com")
    m.SetHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "New Contact Form Submission")
    m.SetBody("text/plain", 
        fmt.Sprintf("Name: %s\nEmail: %s\nMessage: %s", 
            form.Name, form.Email, form.Message))
    
    d := gomail.NewDialer("smtp.gmail.com", 587, 
        "your-email@gmail.com", "your-password")
    
    if err := d.DialAndSend(m); err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
        return
    }
    
    c.JSON(http.StatusOK, gin.H{"message": "Email sent successfully"})
}
回到顶部