--- a/Allura/allura/model/discuss.py
+++ b/Allura/allura/model/discuss.py
@@ -193,7 +193,37 @@
         if has_access(self, 'unmoderated_post')():
             log.info('Auto-approving message from %s', c.user.username)
             post.approve()
+        else:
+            self.notify_moderators(post)
         return post
+
+    def notify_moderators(self, post):
+        ''' Notify moderators that a post needs approval [#2963] '''
+        from allura.model.notification import Notification, Mailbox
+        artifact = self.artifact or self
+        subject = '[%s:%s] Moderation action required' % (
+                c.project.shortname, c.app.config.options.mount_point)
+        author = post.author()
+        text = '''The following submission requires approval at %s before it can be approved for posting:
+
+        %s''' % (h.absurl(c.app.config.discussion.url() + 'moderate'), post.text)
+        n = Notification(
+                ref_id=artifact.index_id(),
+                topic='message',
+                link=artifact.url(),
+                _id=artifact.url()+post._id,
+                from_address=str(author._id) if author != User.anonymous() else None,
+                reply_to_address='noreply@in.sf.net',
+                subject=subject,
+                text=text,
+                in_reply_to=post.parent_id,
+                author_id=author._id,
+                pubdate=datetime.utcnow())
+        users = self.app_config.project.users()
+        for u in users:
+            if (has_access(self, 'moderate', u)
+                and Mailbox.subscribed(user_id=u._id, app_config_id=post.app_config_id)):
+                    n.send_direct(str(u._id))
 
     def update_stats(self):
         self.num_replies = self.post_class().query.find(