func (c *DataCompressor) String() string {
	if c.Data == nil {
		return ""
	}
	b := c.Pool.Get().(*bytes.Buffer)
	defer func() {
		b.Reset()
		c.Pool.Put(b)
	}()
	var r *bytes.Reader
	w, _ := zlib.NewWriterLevel(b, zlib.BestSpeed)
	r = bytes.NewReader(c.ExtraHeaders)
	_, _ = io.Copy(w, r)
	_, _ = io.Copy(w, c.Data)
	_ = w.Close()
	return b.String()
}
String implements the Stringer interface.
Can only be called once!
This is because the compression buffer will be reset and compressor will be returned to the pool
package backends
import (
	"bytes"
	"compress/zlib"
	"github.com/flashmob/go-guerrilla/mail"
	"io"
	"sync"
)
func init() {
	processors["compressor"] = func() Decorator {
		return Compressor()
	}
}
type DataCompressor struct {
	ExtraHeaders []byte
	Data         *bytes.Buffer
	Pool *sync.Pool
}
func newCompressor() *DataCompressor {
	var p = sync.Pool{
		New: func() interface{} {
			var b bytes.Buffer
			return &b
		},
	}
	return &DataCompressor{
		Pool: &p,
	}
}
func (c *DataCompressor) set(b []byte, d *bytes.Buffer) {
	c.ExtraHeaders = b
	c.Data = d
}