email.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package tool
  2. import (
  3. "crypto/tls"
  4. "database/sql"
  5. "fmt"
  6. "net/smtp"
  7. )
  8. func Send_email(db *sql.DB, ip string, recipient string, title string, body string) error {
  9. rows := Query_DB(
  10. db,
  11. `select name, data from other where name in ("smtp_email", "smtp_pass", "smtp_server", "smtp_port", "smtp_security")`,
  12. )
  13. defer rows.Close()
  14. smtp_email := ""
  15. smtp_pass := ""
  16. smtp_server := ""
  17. smtp_security := ""
  18. smtp_port := ""
  19. for rows.Next() {
  20. var name, data string
  21. if err := rows.Scan(&name, &data); err != nil {
  22. return fmt.Errorf("failed to scan row: %v", err)
  23. }
  24. switch name {
  25. case "smtp_email":
  26. smtp_email = data
  27. case "smtp_pass":
  28. smtp_pass = data
  29. case "smtp_server":
  30. smtp_server = data
  31. case "smtp_security":
  32. smtp_security = data
  33. case "smtp_port":
  34. smtp_port = data
  35. }
  36. }
  37. if smtp_email == "" || smtp_pass == "" || smtp_server == "" || smtp_port == "" {
  38. return fmt.Errorf("smtp configuration is incomplete")
  39. }
  40. smtp_address := smtp_server + ":" + smtp_port
  41. var client *smtp.Client
  42. switch smtp_security {
  43. case "plain":
  44. conn, err := smtp.Dial(smtp_address)
  45. if err != nil {
  46. return fmt.Errorf("failed to connect to smtp server: %v", err)
  47. }
  48. client = conn
  49. case "starttls":
  50. conn, err := smtp.Dial(smtp_address)
  51. if err != nil {
  52. return fmt.Errorf("failed to connect to smtp server: %v", err)
  53. }
  54. if err := conn.StartTLS(&tls.Config{ServerName: smtp_server}); err != nil {
  55. return fmt.Errorf("failed to start tls: %v", err)
  56. }
  57. client = conn
  58. default:
  59. tls_conn, err := tls.Dial("tcp", smtp_address, &tls.Config{ServerName: smtp_server})
  60. if err != nil {
  61. return fmt.Errorf("failed to establish ssl connection: %v", err)
  62. }
  63. client, err = smtp.NewClient(tls_conn, smtp_server)
  64. if err != nil {
  65. return fmt.Errorf("failed to create smtp client: %v", err)
  66. }
  67. }
  68. defer client.Quit()
  69. auth := smtp.PlainAuth("", smtp_email, smtp_pass, smtp_server)
  70. if err := client.Auth(auth); err != nil {
  71. return fmt.Errorf("smtp authentication failed: %v", err)
  72. }
  73. if err := client.Mail(smtp_email); err != nil {
  74. return fmt.Errorf("failed to set sender: %v", err)
  75. }
  76. if err := client.Rcpt(recipient); err != nil {
  77. return fmt.Errorf("failed to set recipient: %v", err)
  78. }
  79. writer, err := client.Data()
  80. if err != nil {
  81. return fmt.Errorf("failed to send email data: %v", err)
  82. }
  83. domain := Get_domain(db, false)
  84. wiki_name := Get_wiki_set(db, ip, "")[0]
  85. message := fmt.Sprintf("from: %s <noreply@%s>\r\nto: %s\r\nsubject: %s\r\n\r\n%s", wiki_name, domain, recipient, title, body)
  86. _, err = writer.Write([]byte(message))
  87. if err != nil {
  88. return fmt.Errorf("failed to write email content: %v", err)
  89. }
  90. err = writer.Close()
  91. if err != nil {
  92. return fmt.Errorf("failed to finalize email send: %v", err)
  93. }
  94. return nil
  95. }