[Go] 并发imap收信
并发数太大会直接死,这里有时候需要多试几次
package main import (
"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.Client
mailDirs []string
mailSumNums uint32
pagesize int =
start int
stop int
) type Pool struct {
workerNum int
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 int) {
for f := range p.road {
log.Println("workId:", workId, "start")
f.do()
log.Println("workId:", workId, "done")
}
p.wg.Done()
} //创建goroutine等着接工作
func (p *Pool) Run() {
for i := ; i < p.workerNum; i++ {
go p.work(i)
p.wg.Add()
}
p.wg.Wait()
} func (p *Pool) colse() {
close(p.road)
} var pool = NewPool() func main() {
go handleMail()
pool.Run()
}
func handleMail() {
//获取命令行参数
flag.StringVar(&server, "server", "", "imap服务地址(包含端口)")
flag.StringVar(&email, "email", "", "邮箱名")
flag.StringVar(&password, "password", "", "密码")
flag.Parse()
if flag.NFlag() < {
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 != nil {
log.Fatal(err)
}
//创建邮件夹目录
os.Mkdir(email, os.ModePerm)
mailboxes := make(chan *imap.MailboxInfo, )
go func() {
imapClient.List("", "*", mailboxes)
}()
//列取邮件夹
for m := range mailboxes {
mailDirs = append(mailDirs, m.Name)
}
//循环邮件夹,创建邮件夹目录
for _, mailDir := range mailDirs {
//选中每个邮件夹
mbox, err := imapClient.Select(mailDir, false)
if err != nil {
log.Fatal(err)
}
mailDirNums := mbox.Messages
log.Printf("%s : %d", mailDir, mailDirNums)
fileDir := fmt.Sprintf("%s/%s", email, mailDir)
//创建邮件夹目录
os.Mkdir(fileDir, os.ModePerm)
mailSumNums += mailDirNums
}
log.Printf("总邮件数 : %d", mailSumNums)
//循环邮件夹,读取每个邮件夹中的邮件 for _, mailDir := range mailDirs {
//选中每个邮件夹
mbox, err := imapClient.Select(mailDir, false)
if err != nil {
log.Fatal(err)
}
if mbox.Messages == {
continue
}
//循环该邮件夹中的邮件
pagecount := int(math.Ceil(float64(mbox.Messages) / float64(pagesize)))
for i := ; i <= pagecount; i++ {
if i == {
start =
} else {
start = (i-)*pagesize +
}
stop = i * pagesize
if stop > int(mbox.Messages) {
stop = int(mbox.Messages)
}
car := Car{
start: start,
stop: stop,
mailDir: mailDir,
imapClient: imapClient,
}
pool.AddCar(&car)
}
}
pool.colse()
} /*具体做的事通过这个来传递*/
type Car struct {
start, stop int
mailDir string
imapClient *client.Client
} //具体做事
func (c *Car) do() error {
seqset := new(imap.SeqSet)
seqset.AddRange(uint32(c.start), uint32(c.stop))
section := &imap.BodySectionName{}
items := []imap.FetchItem{section.FetchItem()} messages := make(chan *imap.Message, pagesize)
go func() {
c.imapClient.Fetch(seqset, items, messages)
}() for msg := range messages {
mailFile := fmt.Sprintf("%s/%s/%d.eml", email, c.mailDir, msg.SeqNum)
r := msg.GetBody(section)
if r != nil {
body, _ := ioutil.ReadAll(r)
f, _ := os.OpenFile(mailFile, os.O_RDWR|os.O_CREATE, )
f.Write(body)
f.Close()
log.Printf("%s :第 %d ", c.mailDir, msg.SeqNum)
}
}
return nil
}
[Go] 并发imap收信的更多相关文章
- PostFix使用dovecot支持POP3/IMAP收信
PostFix只能够收发邮件,以及使用SMTP发送邮件,想要使用POP3/IMAP收信的话必须装其他软件,本文通过配置dovecot让邮件服务器支持POP3/IMAP收信.POP3/IMAP是一种收信 ...
- [Go] imap收信非并发
待修正 package main import ( "flag" "fmt" "io/ioutil" "log" &qu ...
- Loadrunner:POP3协议录制收信,使用foxmail录制到的脚本为空
以下录制方法使得录制到的脚本为空: (1)打开Virtual User Generator,点击“新建Vuser脚本”,在弹出的向导页面,选择“新建单协议脚本”,选择“POP3”协议,并确定 (2)在 ...
- openERP邮件(发信、收信)
openERP里的邮件处理主要有个2个模块处理 mail -核心 fetchmail -接收邮件 Alias domain和alias name 配置domain alias. Set ...
- Gmail 收信的一些规则
Gmail 收信的一些规则 用 apache+php+MDaemon 调试 mail2www 时,发往gmail的邮件失败, 提示: Our system detected an illegal at ...
- PHP IMAP收QQ邮件,SMTP存入另外QQ邮箱
作用,将qq1收到邮件,用qq2的账号.以qq0的为发件人身份放到qq2的邮箱. 什么样做这样一个功能,一个朋友要求的,她不告诉我为什么,好吧 <?php define('USER','xxx@ ...
- IMAP收邮件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 为什么我的outlook只能收信不能发信,发送测试电子邮件消息: 无法发送此邮件。请在帐户属性中验证电子邮件
链接地址:http://zhidao.baidu.com/link?url=aVIFo2aNLuHIZGZuEUataHkZp4XApHqyvbEK8ACHPhi3jwhGhM0GBAtm72AnsP ...
- outlook创建收信规则,将收到的所有邮件,转发到qq邮箱,然后删除
因为outlook默认只有400M的空间. 使用企业邮箱的时候,很快就满了. 本来是打算在qq邮箱中,添加其他邮箱来收取的. http://service.mail.qq.com/cgi-bin/he ...
随机推荐
- Dynamics 365应用程序池回收对连接造成的影响。
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- SQLi-LABS Page-3 (order by injections) Less-46-Less-53
关于order by 注入原理讲解 注入原理 1. 测试 ?sort=1 desc--+?sort=1 asc--+ 显示结果不同,说明可以注入 desc是 descend 降序意思 asc 是 as ...
- angularjs用回车键动态添加数据,同时渲染到页面
<script src="../../angular-1.5.5/angular.min.js"></script> <script> var ...
- MySQL基础之数据管理【5】
子查询的使用 select 字段名称 from tbl_name where col_name=(select col_name from tbl_name); --内层语句查询的结果可以作为外层语句 ...
- 【分享】nginx负载均衡全套视频教程
1.课件 百度网盘链接:https://pan.baidu.com/s/1On2oONVZmPwI9yIDekgRiA 提取码:c4fw 2.教程列表 3.教程下载 3.1.直接在线学习 ...
- django验证码captcha
官方文档 https://django-simple-captcha.readthedocs.io/en/latest/usage.html#installation 使用命令安装pip instal ...
- ubuntu 18.04下安装JDK
一.安装前检查 检查是否已经安装 java -version 二.安装方式 1)通过ppa(源) 2)通过官网安装包安装 JDK官网下载地址 或百度云下载地址,提取码 rzq5 三.安装步骤 (一 ...
- 渗透测试学习 二十九、kali安装,信息搜集,服务器扫描
kali安装,信息搜集,服务器扫描 kali介绍 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.由Offensive Security Ltd维护和资助.最先由 ...
- s3c2440裸机-UART编程(一、UART硬件介绍及传输原理)
1.uart硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter(异步收发器). uart主要用于: 1.打印调试 2.数据传输 串 ...
- itest(爱测试) 4.2.1 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 入选 2019 年度最受欢迎开源中国软件 开源工具的发展,离不开你我的支持,需要您投上宝贵的一票 去投票 itest 简介:查看简介 itest 开源敏捷测试管理,testOps 践行者 ...