detail.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package detail
  2. import (
  3. "database/sql"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/Jinnrry/pmail/db"
  7. "github.com/Jinnrry/pmail/dto/parsemail"
  8. "github.com/Jinnrry/pmail/dto/response"
  9. "github.com/Jinnrry/pmail/models"
  10. "github.com/Jinnrry/pmail/services/list"
  11. "github.com/Jinnrry/pmail/utils/array"
  12. "github.com/Jinnrry/pmail/utils/context"
  13. "github.com/Jinnrry/pmail/utils/errors"
  14. log "github.com/sirupsen/logrus"
  15. "strings"
  16. )
  17. import . "xorm.io/builder"
  18. func GetEmailDetail(ctx *context.Context, id int, markRead bool) (*response.EmailResponseData, error) {
  19. // 先查是否是本人的邮件
  20. var ue models.UserEmail
  21. _, err := db.Instance.Where("email_id = ?", id).Get(&ue)
  22. if err != nil {
  23. log.Error(err)
  24. }
  25. if ue.ID == 0 && !ctx.IsAdmin {
  26. return nil, errors.New("Not authorized")
  27. }
  28. //获取邮件内容
  29. var email response.EmailResponseData
  30. _, err = db.Instance.Select("*,1 as is_read").Table("email").Where("id=?", id).Get(&email)
  31. if err != nil {
  32. log.WithContext(ctx).Errorf("SQL error:%+v", err)
  33. return nil, err
  34. }
  35. email.IsRead = ue.IsRead
  36. if markRead && ue.IsRead == 0 {
  37. ue.IsRead = 1
  38. _, err = db.Instance.Where("id=?", ue.ID).Update(&ue)
  39. if err != nil {
  40. log.WithContext(ctx).Errorf("SQL error:%+v", err)
  41. }
  42. }
  43. // 将内容中的cid内容替换成url
  44. if email.Attachments != "" {
  45. var atts []parsemail.Attachment
  46. _ = json.Unmarshal([]byte(email.Attachments), &atts)
  47. for _, att := range atts {
  48. email.Html = sql.NullString{
  49. String: strings.ReplaceAll(email.Html.String, fmt.Sprintf("cid:%s", att.ContentID), fmt.Sprintf("/attachments/%d/%s", id, att.ContentID)),
  50. }
  51. }
  52. }
  53. return &email, nil
  54. }
  55. func MakeRead(ctx *context.Context, emailId int, hadRead bool) {
  56. ue := models.UserEmail{
  57. UserID: ctx.UserID,
  58. IsRead: 1,
  59. EmailID: emailId,
  60. }
  61. if !hadRead {
  62. ue.IsRead = 0
  63. }
  64. db.Instance.Where("email_id = ? and user_id=?", emailId, ctx.UserID).Cols("is_read").Update(&ue)
  65. }
  66. func FindUE(ctx *context.Context, groupName string, req list.ImapListReq, uid bool) []models.UserEmail {
  67. var ue []models.UserEmail
  68. if uid {
  69. err := db.Instance.Where(Eq{"id": req.UidList}).Find(&ue)
  70. if err != nil {
  71. log.WithContext(ctx).Errorf("SQL error:%+v", err)
  72. }
  73. return ue
  74. } else {
  75. sql := fmt.Sprintf("SELECT id,email_id, is_read from (SELECT id,email_id, is_read, ROW_NUMBER() OVER (ORDER BY id) AS serial_number FROM `user_email` WHERE (user_id = ? and status = ?)) a WHERE serial_number in (%s)",
  76. array.Join(req.UidList, ","),
  77. )
  78. switch groupName {
  79. case "INBOX":
  80. db.Instance.SQL(sql, ctx.UserID, 0).Find(&ue)
  81. case "Sent Messages":
  82. db.Instance.SQL(sql, ctx.UserID, 1).Find(&ue)
  83. case "Drafts":
  84. db.Instance.SQL(sql, ctx.UserID, 4).Find(&ue)
  85. case "Deleted Messages":
  86. db.Instance.SQL(sql, ctx.UserID, 3).Find(&ue)
  87. case "Junk":
  88. db.Instance.SQL(sql, ctx.UserID, 5).Find(&ue)
  89. default:
  90. groupNames := strings.Split(groupName, "/")
  91. groupName = groupNames[len(groupNames)-1]
  92. var group models.Group
  93. db.Instance.Table("group").Where("user_id=? and name=?", ctx.UserID, groupName).Get(&group)
  94. if group.ID == 0 {
  95. return nil
  96. }
  97. db.Instance.
  98. SQL(fmt.Sprintf(
  99. "SELECT * from (SELECT id,email_id, is_read, ROW_NUMBER() OVER (ORDER BY id) AS serial_number FROM `user_email` WHERE (user_id = ? and group_id = ?)) a WHERE serial_number in (%s)",
  100. array.Join(req.UidList, ","),
  101. )).
  102. Find(&ue, ctx.UserID, group.ID)
  103. }
  104. return ue
  105. }
  106. }