Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Email 如何读取多个文本文件并以5秒的重复间隔通过电子邮件发送每个文件的最后一行_Email_Go_Readfile - Fatal编程技术网

Email 如何读取多个文本文件并以5秒的重复间隔通过电子邮件发送每个文件的最后一行

Email 如何读取多个文本文件并以5秒的重复间隔通过电子邮件发送每个文件的最后一行,email,go,readfile,Email,Go,Readfile,我试图发送4个文本文件的最后一行通过电子邮件每5秒,但结果像这封电子邮件发送4次。每个文件分别提供数据: 上次从数据文件保存的数据 sys1最后一次扫描2018-02-08 15:30:00 已发送邮件。 上次从数据文件保存的数据 sys2最后一次扫描2018-02-08 15:35:00 已发送邮件。 上次从数据文件保存的数据 sys3最后一次扫描2018-02-08 15:56:00 已发送邮件。 上次从数据文件保存的数据 sys4最后一次扫描2018-02-08 15:30:00 已发送邮

我试图发送4个文本文件的最后一行通过电子邮件每5秒,但结果像这封电子邮件发送4次。每个文件分别提供数据:
上次从数据文件保存的数据
sys1最后一次扫描2018-02-08 15:30:00
已发送邮件。
上次从数据文件保存的数据
sys2最后一次扫描2018-02-08 15:35:00
已发送邮件。
上次从数据文件保存的数据
sys3最后一次扫描2018-02-08 15:56:00
已发送邮件。
上次从数据文件保存的数据
sys4最后一次扫描2018-02-08 15:30:00
已发送邮件。

但我想在一封邮件中同时发送4个文件的最后一行:
上次从数据文件保存的数据
sys1最后一次扫描2018-02-08 15:30:00
sys2最后一次扫描2018-02-08 15:35:00
sys3最后一次扫描2018-02-08 15:56:00
sys4最后一次扫描2018-02-08 15:30:00
邮件已发送


任何建议请参见。

您应该将阅读部分与发送逻辑分开,这里有一个我的意思的工作示例:

package main
import (
    "fmt"
    "os"
    "time"
    //"log"
    //"net/smtp"
)
const myfile1 = "data1.txt"
const myfile2 = "data2.txt"
const myfile3 = "data3.txt"
const myfile4 = "data4.txt"
func main() {
    c := time.Tick(5 * time.Second)
    for _ = range c {
        readLastLine(myfile1)
        readLastLine(myfile2)
        readLastLine(myfile3)
        readLastLine(myfile4)
    }
}
func readLastLine(fname string) {
    file, err := os.Open(fname)
    if err != nil {
        panic(err)
    }
    defer file.Close()
    fi, err := file.Stat()
    if err != nil {
        fmt.Println(err)
    }
    buf := make([]byte, 85)
    n, err := file.ReadAt(buf, fi.Size()-int64(len(buf)))
    if err != nil {
        fmt.Println(err)
    }
    buf = buf[:n]
    //fmt.Printf("%s", buf)

        mkey := fmt.Sprintf("%s %s\n","From: Server\r\n" + "To: customermail@yahoo.in\r\n" + "Subject: Last Saved on\r\n"+"\r\n",buf)
        auth := smtp.PlainAuth("","","","",)
        err = smtp.SendMail("",auth, "",[]string{""}, []byte(mkey),)
        if err != nil {log.Printf("smtp error: %s", err)
        return}
        log.Print("Mail Sent.")

}

有一个大警告:所有文件的最后一行长度应相同

我觉得这是一个巨大而脆弱的警告。为什么不改为在
\n
上执行ioutil.ReadAll并拆分?耶!但是ioutil.ReadAll会将整个文件加载到。无论如何,它与发送几封电子邮件无关,如果需要,您可以在readFile方法内部重构并实现另一种方法
package main

import (
    "bytes"
    "log"
    "os"
    "time"
)

var files = [2]string{
    "file1.txt",
    "file2.txt",
}

func main() {
    c := time.Tick(1 * time.Second)
    for range c {
        str, err := readFiles()
        if err != nil {
            panic(err)
        }

        err = sendEmail(str)
        if err != nil {
            panic(err)
        }
    }
}

func readFile(fname string) ([]byte, error) {
    file, err := os.Open(fname)
    if err != nil {
        return nil, err
    }
    defer file.Close()

    fi, err := file.Stat()
    if err != nil {
        return nil, err
    }

    buf := make([]byte, 34)
    n, err := file.ReadAt(buf, fi.Size()-int64(len(buf)))
    if err != nil {
        return nil, err
    }

    return buf[:n], nil
}

func readFiles() (string, error) {
    buff := new(bytes.Buffer)

    for _, fname := range files {
        l, err := readFile(fname)
        if err != nil {
            return "", err
        }
        buff.Write(l)
        // This prevents all logs to be in the same line.
        buff.WriteString("\n")
    }

    return buff.String(), nil
}

func sendEmail(str string) error {
    log.Printf("\nMail Sent with:\n---\n%v\n---\n\n", str)
    return nil
}