Golang中如何在smtp.SendMail添加变量

Golang中如何在smtp.SendMail添加变量 我已经成功将网页表单数据发送到Go后端。除了整合发件人邮箱外,其他功能都运行正常。

手动输入时没有问题:

msg := []byte(“From: sender@example.com\r\n” +

但尝试添加变量时会出现错误:

msg := []byte("From: " + (mail) + “\r\n” +

func Send(form url.Values) {

var mail string

for key, values := range form {
	for _, value := range values {
		switch key {
		case "mail":
			mail = value
		default:
			fmt.Println(key, value)
		}

	}
}

fmt.Println(mail) <----- 打印的值是正确的

auth := smtp.PlainAuth("", "sibert@gmail.com", "password", "smtp@gmail.com")
from := (mail)
to := []string{"support@example.com"}
msg := []byte((mail) + <----------------- 这里导致错误
	"To: support@company.com\r\n" +
	"Subject: subject\r\n" +
	"\r\n" +
	(mail)) <----- 传输的值是正确的
err := smtp.SendMail("smtp.gmail.com:587", auth, from, to, msg)
if err != nil {
	log.Fatal(err)
}
}

有什么建议如何使用变量"mail"来发送表单值吗?


更多关于Golang中如何在smtp.SendMail添加变量的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

from 的值是什么?错误信息是?

更多关于Golang中如何在smtp.SendMail添加变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Yamil_Bracho:

from 的值是多少?错误信息是什么?

url.Values。Golang 崩溃了,

url.Values 是类型,而不是 form 的值。

"Golang 崩溃"意味着 go 编译器在您能够运行程序之前就崩溃了。但很可能您能够运行程序,只是程序崩溃了。运行时可能会提供一个堆栈跟踪,它看起来是什么样的?

Sibert:

msg := []byte("From: " + (mail) + “\r\n” +

这个语法解决了实际问题——即不使用括号:

msg := []byte("From: " + mail + “\r\n” +

msg := []byte("From: " + mail + "\r\n" +

问题在于邮件消息格式不正确。当使用变量构建邮件头时,需要确保遵循正确的SMTP邮件格式规范。以下是修正后的代码:

func Send(form url.Values) {
    var mail string

    for key, values := range form {
        for _, value := range values {
            switch key {
            case "mail":
                mail = value
            default:
                fmt.Println(key, value)
            }
        }
    }

    fmt.Println(mail) // 打印的值是正确的

    auth := smtp.PlainAuth("", "sibert@gmail.com", "password", "smtp.gmail.com")
    from := mail
    to := []string{"support@example.com"}
    
    // 正确的邮件消息格式
    msg := []byte("From: " + mail + "\r\n" +
        "To: support@example.com\r\n" +
        "Subject: subject\r\n" +
        "\r\n" +
        "Email from: " + mail + "\r\n")
    
    err := smtp.SendMail("smtp.gmail.com:587", auth, from, to, msg)
    if err != nil {
        log.Fatal(err)
    }
}

关键修正点:

  1. 在邮件头中明确指定 From: 字段
  2. 确保每个邮件头行以 \r\n 结尾
  3. 邮件头和邮件体之间用空行分隔(\r\n\r\n

如果需要更复杂的邮件格式,可以使用 mimenet/mail 包:

import (
    "net/mail"
    "mime"
    "bytes"
)

func SendWithMIME(form url.Values) {
    var mail string

    for key, values := range form {
        for _, value := range values {
            switch key {
            case "mail":
                mail = value
            default:
                fmt.Println(key, value)
            }
        }
    }

    // 使用mime格式构建邮件
    var msg bytes.Buffer
    msg.WriteString("From: " + mime.QEncoding.Encode("utf-8", mail) + "\r\n")
    msg.WriteString("To: support@example.com\r\n")
    msg.WriteString("Subject: subject\r\n")
    msg.WriteString("MIME-Version: 1.0\r\n")
    msg.WriteString("Content-Type: text/plain; charset=\"utf-8\"\r\n")
    msg.WriteString("\r\n")
    msg.WriteString("Email from: " + mail + "\r\n")

    auth := smtp.PlainAuth("", "sibert@gmail.com", "password", "smtp.gmail.com")
    from := mail
    to := []string{"support@example.com"}
    
    err := smtp.SendMail("smtp.gmail.com:587", auth, from, to, msg.Bytes())
    if err != nil {
        log.Fatal(err)
    }
}
回到顶部