mirror of
https://github.com/wneessen/go-mail.git
synced 2024-11-26 23:45:08 +01:00
Compare commits
10 commits
6f869e4efd
...
580d0b0e4e
Author | SHA1 | Date | |
---|---|---|---|
580d0b0e4e | |||
3f0ac027e2 | |||
0b9a215e7d | |||
4053457020 | |||
f3633e1913 | |||
52061f97c6 | |||
77920be1a1 | |||
f5d4cdafea | |||
19330fc108 | |||
af9915e4e7 |
9 changed files with 133 additions and 36 deletions
4
msg.go
4
msg.go
|
@ -467,8 +467,8 @@ func (m *Msg) SetMessageID() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hostname = "localhost.localdomain"
|
hostname = "localhost.localdomain"
|
||||||
}
|
}
|
||||||
randNumPrimary, _ := randNum(100000000)
|
randNumPrimary := randNum(100000000)
|
||||||
randNumSecondary, _ := randNum(10000)
|
randNumSecondary := randNum(10000)
|
||||||
randString, _ := randomStringSecure(17)
|
randString, _ := randomStringSecure(17)
|
||||||
procID := os.Getpid() * randNumSecondary
|
procID := os.Getpid() * randNumSecondary
|
||||||
messageID := fmt.Sprintf("%d.%d%d.%s@%s", procID, randNumPrimary, randNumSecondary,
|
messageID := fmt.Sprintf("%d.%d%d.%s@%s", procID, randNumPrimary, randNumSecondary,
|
||||||
|
|
|
@ -61,3 +61,25 @@ func TestMsg_WriteToSendmail(t *testing.T) {
|
||||||
t.Errorf("WriteToSendmail failed: %s", err)
|
t.Errorf("WriteToSendmail failed: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMsg_WriteToTempFileFailed(t *testing.T) {
|
||||||
|
m := NewMsg()
|
||||||
|
_ = m.From("Toni Tester <tester@example.com>")
|
||||||
|
_ = m.To("Ellenor Tester <ellinor@example.com>")
|
||||||
|
m.SetBodyString(TypeTextPlain, "This is a test")
|
||||||
|
|
||||||
|
curTmpDir := os.Getenv("TMPDIR")
|
||||||
|
defer func() {
|
||||||
|
if err := os.Setenv("TMPDIR", curTmpDir); err != nil {
|
||||||
|
t.Errorf("failed to set TMPDIR environment variable: %s", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
if err := os.Setenv("TMPDIR", "/invalid/directory/that/does/not/exist"); err != nil {
|
||||||
|
t.Errorf("failed to set TMPDIR environment variable: %s", err)
|
||||||
|
}
|
||||||
|
_, err := m.WriteToTempFile()
|
||||||
|
if err == nil {
|
||||||
|
t.Errorf("WriteToTempFile() did not fail as expected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -786,13 +786,11 @@ func TestMsg_SetMessageIDWithValue(t *testing.T) {
|
||||||
// TestMsg_SetMessageIDRandomness tests the randomness of Msg.SetMessageID methods
|
// TestMsg_SetMessageIDRandomness tests the randomness of Msg.SetMessageID methods
|
||||||
func TestMsg_SetMessageIDRandomness(t *testing.T) {
|
func TestMsg_SetMessageIDRandomness(t *testing.T) {
|
||||||
var mids []string
|
var mids []string
|
||||||
for i := 0; i < 100; i++ {
|
for i := 0; i < 50_000; i++ {
|
||||||
m := NewMsg()
|
m := NewMsg()
|
||||||
m.SetMessageID()
|
m.SetMessageID()
|
||||||
mid := m.GetGenHeader(HeaderMessageID)
|
mid := m.GetMessageID()
|
||||||
if len(mid) > 0 {
|
mids = append(mids, mid)
|
||||||
mids = append(mids, mid[0])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c := make(map[string]int)
|
c := make(map[string]int)
|
||||||
for i := range mids {
|
for i := range mids {
|
||||||
|
|
22
random.go
22
random.go
|
@ -7,8 +7,6 @@ package mail
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
|
||||||
"math/big"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -52,23 +50,3 @@ func randomStringSecure(length int) (string, error) {
|
||||||
|
|
||||||
return randString.String(), nil
|
return randString.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// randNum returns a random number with a maximum value of length
|
|
||||||
func randNum(length int) (int, error) {
|
|
||||||
if length <= 0 {
|
|
||||||
return 0, fmt.Errorf("provided number is <= 0: %d", length)
|
|
||||||
}
|
|
||||||
length64 := big.NewInt(int64(length))
|
|
||||||
if !length64.IsUint64() {
|
|
||||||
return 0, fmt.Errorf("big.NewInt() generation returned negative value: %d", length64)
|
|
||||||
}
|
|
||||||
randNum64, err := rand.Int(rand.Reader, length64)
|
|
||||||
if err != nil {
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
randomNum := int(randNum64.Int64())
|
|
||||||
if randomNum < 0 {
|
|
||||||
return 0, fmt.Errorf("generated random number does not fit as int64: %d", randNum64)
|
|
||||||
}
|
|
||||||
return randomNum, nil
|
|
||||||
}
|
|
||||||
|
|
22
random_119.go
Normal file
22
random_119.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022-2023 The go-mail Authors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
//go:build go1.19 && !go1.20
|
||||||
|
// +build go1.19,!go1.20
|
||||||
|
|
||||||
|
package mail
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// randNum returns a random number with a maximum value of length
|
||||||
|
func randNum(maxval int) int {
|
||||||
|
if maxval <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
return rand.Intn(maxval)
|
||||||
|
}
|
20
random_121.go
Normal file
20
random_121.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022-2023 The go-mail Authors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
//go:build go1.20 && !go1.22
|
||||||
|
// +build go1.20,!go1.22
|
||||||
|
|
||||||
|
package mail
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
// randNum returns a random number with a maximum value of length
|
||||||
|
func randNum(maxval int) int {
|
||||||
|
if maxval <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return rand.Intn(maxval)
|
||||||
|
}
|
22
random_122.go
Normal file
22
random_122.go
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022-2023 The go-mail Authors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
//go:build go1.22
|
||||||
|
// +build go1.22
|
||||||
|
|
||||||
|
package mail
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// randNum returns a random number with a maximum value of maxval.
|
||||||
|
// go-mail compiled with Go 1.22+ will make use of the novel math/rand/v2 interface
|
||||||
|
// Older versions of Go will use math/rand
|
||||||
|
func randNum(maxval int) int {
|
||||||
|
if maxval <= 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return rand.IntN(maxval)
|
||||||
|
}
|
|
@ -55,16 +55,17 @@ func TestRandomNum(t *testing.T) {
|
||||||
|
|
||||||
for _, tc := range tt {
|
for _, tc := range tt {
|
||||||
t.Run(tc.testName, func(t *testing.T) {
|
t.Run(tc.testName, func(t *testing.T) {
|
||||||
rn, err := randNum(tc.max)
|
rn := randNum(tc.max)
|
||||||
if err != nil {
|
|
||||||
t.Errorf("random number generation failed: %s", err)
|
|
||||||
}
|
|
||||||
if rn < 0 {
|
|
||||||
t.Errorf("random number generation failed: %d is smaller than zero", rn)
|
|
||||||
}
|
|
||||||
if rn > tc.max {
|
if rn > tc.max {
|
||||||
t.Errorf("random number generation failed: %d is bigger than given value %d", rn, tc.max)
|
t.Errorf("random number generation failed: %d is bigger than given value %d", rn, tc.max)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRandomNumZero(t *testing.T) {
|
||||||
|
rn := randNum(0)
|
||||||
|
if rn != 0 {
|
||||||
|
t.Errorf("random number generation failed: %d is not zero", rn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -108,6 +108,13 @@ func TestSendError_MessageID(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendError_MessageIDNil(t *testing.T) {
|
||||||
|
var se *SendError
|
||||||
|
if se.MessageID() != "" {
|
||||||
|
t.Error("expected empty string on nil-senderror")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestSendError_Msg(t *testing.T) {
|
func TestSendError_Msg(t *testing.T) {
|
||||||
var se *SendError
|
var se *SendError
|
||||||
err := returnSendError(ErrAmbiguous, false)
|
err := returnSendError(ErrAmbiguous, false)
|
||||||
|
@ -131,6 +138,33 @@ func TestSendError_Msg(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSendError_MsgNil(t *testing.T) {
|
||||||
|
var se *SendError
|
||||||
|
if se.Msg() != nil {
|
||||||
|
t.Error("expected nil on nil-senderror")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSendError_IsFail(t *testing.T) {
|
||||||
|
err1 := returnSendError(ErrAmbiguous, false)
|
||||||
|
err2 := returnSendError(ErrSMTPMailFrom, false)
|
||||||
|
if errors.Is(err1, err2) {
|
||||||
|
t.Errorf("error mismatch, ErrAmbiguous should not be equal to ErrSMTPMailFrom")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSendError_ErrorMulti(t *testing.T) {
|
||||||
|
expected := `ambiguous reason, check Msg.SendError for message specific reasons, ` +
|
||||||
|
`affected recipient(s): <email1@domain.tld>, <email2@domain.tld>`
|
||||||
|
err := &SendError{
|
||||||
|
Reason: ErrAmbiguous, isTemp: false, affectedMsg: nil,
|
||||||
|
rcpt: []string{"<email1@domain.tld>", "<email2@domain.tld>"},
|
||||||
|
}
|
||||||
|
if err.Error() != expected {
|
||||||
|
t.Errorf("error mismatch, expected: %s, got: %s", expected, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// returnSendError is a helper method to retunr a SendError with a specific reason
|
// returnSendError is a helper method to retunr a SendError with a specific reason
|
||||||
func returnSendError(r SendErrReason, t bool) error {
|
func returnSendError(r SendErrReason, t bool) error {
|
||||||
message := NewMsg()
|
message := NewMsg()
|
||||||
|
|
Loading…
Reference in a new issue