main.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "bufio"
  4. "flag"
  5. "fmt"
  6. "os"
  7. "strings"
  8. )
  9. func readFromConsole() string {
  10. var text, line string
  11. var err error
  12. counter := 0
  13. reader := bufio.NewReader(os.Stdin)
  14. for counter < 3 {
  15. line, err = reader.ReadString('\n')
  16. if line == "\n" {
  17. counter += 1
  18. }
  19. text += fmt.Sprintf("%s\n", line)
  20. }
  21. if err != nil {
  22. Error.F("Error in reading text from console\n%s", err)
  23. os.Exit(1)
  24. }
  25. return text
  26. }
  27. func toList(input string) []string {
  28. var result = []string{}
  29. list := strings.Split(input, ",")
  30. for _, element := range list {
  31. if element != "" {
  32. result = append(result, element)
  33. }
  34. }
  35. return result
  36. }
  37. func main() {
  38. var err error
  39. var configPath, section, serverAddress, user, password, to, cc, bcc, from, subject, text string
  40. var encryption, dbg bool
  41. var serverPort_ int
  42. var serverPort int64
  43. flag.StringVar(&configPath, "conf", "/etc/sendmail.toml", "Path to a config file (defaults to /etc/sendmail.toml)")
  44. flag.StringVar(&section, "section", "default", "Section of the conf to read (defaults to \"default\")")
  45. flag.BoolVar(&dbg, "dbg", false, "Enable debugging output")
  46. flag.StringVar(&serverAddress, "server-address", "", "The SMTP server address")
  47. flag.IntVar(&serverPort_, "server-port", 0, "The SMTP server")
  48. flag.BoolVar(&encryption, "force-ssl", false, "Force the use of ssl (defalut: false)")
  49. flag.StringVar(&user, "user", "", "The user to authenticate with to the server")
  50. flag.StringVar(&password, "password", "", "The password to authenticate with to the server")
  51. flag.StringVar(&to, "to", "", "Comma-separated list of recipient(s)")
  52. flag.StringVar(&cc, "cc", "", "Comma-separated list of carbon-copy recipient(s)")
  53. flag.StringVar(&bcc, "bcc", "", "Comma-separated list of blind carbon-copy recipient(s)")
  54. flag.StringVar(&from, "from", "", "Sender of the mail (used as default account user to log in on the SMTP server)")
  55. flag.StringVar(&subject, "sub", "", "Subject of the mail")
  56. flag.Parse()
  57. LogInit(dbg)
  58. if flag.NArg() == 0 {
  59. text = readFromConsole()
  60. } else {
  61. for _, arg := range flag.Args() {
  62. text += fmt.Sprintf("%s\n", arg)
  63. }
  64. }
  65. serverPort = int64(serverPort_)
  66. Debug.F(
  67. `
  68. ---
  69. parameters:
  70. conf: %s
  71. dbg: %t
  72. address: %s
  73. port: %d
  74. encryption: %t
  75. user: %s
  76. password: %s
  77. to: %s
  78. from: %s
  79. subject: %s`,
  80. configPath,
  81. dbg,
  82. serverAddress,
  83. serverPort,
  84. encryption,
  85. user,
  86. password,
  87. to,
  88. from,
  89. subject,
  90. )
  91. config := readConfig(configPath, section)
  92. Debug.F("---\nConfig from %s\n%s", configPath, *config)
  93. config.Server.Merge("Address", serverAddress)
  94. config.Server.Merge("Port", serverPort)
  95. config.Server.Merge("Encryption", encryption)
  96. config.Server.Merge("User", user)
  97. config.Server.Merge("Password", password)
  98. config.Merge("From", from)
  99. config.Merge("To", toList(to))
  100. config.Merge("Cc", toList(cc))
  101. config.Merge("Bcc", toList(bcc))
  102. config.Merge("Subject", subject)
  103. config.Merge("Text", text)
  104. Debug.F("---\nPre-validation config\n%s", config)
  105. err = config.Validate()
  106. if err != nil {
  107. Error.F("Config validation failed:\n%s\n", err)
  108. os.Exit(1)
  109. }
  110. Info.F("Sending mail | to: %s", config.To)
  111. SendMail(config)
  112. }