[Go] 并发imap收信

前端之家收集整理的这篇文章主要介绍了[Go] 并发imap收信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

并发数太大会直接死,这里有时候需要多试几次

package main

import (
    "flag"
    fmtio/IoUtillogmathossync"

    github.com/emersion/go-imapgithub.com/emersion/go-imap/client"
)

var (
    server,email,password string
    workernum               int
    imapClient              *client.Client
    mailDirs                []
    mailSumNums             uint32
    pagesize                int = 50
    start                   
    stop                    
)

type Pool struct {
    workerNum 
    road      chan *Car
    wg        sync.WaitGroup
}

//初始化这个对象
func NewPool(wn int) *Pool {
    return &Pool{workerNum: wn,road: make(chan *Car)}
}

往channel添加具体任务
func (p *Pool) AddCar(f *Car) {
    p.road <- f
}

goroutine去工作
func (p *Pool) work(workId ) {
    for f := range p.road {
        log.Println(workId:",workId,start)
        f.do()
        log.Println(done)
    }
    p.wg.Done()
}

创建goroutine等着接工作
func (p *Pool) Run() {
    for i := 0; i < p.workerNum; i++ {
        go p.work(i)
        p.wg.Add(1)
    }
    p.wg.Wait()
}

func (p *Pool) colse() {
    close(p.road)
}

var pool = NewPool(5)

func main() {
    go handleMail()
    pool.Run()
}
func handleMail() {
    获取命令行参数
    flag.StringVar(&server,1)">server"",1)">imap服务地址(包含端口))
    flag.StringVar(&email,1)">email邮箱名)
    flag.StringVar(&password,1)">password密码)
    flag.Parse()
    if flag.NFlag() < 3 {
        flag.PrintDefaults()
        os.Exit()
    }
    if server == "" || email == "" || password == "" {
        log.Fatal(服务器地址,用户名,密码,参数错误连接imap服务
    imapClient,err := client.Dial(server)
    if err != nil {
        log.Fatal(err)
    }
    登陆
    if err := imapClient.Login(email,password); err !=创建邮件夹目录
    os.Mkdir(email,os.ModePerm)
    mailBoxes := make(chan *imap.MailBoxInfo,1)">20)
    go func() {
        imapClient.List(*,mailBoxes)
    }()
    列取邮件
    for m := range mailBoxes {
        mailDirs = append(mailDirs,m.Name)
    }
    循环邮件夹,创建邮件夹目录
    for _,mailDir := range mailDirs {
        选中每个邮件
        mBox,err := imapClient.Select(mailDir,false)
         nil {
            log.Fatal(err)
        }
        mailDirNums := mBox.Messages
        log.Printf(%s : %dfmt.Sprintf(%s/%s        os.Mkdir(fileDir,os.ModePerm)
        mailSumNums += mailDirNums
    }
    log.Printf(邮件数 : %d邮件夹中的邮件

     nil {
            log.Fatal(err)
        }
        if mBox.Messages == 0{
            continue
        }
        循环该邮件夹中的邮件
        pagecount := int(math.Ceil(float64(mBox.Messages) / float64(pagesize)))
        1; i <= pagecount; i++ {
            if i ==  {
                start = 
            } else {
                start = (i-1)*pagesize + 
            }
            stop = i * pagesize
            if stop > (mBox.Messages) {
                stop = (mBox.Messages)
            }
            car := Car{
                start:      start,stop:       stop,mailDir:    mailDir,imapClient: imapClient,}
            pool.AddCar(&car)
        }
    }
    pool.colse()
}

/*具体做的事通过这个来传递*/
type Car struct {
    start,stop 
    mailDir     
    imapClient  *client.Client
}

具体做事
func (c *Car) () error {
    seqset := new(imap.SeqSet)
    seqset.AddRange(uint32(c.start),uint32(c.stop))
    section := &imap.BodySectionName{}
    items := []imap.FetchItem{section.FetchItem()}

    messages := imap.Message,pagesize)
    go func() {
        c.imapClient.Fetch(seqset,items,messages)
    }()

    for msg := range messages {
        mailFile := %s/%s/%d.eml msg.GetBody(section)
        if r != nil {
            body,_ := IoUtil.ReadAll(r)
            f,_ := os.OpenFile(mailFile,os.O_RDWR|os.O_CREATE,1)">0766)
            f.Write(body)
            f.Close()
            log.Printf(%s :第 %d 

猜你在找的Go相关文章