Worked around unstable Zoho mail dependencies by switching password recovery and contact emails to Sendwithus.

This commit is contained in:
Nick Winter 2014-12-11 20:06:03 -08:00
parent 0c81942c71
commit 194d3ee647
6 changed files with 37 additions and 45 deletions

View file

@ -52,7 +52,6 @@
"underscore.string": "2.3.x",
"async": "0.2.x",
"connect": "2.7.x",
"nodemailer": "0.4.x",
"coffee-script": "1.7.x",
"graceful-fs": "~2.0.1",
"node-force-domain": "~0.1.0",

View file

@ -6,10 +6,3 @@ module.exports.MAILCHIMP_GROUP_ID = '4529'
# these two need to be parallel
module.exports.MAILCHIMP_GROUPS = ['Announcements', 'Adventurers', 'Artisans', 'Archmages', 'Scribes', 'Diplomats', 'Ambassadors']
module.exports.NEWS_GROUPS = ['generalNews', 'adventurerNews', 'artisanNews', 'archmageNews', 'scribeNews', 'diplomatNews', 'ambassadorNews']
nodemailer = require 'nodemailer'
module.exports.transport = nodemailer.createTransport 'SMTP',
service: config.mail.service
user: config.mail.username
pass: config.mail.password
authMethod: 'LOGIN'

View file

@ -5,8 +5,8 @@ UserHandler = require '../users/user_handler'
LevelSession = require '../levels/sessions/LevelSession'
config = require '../../server_config'
errors = require '../commons/errors'
mail = require '../commons/mail'
languages = require '../routes/languages'
sendwithus = require '../sendwithus'
module.exports.setup = (app) ->
authentication.serializeUser((user, done) -> done(null, user._id))
@ -103,11 +103,18 @@ module.exports.setup = (app) ->
user.set('passwordReset', Math.random().toString(36).slice(2, 7).toUpperCase())
user.save (err) =>
return errors.serverError(res) if err
if config.isProduction
options = createMailOptions req.body.email, user.get('passwordReset')
mail.transport.sendMail options, (error, response) ->
if error
console.error "Error sending mail: #{error.message or error}"
unless config.unittest
context =
email_id: sendwithus.templates.generic_email
recipient:
address: req.body.email
email_data:
subject: 'CodeCombat Recovery Password'
title: 'Recovery Password'
content: "<p>Your CodeCombat recovery password for email #{req.body.email} is: #{user.get('passwordReset')}</p><p>Log in at <a href=\"http://codecombat.com/account/settings\">http://codecombat.com/account/settings</a> and change it.</p><p>Hope this helps!</p>"
sendwithus.api.send context, (err, result) ->
if err
console.error "Error sending password reset email: #{err.message or err}"
return errors.serverError(res) if err
else
return res.end()
@ -195,12 +202,3 @@ module.exports.makeNewUser = makeNewUser = (req) ->
lang = languages.languageCodeFromAcceptedLanguages req.acceptedLanguages
user.set 'preferredLanguage', lang if lang[...2] isnt 'en'
user.set 'lastIP', req.connection.remoteAddress
createMailOptions = (receiver, password) ->
# TODO: use email templates here
options =
from: config.mail.username
to: receiver
replyTo: config.mail.username
subject: '[CodeCombat] Password Reset'
text: "You can log into your account with: #{password}"

View file

@ -1,36 +1,38 @@
config = require '../../server_config'
log = require 'winston'
mail = require '../commons/mail'
User = require '../users/User'
sendwithus = require '../sendwithus'
module.exports.setup = (app) ->
app.post '/contact', (req, res) ->
return res.end() unless req.user
#log.info "Sending mail from #{req.body.email} saying #{req.body.message}"
if config.isProduction
createMailOptions req.body.email, req.body.message, req.user, req.body.recipientID, req.body.subject, (options) ->
mail.transport.sendMail options, (error, response) ->
if error
log.error "Error sending mail: #{error.message or error}"
createMailContext req.body.email, req.body.message, req.user, req.body.recipientID, req.body.subject, (context) ->
sendwithus.api.send context, (err, result) ->
if err
log.error "Error sending contact form email: #{err.message or err}"
return res.end()
createMailOptions = (sender, message, user, recipientID, subject, done) ->
# TODO: use email templates here
options =
from: config.mail.username
to: config.mail.username
replyTo: sender
subject: "[CodeCombat] #{subject ? ('Feedback - ' + sender)}"
text: "#{message}\n\nUsername: #{user.get('name') or 'Anonymous'}\nID: #{user._id}"
#html: message.replace '\n', '<br>\n'
createMailContext = (sender, message, user, recipientID, subject, done) ->
context =
email_id: sendwithus.templates.plain_text_email
recipient:
address: config.mail.username
sender:
address: config.mail.username
reply_to: sender
name: user.get('name')
email_data:
subject: "[CodeCombat] #{subject ? ('Feedback - ' + sender)}"
content: "#{message}\n\nUsername: #{user.get('name') or 'Anonymous'}\nID: #{user._id}"
if recipientID and (user.isAdmin() or ('employer' in (user.get('permissions') ? [])))
User.findById(recipientID, 'email').exec (err, document) ->
if err
log.error "Error looking up recipient to email from #{recipientID}: #{err}" if err
else
options.bcc = [options.to, sender]
options.to = document.get('email')
done options
context.bcc = [context.to, sender]
context.to = document.get('email')
done context
else
done options
done context

View file

@ -16,3 +16,5 @@ module.exports.templates =
change_made_notify_watcher: 'tem_7KVkfmv9SZETb25dtHbUtG'
recruiting_email: 'tem_mdFMgtcczHKYu94Jmq68j8'
greed_tournament_rank: 'tem_c4KYnk2TriEkkZx5NqqGLG'
generic_email: 'tem_JhRnQ4pvTS4KdQjYoZdbei'
plain_text_email: 'tem_85UvKDCCNPXsFckERTig6Y'

View file

@ -19,7 +19,7 @@ config.mongo =
config.apple =
verifyURL: process.env.COCO_APPLE_VERIFY_URL or 'https://sandbox.itunes.apple.com/verifyReceipt'
config.stripe =
secretKey: process.env.COCO_STRIPE_SECRET_KEY or 'sk_test_MFnZHYD0ixBbiBuvTlLjl2da'
@ -36,9 +36,7 @@ else
config.mongo.password = process.env.COCO_MONGO_PASSWORD or ''
config.mail =
service: process.env.COCO_MAIL_SERVICE_NAME or 'Zoho'
username: process.env.COCO_MAIL_SERVICE_USERNAME or ''
password: process.env.COCO_MAIL_SERVICE_PASSWORD or ''
mailchimpAPIKey: process.env.COCO_MAILCHIMP_API_KEY or ''
mailchimpWebhook: process.env.COCO_MAILCHIMP_WEBHOOK or '/mail/webhook'
sendwithusAPIKey: process.env.COCO_SENDWITHUS_API_KEY or ''