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: [email protected]\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.")
}
我试图每5秒通过电子邮件最后一行发送4个文本文件,但结果类似此电子邮件发送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 (
"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
}
一个重要的警告:所有文件的最后一行应具有相同的长度。
关于email - 如何读取多个文本文件并通过重复间隔5秒通过电子邮件发送每个文件的最后一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48691186/