使用Golang从网站发送邮件的实现方法
使用Golang从网站发送邮件的实现方法 我使用 Golang 作为“网络服务器”,并采用纯 HTML、CSS 和 JavaScript 完成了一个初步设计。这比我想象的要复杂一些,但主要目标是追求速度。
但我不知道如何通过网站发送电子邮件。
http://94.237.25.207:7070/contact
是否可以将
<form action="action_page.php">
替换为
<form action="action_page.go">
先谢过
6 回复
相关帖子在 StackOverflow 上:
当你在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, "消息已发送!")
}
关键点:
- HTML表单的
action指向Golang HTTP端点(如/submit) - 使用Golang的
net/smtp包或第三方库处理邮件发送 - 需要配置正确的SMTP服务器信息
- 对于Gmail,需要使用应用专用密码而非常规密码
记得安装gomail库(如果使用):
go get gopkg.in/gomail.v2


