Golang - 管道到外部执行

我正在尝试使用 Go 将电子邮件消息通过管道发送到 sendmail 二进制文件。如果我没有取消对 Wait() 调用的注释,则以下代码有效。如果没有注释,程序就会挂起。阅读wait的文档,我觉得应该调用它,所以我得出结论,我的示例代码中存在错误。关于它可能是什么的任何建议?


package main


import (

        "io"

        "os"

        "os/exec"

        "fmt"

)


func main() {

        msg := "From: source@email.address\n"

        msg += "To: recipient@email.address\n"

        msg += "Subject: Testing\n\n"

        msg += "Hello World!\n"

        sendmail := exec.Command("/usr/sbin/sendmail", "-t")

        stdin, err := sendmail.StdinPipe()

        if err != nil {

                panic(err)

        }

        sendmail.Stdout = os.Stdout

        sendmail.Stderr = os.Stderr

        err = sendmail.Start()

        if err != nil {

                panic(err)

        }

        io.WriteString(stdin, msg)

        //err = sendmail.Wait()

        //if err != nil {

        //      panic(err)

        //}

}


阿晨1998
浏览 212回答 2
2回答

慕虎7371278

正在(可能)发生的是 sendmail 正在等待输入完成。要么在写入后关闭管道,要么(取决于 sendmail 版本和内容)尝试通过 ".\n" 作为消息的最后一部分完成发送(除了关闭输入之外,有些版本会接受它)。

大话西游666

永远永远永远永远不要在这里使用“-t”命令行选项。它会误投邮件,就像将邮件从邮件列表发送回邮件列表一样。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go