加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[Go] 并发imap收信

发布时间:2021-05-21 06:46:43 所属栏目:大数据 来源: https://www.jb51.cc
导读:并发数太大会直接死,这里有时候需要多试几次 package mainimport ( " flag " fmt io/IoUtil log math os sync " github.com/emersion/go-imap github.com/emersion/go-imap/client " )var ( server,email,password string workernum int imapClient * client

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

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 (编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读