EmailSender.coffee 3.1 KB

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