mirror of
https://github.com/wneessen/go-mail.git
synced 2024-11-15 10:22:56 +01:00
Winni Neessen
fdb80ad9dd
This commit introduces a RWMutex to the Client struct in the smtp package to ensure thread-safe access to shared resources. Critical sections in methods like Close, StartTLS, and cmd are now protected with appropriate locking mechanisms. This change helps prevent potential race conditions, ensuring consistent and reliable behavior in concurrent environments.
52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
// SPDX-FileCopyrightText: Copyright 2010 The Go Authors. All rights reserved.
|
|
// SPDX-FileCopyrightText: Copyright (c) 2022-2023 The go-mail Authors
|
|
//
|
|
// Original net/smtp code from the Go stdlib by the Go Authors.
|
|
// Use of this source code is governed by a BSD-style
|
|
// LICENSE file that can be found in this directory.
|
|
//
|
|
// go-mail specific modifications by the go-mail Authors.
|
|
// Licensed under the MIT License.
|
|
// See [PROJECT ROOT]/LICENSES directory for more information.
|
|
//
|
|
// SPDX-License-Identifier: BSD-3-Clause AND MIT
|
|
|
|
//go:build !go1.18
|
|
// +build !go1.18
|
|
|
|
package smtp
|
|
|
|
import "strings"
|
|
|
|
// ehlo sends the EHLO (extended hello) greeting to the server. It
|
|
// should be the preferred greeting for servers that support it.
|
|
//
|
|
// Backport of: https://github.com/golang/go/commit/4d8db00641cc9ff4f44de7df9b8c4f4a4f9416ee#diff-4f6f6bdb9891d4dd271f9f31430420a2e44018fe4ee539576faf458bebb3cee4
|
|
// to guarantee backwards compatibility with Go 1.16/1.17
|
|
func (c *Client) ehlo() error {
|
|
_, msg, err := c.cmd(250, "EHLO %s", c.localName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.mutex.Lock()
|
|
defer c.mutex.Unlock()
|
|
ext := make(map[string]string)
|
|
extList := strings.Split(msg, "\n")
|
|
if len(extList) > 1 {
|
|
extList = extList[1:]
|
|
for _, line := range extList {
|
|
args := strings.SplitN(line, " ", 2)
|
|
if len(args) > 1 {
|
|
ext[args[0]] = args[1]
|
|
} else {
|
|
ext[args[0]] = ""
|
|
}
|
|
}
|
|
}
|
|
if mechs, ok := ext["AUTH"]; ok {
|
|
c.auth = strings.Split(mechs, " ")
|
|
}
|
|
c.ext = ext
|
|
return err
|
|
}
|