Golang - 管道到外部执行官

时间:2014-10-24 12:40:14

标签: go sendmail

我尝试使用Go将电子邮件传递给sendmail二进制文件。以下代码可用,但我不会取消对Wait()的调用。如果它已取消注释,程序将挂起。阅读documentation for 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)
        //}
}

2 个答案:

答案 0 :(得分:3)

发生的事情(可能)是sendmail正在等待输入完成。

在写完之后关闭管道或(取决于sendmail版本和东西)尝试完成发送通过"。\ n"作为消息的最后一部分(除了输入被关闭之外,某些版本将接受该消息)。

答案 1 :(得分:0)

永远不要使用" -t"命令行选项在这里。它将错误传递邮件,例如将邮件从邮件列表发送回邮件列表。