Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bytes"
- "flag"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "net/smtp"
- "os"
- "os/signal"
- "sync/atomic"
- "syscall"
- "time"
- )
- func main() {
- addr := flag.String("addr", "127.0.0.1:1125", "Address of server to stress-test")
- msgFile := flag.String("msg", "msg.eml", "Message sample to use")
- conns := flag.Int("conns", 100, "Number of concurrent connections to open")
- limit := flag.Int("limit", 0, "Stop after sending N messages, default is no limit")
- flag.Parse()
- f, err := ioutil.ReadFile(*msgFile)
- if err != nil {
- log.Fatalln(err)
- }
- ch := make(chan os.Signal)
- signal.Notify(ch, syscall.SIGINT)
- stop := false
- N := uint64(0)
- start := time.Now()
- for i := 0; i < *conns; i++ {
- go func() {
- cl, err := smtp.Dial(*addr)
- if err != nil {
- log.Fatalln(err)
- }
- defer cl.Close()
- if err := cl.Hello("localhost"); err != nil {
- log.Fatalln(err)
- }
- for !stop || (atomic.LoadUint64(&N) > uint64(*limit) && *limit != 0) {
- if err := cl.Mail("foxcpp@foxcpp.dev"); err != nil {
- log.Fatalln(err)
- }
- if err := cl.Rcpt("foxcpp@foxcpp.dev"); err != nil {
- log.Fatalln(err)
- }
- wr, err := cl.Data()
- if err != nil {
- log.Fatalln(err)
- }
- if _, err := io.Copy(wr, bytes.NewReader(f)); err != nil {
- log.Fatalln(err)
- }
- wr.Close()
- atomic.AddUint64(&N, 1)
- }
- }()
- }
- <-ch
- stop = true
- end := time.Now()
- fmt.Println("time elapsed:", end.Sub(start))
- fmt.Println("messages sent:", N)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement