go-gomail / gomail

The best way to send emails in Go.
MIT License
4.33k stars 573 forks source link

There's a way to efficiently send more than one mail in one connection? #10

Closed marcalj closed 9 years ago

marcalj commented 9 years ago

I made a quick review of your code and I think you open close a connection for each Send (https://github.com/go-gomail/gomail/blob/master/send.go#L22).

I want to implement a job to send emails from a queue in bulk, but reusing the connection to be as more efficient as possible.

I miss something from your API?

Thanks!

alexcesaro commented 9 years ago

You can already do it by using getSendMailFunc and implementing your own email-sending function.

But I can also add new methods so you can do something like that:

c := mailer.Connect()
defer c.Close()
for _, msg := range list {
    if err := c.Send(msg); err != nil {
        panic(err)
    }
}

Would that fits your need?

marcalj commented 9 years ago

Sorry, I wasn't able to play with your library until now! :)

Yep, this would be a great addition to this package! I'll try to implement a custom email-sending function. Not sure when btw...

Thanks!!!

codepushr commented 9 years ago

+1

alexcesaro commented 9 years ago

I will do it for Gomail v2 (which should be released in August as Go 1.5). In the meantime you can already do it by implementing your own email-sending function and using SetSendMail.

alexcesaro commented 9 years ago

Gomail v2 will handle sending many mails on one connection. You can already try the unstable version and tell me if it is fine:

package main

import (
    "fmt"

    "gopkg.in/gomail.v2-unstable"
)

func main() {
    messages := make([]*gomail.Message, 10)
    for i := 0; i < len(messages); i++ {
        m := gomail.NewMessage()
        m.SetHeader("From", "from@example.com")
        m.SetHeader("To", "to@example.com")
        m.SetHeader("Subject", fmt.Sprintf("Test %d", i))
        m.SetBody("text/html", fmt.Sprintf("Test %d", i))
        messages[i] = m
    }

    d := gomail.NewPlainDialer("smtp.example.com", "user", "123456", 587)
    if err := d.DialAndSend(messages...); err != nil {
        panic(err)
    }
}
codepushr commented 8 years ago

Awesome! :+1: