EmailSender.coffee 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. logger = require('logger-sharelatex')
  2. metrics = require('metrics-sharelatex')
  3. Settings = require('settings-sharelatex')
  4. nodemailer = require("nodemailer")
  5. sesTransport = require('nodemailer-ses-transport')
  6. sgTransport = require('nodemailer-sendgrid-transport')
  7. rateLimiter = require('../../infrastructure/RateLimiter')
  8. _ = require("underscore")
  9. if Settings.email? and Settings.email.fromAddress?
  10. defaultFromAddress = Settings.email.fromAddress
  11. else
  12. defaultFromAddress = ""
  13. # provide dummy mailer unless we have a better one configured.
  14. client =
  15. sendMail: (options, callback = (err,status) ->) ->
  16. logger.log options:options, "Would send email if enabled."
  17. callback()
  18. if Settings?.email?.parameters?.AWSAccessKeyID? or Settings?.email?.driver == 'ses'
  19. logger.log "using aws ses for email"
  20. nm_client = nodemailer.createTransport(sesTransport(Settings.email.parameters))
  21. else if Settings?.email?.parameters?.sendgridApiKey?
  22. logger.log "using sendgrid for email"
  23. nm_client = nodemailer.createTransport(sgTransport({auth:{api_key:Settings?.email?.parameters?.sendgridApiKey}}))
  24. else if Settings?.email?.parameters?
  25. smtp = _.pick(Settings?.email?.parameters, "host", "port", "secure", "auth", "ignoreTLS")
  26. logger.log "using smtp for email"
  27. nm_client = nodemailer.createTransport(smtp)
  28. else
  29. nm_client = client
  30. logger.warn "Email transport and/or parameters not defined. No emails will be sent."
  31. if nm_client?
  32. client = nm_client
  33. else
  34. logger.warn "Failed to create email transport. Please check your settings. No email will be sent."
  35. checkCanSendEmail = (options, callback)->
  36. if !options.sendingUser_id? #email not sent from user, not rate limited
  37. return callback(null, true)
  38. opts =
  39. endpointName: "send_email"
  40. timeInterval: 60 * 60 * 3
  41. subjectName: options.sendingUser_id
  42. throttle: 100
  43. rateLimiter.addCount opts, callback
  44. module.exports =
  45. sendEmail : (options, callback = (error) ->)->
  46. logger.log receiver:options.to, subject:options.subject, "sending email"
  47. checkCanSendEmail options, (err, canContinue)->
  48. if err?
  49. return callback(err)
  50. if !canContinue
  51. logger.log sendingUser_id:options.sendingUser_id, to:options.to, subject:options.subject, canContinue:canContinue, "rate limit hit for sending email, not sending"
  52. return callback("rate limit hit sending email")
  53. metrics.inc "email"
  54. options =
  55. to: options.to
  56. from: defaultFromAddress
  57. subject: options.subject
  58. html: options.html
  59. text: options.text
  60. replyTo: options.replyTo || Settings.email.replyToAddress
  61. socketTimeout: 30 * 1000
  62. if Settings.email.textEncoding?
  63. opts.textEncoding = textEncoding
  64. client.sendMail options, (err, res)->
  65. if err?
  66. logger.err err:err, "error sending message"
  67. err = new Error('Cannot send email')
  68. else
  69. logger.log "Message sent to #{options.to}"
  70. callback(err)