confirmation mail now template based.

This commit is contained in:
2022-04-23 16:56:36 +02:00
parent 5e1bc10855
commit 19c20816f8
9 changed files with 70 additions and 28 deletions

View File

@@ -28,8 +28,7 @@ public class Constants {
public static final String SUBJECT = "subject";
public static final String TEXT = "text";
public static final String TOKEN = "token";
public static final String URL = "url";
public static final String USER = "user";
public static final String VARCHAR = "VARCHAR(255)";
}

View File

@@ -1,9 +1,13 @@
package de.srsoftware.widerhall.data;
import de.srsoftware.widerhall.Configuration;
import de.srsoftware.widerhall.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.stringtemplate.v4.ST;
import javax.mail.MessagingException;
import java.io.UnsupportedEncodingException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
@@ -87,7 +91,7 @@ public class ListMember {
* @return
* @throws SQLException
*/
public static User confirm(String token) throws SQLException {
public static ListMember confirm(String token) throws SQLException {
var rs = Database.open().select(TABLE_NAME).where(TOKEN,token).compile().exec();
if (rs.next()){
var lm = ListMember.from(rs);
@@ -103,12 +107,25 @@ public class ListMember {
.compile()
.run();
}
return lm.user;
return lm;
}
return null;
}
public void sendConfirmationMail(ST template) throws SQLException, MessagingException {
var subject = t("[{}] Subscription complete!",list.name());
var data = new HashMap<String,Object>();
data.put(USER,user.safeMap());
data.put(LIST,list.minimalMap());
data.put(URL,Configuration.instance().baseUrl()+"/web/index");
if (list.isOpenForSubscribers()) data.put("open_list",true);
var text = template.add("data",data).render();
try {
list.smtp().send(list.email(),list.name(),user.email(),subject,text);
} catch (UnsupportedEncodingException e) {
LOG.warn("Failed to send list subscription confirmation!",e);
}
}
/**
* Create a new list member entry in the database.
* If the member has the state AWAITING_CONFIRMATION, a token is assigned with the member, too.

View File

@@ -7,6 +7,7 @@ import de.srsoftware.widerhall.mail.ProblemListener;
import de.srsoftware.widerhall.mail.SmtpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.stringtemplate.v4.ST;
import javax.mail.*;
import javax.mail.internet.AddressException;
@@ -60,6 +61,7 @@ public class MailingList implements MessageHandler, ProblemListener {
private static final int DEFAULT_STATE = STATE_PENDING|STATE_HIDE_RECEIVERS|STATE_PUBLIC_ARCHIVE;
private static final String RETAINED_FOLDER = "retained";
private static final String LAST_ERROR = "last_error";
private static final String LIST_NAME = "list_name";
private String email, name, lastError;
private int state;
private SmtpClient smtp;
@@ -532,21 +534,6 @@ public class MailingList implements MessageHandler, ProblemListener {
return this;
}
/**
* send an email to a potential subscriber asking for confirmation
* @param user
* @param token
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
private void sendConfirmationRequest(User user, String token) throws MessagingException, UnsupportedEncodingException {
var subject = t("Please confirm your list subscription");
var config = Configuration.instance();
var url = new StringBuilder(config.baseUrl()).append("/web/confirm?token=").append(token);
var text = t("Please go to {} in order to complete your list subscription!",url);
smtp.send(email(),name(),user.email(),subject,text);
}
private void sentRetentionNotification(String senderEmail) {
try {
var receivers = members()
@@ -641,17 +628,24 @@ public class MailingList implements MessageHandler, ProblemListener {
* @throws SQLException
* @throws MessagingException
*/
public void requestSubscription(User user, boolean skipConfirmation) throws SQLException, MessagingException {
public void requestSubscription(User user, boolean skipConfirmation, ST template) throws SQLException, MessagingException {
var state = skipConfirmation ? ListMember.STATE_SUBSCRIBER : ListMember.STATE_AWAITING_CONFIRMATION;
var member = ListMember.create(this,user,state);
if (skipConfirmation) return;
try {
sendConfirmationRequest(user, member.token());
var config = Configuration.instance();
var url = new StringBuilder(config.baseUrl()).append("/web/confirm?token=").append(member.token()).toString();
var subject = t("[{}] Please confirm your list subscription",name());
var text = template.add(URL,url).add(LIST_NAME,name()).render();
smtp.send(email(),name(),user.email(),subject,text);
} catch (UnsupportedEncodingException e) {
throw new MessagingException(t("Failed to send email to {}",user.email()),e);
}
}
protected SmtpClient smtp(){
return smtp;
}
private String stamp() {
return "["+name+"]";

View File

@@ -1,6 +1,7 @@
package de.srsoftware.widerhall.web;
import de.srsoftware.widerhall.Configuration;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.STGroup;
import org.stringtemplate.v4.STRawGroupDir;
@@ -8,7 +9,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Map;
@@ -24,6 +24,10 @@ public abstract class TemplateServlet extends HttpServlet {
loadTemplates();
}
protected ST getTemplate(String name){
return templates.getInstanceOf(name);
}
protected String loadFile(String filename, HttpServletResponse resp) {
var path = String.join(File.separator,baseDir,"static",filename);
var file = new File(path);

View File

@@ -142,8 +142,12 @@ public class Web extends TemplateServlet {
try {
var token = req.getParameter(TOKEN);
if (token== null || token.isBlank()) return t("Invalid or missing token!");
var user = ListMember.confirm(token);
if (user != null) return loadTemplate(INDEX,Map.of(USER,user.safeMap(),NOTES,"Confirmed list subscription!"),resp);
var listMember = ListMember.confirm(token);
if (listMember != null) {
listMember.sendConfirmationMail(getTemplate("confirmation_mail"));
return loadTemplate(INDEX,Map.of(USER,listMember.user().safeMap(),NOTES,"Confirmed list subscription!"),resp);
}
return t("Unknown user or token");
} catch (Exception e) {
LOG.debug("Failed to confirm list membership:",e);
@@ -517,7 +521,7 @@ public class Web extends TemplateServlet {
}
try {
list.requestSubscription(user,skipConfirmation);
list.requestSubscription(user,skipConfirmation,getTemplate("subscribe_mail"));
if (skipConfirmation) {
data.put(NOTES, t("Successfully subscribed '{}' to '{}'.", user.email(), list.email()));
} else {