使用Golang从网站发送邮件的实现方法

使用Golang从网站发送邮件的实现方法 我使用 Golang 作为“网络服务器”,并采用纯 HTML、CSS 和 JavaScript 完成了一个初步设计。这比我想象的要复杂一些,但主要目标是追求速度。

但我不知道如何通过网站发送电子邮件。

http://94.237.25.207:7070/contact

是否可以将

<form action="action_page.php">

替换为

<form action="action_page.go">

先谢过

6 回复

谢谢。有没有展示这个的例子或链接?

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


您可以设置一个URL端点,通过POST请求发送表单数据,该URL的处理程序将完成其余工作。

当你在URL中看到"/contact"时是如何渲染联系页面的?用同样的方式处理,但在返回HTML之前执行操作,根据邮件是否成功发送,向你的contact.html模板发送一些消息,并再次显示带有该消息的联系页面

我在项目中使用了gopkg.in/gomail.v2来发送邮件。这里有一个使用表单字段的示例

在Golang中实现从网站发送邮件是一个常见的需求。你不能直接将HTML表单的action指向.go文件,但可以通过Golang的HTTP处理器来处理表单提交并发送邮件。

以下是完整的实现示例:

首先,创建处理表单提交的Golang HTTP处理器:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/smtp"
    "html/template"
)

// 邮件配置
const (
    smtpHost     = "smtp.gmail.com"
    smtpPort     = "587"
    fromEmail    = "your-email@gmail.com"
    fromPassword = "your-app-password"
)

type ContactForm struct {
    Name    string
    Email   string
    Message string
}

func contactHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method == "GET" {
        // 显示联系表单
        tmpl := template.Must(template.ParseFiles("contact.html"))
        tmpl.Execute(w, nil)
        return
    }
    
    if r.Method == "POST" {
        // 处理表单提交
        err := r.ParseForm()
        if err != nil {
            http.Error(w, "无法解析表单", http.StatusBadRequest)
            return
        }
        
        form := ContactForm{
            Name:    r.FormValue("name"),
            Email:   r.FormValue("email"),
            Message: r.FormValue("message"),
        }
        
        // 发送邮件
        err = sendEmail(form)
        if err != nil {
            log.Printf("发送邮件失败: %v", err)
            http.Error(w, "发送邮件失败", http.StatusInternalServerError)
            return
        }
        
        fmt.Fprintf(w, "邮件发送成功!")
    }
}

func sendEmail(form ContactForm) error {
    // 邮件内容
    subject := "来自网站的联系表单"
    body := fmt.Sprintf("姓名: %s\n邮箱: %s\n\n消息:\n%s", 
        form.Name, form.Email, form.Message)
    
    msg := "From: " + fromEmail + "\n" +
        "To: " + fromEmail + "\n" +
        "Subject: " + subject + "\n\n" +
        body
    
    // SMTP认证
    auth := smtp.PlainAuth("", fromEmail, fromPassword, smtpHost)
    
    // 发送邮件
    err := smtp.SendMail(smtpHost+":"+smtpPort, auth, fromEmail, 
        []string{fromEmail}, []byte(msg))
    
    return err
}

func main() {
    http.HandleFunc("/contact", contactHandler)
    http.HandleFunc("/submit", contactHandler) // 表单提交端点
    
    log.Println("服务器启动在 :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

对应的HTML表单 (contact.html):

<!DOCTYPE html>
<html>
<head>
    <title>联系我们</title>
</head>
<body>
    <h1>联系我们</h1>
    <form method="POST" action="/submit">
        <div>
            <label for="name">姓名:</label>
            <input type="text" id="name" name="name" required>
        </div>
        <div>
            <label for="email">邮箱:</label>
            <input type="email" id="email" name="email" required>
        </div>
        <div>
            <label for="message">消息:</label>
            <textarea id="message" name="message" rows="4" required></textarea>
        </div>
        <button type="submit">发送</button>
    </form>
</body>
</html>

如果你想要更简洁的实现,可以使用第三方邮件库:

package main

import (
    "fmt"
    "log"
    "net/http"
    "github.com/go-gomail/gomail"
)

func simpleContactHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != "POST" {
        http.Error(w, "方法不允许", http.StatusMethodNotAllowed)
        return
    }
    
    r.ParseForm()
    
    // 使用gomail发送邮件
    m := gomail.NewMessage()
    m.SetHeader("From", "your-email@gmail.com")
    m.SetHeader("To", "recipient@example.com")
    m.SetHeader("Subject", "网站联系表单")
    m.SetBody("text/plain", 
        fmt.Sprintf("姓名: %s\n邮箱: %s\n消息: %s",
            r.FormValue("name"),
            r.FormValue("email"), 
            r.FormValue("message")))
    
    d := gomail.NewDialer("smtp.gmail.com", 587, 
        "your-email@gmail.com", "your-app-password")
    
    if err := d.DialAndSend(m); err != nil {
        log.Printf("发送失败: %v", err)
        http.Error(w, "发送失败", http.StatusInternalServerError)
        return
    }
    
    fmt.Fprintf(w, "消息已发送!")
}

关键点:

  1. HTML表单的action指向Golang HTTP端点(如/submit
  2. 使用Golang的net/smtp包或第三方库处理邮件发送
  3. 需要配置正确的SMTP服务器信息
  4. 对于Gmail,需要使用应用专用密码而非常规密码

记得安装gomail库(如果使用):

go get gopkg.in/gomail.v2
回到顶部