|
@@ -49,12 +49,22 @@ type Client struct {
|
|
|
|
|
|
// Dial returns a new Client connected to an SMTP server at addr.
|
|
// Dial returns a new Client connected to an SMTP server at addr.
|
|
// The addr must include a port, as in "mail.example.com:smtp".
|
|
// The addr must include a port, as in "mail.example.com:smtp".
|
|
-func Dial(addr string) (*Client, error) {
|
|
|
|
- conn, err := net.DialTimeout("tcp", addr, time.Second*10)
|
|
|
|
- if err != nil {
|
|
|
|
- return nil, err
|
|
|
|
- }
|
|
|
|
|
|
+func Dial(addr string, tlsEnabled bool) (cl *Client, err error) {
|
|
host, _, _ := net.SplitHostPort(addr)
|
|
host, _, _ := net.SplitHostPort(addr)
|
|
|
|
+ var conn net.Conn
|
|
|
|
+ if tlsEnabled {
|
|
|
|
+ tlsconfig := &tls.Config{
|
|
|
|
+ InsecureSkipVerify: true,
|
|
|
|
+ ServerName: host,
|
|
|
|
+ }
|
|
|
|
+ if conn, err = tls.Dial("tcp", addr, tlsconfig); err != nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if conn, err = net.DialTimeout("tcp", addr, time.Second*10); err != nil {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return NewClient(conn, host)
|
|
return NewClient(conn, host)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -62,6 +72,8 @@ func Dial(addr string) (*Client, error) {
|
|
// server name to be used when authenticating.
|
|
// server name to be used when authenticating.
|
|
func NewClient(conn net.Conn, host string) (*Client, error) {
|
|
func NewClient(conn net.Conn, host string) (*Client, error) {
|
|
text := textproto.NewConn(conn)
|
|
text := textproto.NewConn(conn)
|
|
|
|
+ // read deadline
|
|
|
|
+ conn.SetReadDeadline(time.Now().Add(time.Second * 5))
|
|
_, _, err := text.ReadResponse(220)
|
|
_, _, err := text.ReadResponse(220)
|
|
if err != nil {
|
|
if err != nil {
|
|
text.Close()
|
|
text.Close()
|
|
@@ -154,13 +166,16 @@ func (c *Client) StartTLS(config *tls.Config) error {
|
|
if err := c.hello(); err != nil {
|
|
if err := c.hello(); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- _, _, err := c.cmd(220, "STARTTLS")
|
|
|
|
- if err != nil {
|
|
|
|
- return err
|
|
|
|
- }
|
|
|
|
- c.conn = tls.Client(c.conn, config)
|
|
|
|
- c.Text = textproto.NewConn(c.conn)
|
|
|
|
c.tls = true
|
|
c.tls = true
|
|
|
|
+ /*
|
|
|
|
+ _, _, err := c.cmd(220, "STARTTLS")
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ c.conn = tls.Client(c.conn, config)
|
|
|
|
+ c.Text = textproto.NewConn(c.conn)
|
|
|
|
+ c.tls = true
|
|
|
|
+ */
|
|
return c.ehlo()
|
|
return c.ehlo()
|
|
}
|
|
}
|
|
|
|
|
|
@@ -326,7 +341,7 @@ func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- c, err := Dial(addr)
|
|
|
|
|
|
+ c, err := Dial(addr, a.IsTLS())
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -334,15 +349,17 @@ func SendMail(addr string, a Auth, from string, to []string, msg []byte) error {
|
|
if err = c.hello(); err != nil {
|
|
if err = c.hello(); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
- if ok, _ := c.Extension("STARTTLS"); ok {
|
|
|
|
- config := &tls.Config{ServerName: c.serverName}
|
|
|
|
- if testHookStartTLS != nil {
|
|
|
|
- testHookStartTLS(config)
|
|
|
|
- }
|
|
|
|
- if err = c.StartTLS(config); err != nil {
|
|
|
|
- return err
|
|
|
|
|
|
+ /*
|
|
|
|
+ if ok, _ := c.Extension("STARTTLS"); ok {
|
|
|
|
+ config := &tls.Config{ServerName: c.serverName}
|
|
|
|
+ if testHookStartTLS != nil {
|
|
|
|
+ testHookStartTLS(config)
|
|
|
|
+ }
|
|
|
|
+ if err = c.StartTLS(config); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ */
|
|
if a != nil && c.ext != nil {
|
|
if a != nil && c.ext != nil {
|
|
if _, ok := c.ext["AUTH"]; !ok {
|
|
if _, ok := c.ext["AUTH"]; !ok {
|
|
return errors.New("smtp: server doesn't support AUTH")
|
|
return errors.New("smtp: server doesn't support AUTH")
|