email_template.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package alert
  2. import (
  3. "bytes"
  4. "fmt"
  5. "html/template"
  6. "time"
  7. )
  8. // NewHTMLEmail 告警邮件模板
  9. func newHTMLEmail(method, host, uri, id string, msg interface{}, stack string) (subject string, body string, err error) {
  10. mailData := &struct {
  11. URL string
  12. ID string
  13. Msg string
  14. Stack string
  15. Year int
  16. }{
  17. URL: fmt.Sprintf("%s %s%s", method, host, uri),
  18. ID: id,
  19. Msg: fmt.Sprintf("%+v", msg),
  20. Stack: stack,
  21. Year: time.Now().Year(),
  22. }
  23. // subject 邮件主题
  24. subject = fmt.Sprintf("[系统告警]-%s", uri)
  25. // body 邮件内容
  26. body, err = getEmailHTMLContent(mailTemplate, mailData)
  27. return
  28. }
  29. // getEmailHTMLContent 获取邮件模板
  30. func getEmailHTMLContent(mailTpl string, mailData interface{}) (string, error) {
  31. tpl, err := template.New("email tpl").Parse(mailTpl)
  32. if err != nil {
  33. return "", err
  34. }
  35. buffer := new(bytes.Buffer)
  36. err = tpl.Execute(buffer, mailData)
  37. if err != nil {
  38. return "", err
  39. }
  40. return buffer.String(), nil
  41. }
  42. const mailTemplate = `
  43. <!DOCTYPE html>
  44. <html>
  45. <head>
  46. <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
  47. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  48. <style type="text/css" rel="stylesheet" media="all">
  49. /* Media Queries */
  50. @media only screen and (max-width: 500px) {
  51. .button {
  52. width: 100% !important;
  53. }
  54. }
  55. </style>
  56. </head>
  57. <body style="margin: 0; padding: 0; width: 100%; background-color: #F2F4F6;">
  58. <table width="100%" cellpadding="0" cellspacing="0">
  59. <tr>
  60. <td style="width: 100%; margin: 0; padding: 0; background-color: #F2F4F6;" align="center">
  61. <table width="100%" cellpadding="0" cellspacing="0">
  62. <!-- Logo -->
  63. <tr>
  64. <td style="padding: 25px 0; text-align: center;">
  65. 系统告警
  66. </td>
  67. </tr>
  68. <!-- Email Body -->
  69. <tr>
  70. <td style="width: 100%; margin: 0; padding: 0; border-top: 1px solid #EDEFF2; border-bottom: 1px solid #EDEFF2; background-color: #FFF;"
  71. width="100%">
  72. <table style="width: auto; max-width: 750px; margin: 0 auto; padding: 0;" align="center"
  73. width="750" cellpadding="0" cellspacing="0">
  74. <tr>
  75. <td style="font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; padding: 35px;">
  76. <!-- Greeting -->
  77. <h1 style="margin-top: 0; color: #2F3133; font-size: 19px; font-weight: bold; text-align: left;">
  78. Hello!
  79. </h1>
  80. <!-- Intro -->
  81. <p style="margin-top: 0; color: #74787E; line-height: 1.5em;">
  82. 您收到此电子邮件,请紧急安排处理。
  83. </p>
  84. <!-- Action Button -->
  85. <table style="width: 100%; margin: 30px auto; padding: 0;"
  86. width="100%" cellpadding="0" cellspacing="0">
  87. <tr style="margin-top: 0; color: #74787E; line-height: 1.5em;">
  88. <td style="width: 10%;">
  89. ID:
  90. </td>
  91. <td style="width: 90%">
  92. {{.ID}}
  93. </td>
  94. </tr>
  95. <tr style="margin-top: 0; color: #74787E; font-size: 16px; line-height: 1.5em;">
  96. <td style="width: 10%;">
  97. URL:
  98. </td>
  99. <td style="width: 90%">
  100. {{.URL}}
  101. </td>
  102. </tr>
  103. <tr style="margin-top: 0; color: #74787E; font-size: 16px; line-height: 1.5em;">
  104. <td style="width: 10%;">
  105. Error:
  106. </td>
  107. <td style="width: 90%">
  108. {{.Msg}}
  109. </td>
  110. </tr>
  111. <tr style="margin-top: 0; color: #74787E; font-size: 16px; line-height: 1.5em;">
  112. <td style="width: 10%;">
  113. Stack:
  114. </td>
  115. <td style="width: 90%;">
  116. {{.Stack}}
  117. </td>
  118. </tr>
  119. </table>
  120. </td>
  121. </tr>
  122. </table>
  123. </td>
  124. </tr>
  125. <!-- Footer -->
  126. <tr>
  127. <td>
  128. <table style="width: auto; max-width: 570px; margin: 0 auto; padding: 0; text-align: center;"
  129. align="center" width="750" cellpadding="0" cellspacing="0">
  130. <tr>
  131. <td style="font-family: Arial, 'Helvetica Neue', Helvetica, sans-serif; color: #AEAEAE; padding: 35px; text-align: center;">
  132. <p style="margin-top: 0; color: #74787E; font-size: 12px; line-height: 1.5em;">
  133. &copy; {{.Year}}
  134. All rights reserved.
  135. </p>
  136. </td>
  137. </tr>
  138. </table>
  139. </td>
  140. </tr>
  141. </table>
  142. </td>
  143. </tr>
  144. </table>
  145. </body>
  146. </html>
  147. `