Release Notes

Sisimai 5.4.0


2025/07/01

Sisimai 5.4.0 has been released. The main changes in this version include: Implementation of new error codes of Microsoft and Google, The Ruby version of Sisimai now supports frozen string literals, The Go version of Sisimai includes breaking changes, requiring Go 1.24 or later and with sisimai.Rise() now returning slices instead of pointers.

Changes specific to the Perl version of Sisimai are indicated by Perl at the beginning of each item, changes specific to the Ruby version of Sisimai are indicated by Ruby, and changes specific to the Go version of Sisimai are indicated by Go.

And then, Sisimai 5 includes many changes that are not compatible with Version 4, so please check the Perl or Ruby version of your environment before installing or upgrading.

Changes

  • Go sisimai.Rise() function now return slices: []sis.Fact and []sis.NotDecoded instead of pointers. Thanks to @corny #119 #145 #148
  • Go The minimum Go version required to run Sisimai is now Go 1.24. #112 #127
    • Fixed out of bounds read at EmailEntity.setNewLine() function in mail/lib.go using the build-in min() function. Thanks to @VolkerLieber #110
    • Use strings.Cut() instead of strings.SplitN(v,s,2) and v[n:strings.Index(v,s)]. #116 #117
    • Use slices.Contains() instead of moji.EqualsAny(). #118 #122
    • Use strings.Lines() instead of strings.Split(v, "\n"). #123 #128
  • Implement new error codes of Google:4.7.40 and 5.7.32 as AuthFailure. #590 #591 #349 #350 #104 #152
  • Implement the new status code 5.7.515 as AuthFailure and other undocumented status codes begin with 4.4. as SystemError of Microsoft. #107 #108 #149 #150 #151 #588 #589 #342 #345 #348
  • Ruby The Ruby version of Sisimai now supports frozen string literals. #347
  • Perl Ruby Standardise return values to align with zero value principle. #586 #587 #343 #346
  • Go Fix spell errors in some documents. #109 #115
  • Go Set a pointer to sis.DecodingArgs struct when the 2nd argument of sisimai.Rise() is nil. Thanks to @VolkerLieber #111 #113
  • Go Use golangci-lint with the minimum linters. Thanks to @corny #120 #121
  • Go moji.Squeeze() and mail.setNewLine() no longer returns any value. #124 #125
  • Go Use iota instead of lhost.DeliveryStatus hash map. #131 #132
  • Go use the switch statement without a condition instead of the infinite for loop and the if statement. #133 #134
  • Go moji.IsContained() instead of string.Contains() in some loops. #135
  • Go Implement moji.AlignedAny() function in moji/any.go. #136 #137
  • Go reason.GetRetried has been replaced with reason.ShouldBeRetried() function. #139 #141
  • Go Tiny code improvements in reason.IsExplicit() function. #140
  • Go Change the order of fields in some structs to improve memory alignment. #142 #143
  • Go Adopt idiomatic Go style by returning direct slices instead of pointers to slices in some functions except sisimai.Rise(). #146 #147