douxi7219 2018-02-08 17:15
浏览 100

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

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
","From: Server
" + "To: customermail@yahoo.in
" + "Subject: Last Saved on
"+"
",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.")

}

am trying to send 4 text files last line by email every 5 sec but result like this email sending 4 times. each file data separately :
last saved data from datafiles
sys1 last scan 2018-02-08 15:30:00
Mail Sent.
last saved data from datafiles
sys2 last scan 2018-02-08 15:35:00
Mail Sent.
last saved data from datafiles
sys3 last scan 2018-02-08 15:56:00
Mail Sent.
last saved data from datafiles
sys4 last scan 2018-02-08 15:30:00
Mail Sent.

but i want send email for 4 files last lines at once in one mail like this:
last saved data from datafiles
sys1 last scan 2018-02-08 15:30:00
sys2 last scan 2018-02-08 15:35:00
sys3 last scan 2018-02-08 15:56:00
sys4 last scan 2018-02-08 15:30:00
Mail Sent.

any suggestions plz.

  • 写回答

1条回答 默认 最新

  • doudian6229 2018-02-08 18:25
    关注

    You should separate the reading part from the sending logic, here you have a working example of what I mean:

    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("
    ")
        }
    
        return buff.String(), nil
    }
    
    func sendEmail(str string) error {
        log.Printf("
    Mail Sent with:
    ---
    %v
    ---
    
    ", str)
        return nil
    }
    

    One big caveat: Last line of all files should be the same length.

    评论

报告相同问题?

悬赏问题

  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 arduino控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题