GoLang:无法发送带附件的电子邮件

问题描述 投票:0回答:1

我正在尝试使用以下代码发送带有附件的电子邮件:

package mail

import (
    "bytes"
    logging "project/logging"
    "fmt"
    "log"
    "mime/multipart"
    "net/textproto"

    "gopkg.in/mail.v2"
)

func SendWithAttachment(from string, to []string, subject, bodyHTML string, attachmentName string, attachmentData []byte) error {
    logoURL := "/path/to/cs.jpg"
    m := mail.NewMessage()
    m.SetHeader("From", from)
    m.SetHeader("To", to...)
    m.SetHeader("Subject", subject)
    m.Embed(logoURL)

    // Create a multipart message
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)

    // Add HTML part
    htmlPart := make(textproto.MIMEHeader)
    htmlPart.Set("Content-Type", "text/html")
    htmlPart.Set("Content-Transfer-Encoding", "quoted-printable")
    htmlPartWriter, err := writer.CreatePart(htmlPart)
    if err != nil {
        logging.NewDefaultLogger().Errorf("Error creating html part: %s", err)
        return err
    }
    htmlPartWriter.Write([]byte(bodyHTML))

    // Add Attachment part
    attachmentPart := make(textproto.MIMEHeader)
    attachmentPart.Set("Content-Type", "application/octet-stream")
    attachmentPart.Set("Content-Transfer-Encoding", "base64")
    attachmentPart.Set("Content-Disposition", `attachment; filename="`+attachmentName+`"`)
    attachmentPartWriter, err := writer.CreatePart(attachmentPart)
    if err != nil {
        logging.NewDefaultLogger().Errorf("Error creating attachment part: %s", err)
        return err
    }
    attachmentPartWriter.Write(attachmentData)

    writer.Close()

    m.SetBody("multipart/mixed", body.String())

    fmt.Printf("Sending mail.....")
    err = gs.dialer.DialAndSend(m)
    if err != nil {
        logging.NewDefaultLogger().Errorf("Error sending email..: %s", err)
        return err
    }
    return nil
}

正文内容和附件内容均作为附件出现在名为“noname”的文件中。

附件文件内容如下:

--d885a04b467ae7d6100eb844c09574a6bdaef0a9796dc6fdde03a90613c9 内容传输编码:引用可打印 内容类型:text/html

... --d885a04b467ae7d6100eb844c09574a6bdaef0a9796dc6fdde03a90613c9 内容处置:附件;文件名=“resource_details.csv” 内容传输编码:base64 内容类型:应用程序/八位字节流

附件内容..

--d885a04b467ae7d6100eb844c09574a6bdaef0a9796dc6fdde03a90613c9--

go email
1个回答
0
投票

尝试这个代码:

package mail

import (
    "bytes"
    "fmt"
    "mime/multipart"
    "net/smtp"
    "net/textproto"
)

func SendWithAttachment(from string, to []string, subject, bodyHTML string, attachmentName string, attachmentData []byte) error {
    m := NewMessage()
    m.SetHeader("From", from)
    m.SetHeader("To", to...)
    m.SetHeader("Subject", subject)

    // Create a multipart message
    body := &bytes.Buffer{}
    writer := multipart.NewWriter(body)

    // Set the boundary string for both the outer and attachment parts
    boundary := writer.Boundary()
    m.SetHeader("Content-Type", "multipart/mixed; boundary="+boundary)

    // Add HTML part
    htmlPart := make(textproto.MIMEHeader)
    htmlPart.Set("Content-Type", "text/html; charset=utf-8")
    htmlPartWriter, err := writer.CreatePart(htmlPart)
    if err != nil {
        return err
    }
    htmlPartWriter.Write([]byte(bodyHTML))

    // Add Attachment part
    attachmentPart := make(textproto.MIMEHeader)
    attachmentPart.Set("Content-Type", "application/octet-stream")
    attachmentPart.Set("Content-Disposition", `attachment; filename="`+attachmentName+`"`)
    attachmentPartWriter, err := writer.CreatePart(attachmentPart)
    if err != nil {
        return err
    }
    attachmentPartWriter.Write(attachmentData)

    writer.Close()

    // Send the email
    auth := smtp.PlainAuth("", "[email protected]", "your_password", "smtp.example.com")
    err = smtp.SendMail("smtp.example.com:587", auth, from, to, body.Bytes())
    if err != nil {
        return err
    }
    return nil
}

导入 net/smtp 包而不是 gopkg.in/mail.v2 包以使用 SMTP 发送电子邮件。 另外,您应该包含一个具有适当 src 属性的标签。

© www.soinside.com 2019 - 2024. All rights reserved.