Update of
/var/cvs/contributions/CMSContainer_Portlets/portlets-dynamicforms/src/java/com/finalist/portlets/responseform
In directory
james.mmbase.org:/tmp/cvs-serv3766/portlets-dynamicforms/src/java/com/finalist/portlets/responseform
Modified Files:
ResponseFormPortlet.java EmailSender.java
Log Message:
CMSC-1015 Dynamic forms send emails which are marked as spam based on dns
spf records
See also:
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer_Portlets/portlets-dynamicforms/src/java/com/finalist/portlets/responseform
See also: http://www.mmbase.org/jira/browse/CMSC-1015
Index: ResponseFormPortlet.java
===================================================================
RCS file:
/var/cvs/contributions/CMSContainer_Portlets/portlets-dynamicforms/src/java/com/finalist/portlets/responseform/ResponseFormPortlet.java,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -b -r1.16 -r1.17
--- ResponseFormPortlet.java 4 Jul 2008 16:23:34 -0000 1.16
+++ ResponseFormPortlet.java 14 Jul 2008 11:45:18 -0000 1.17
@@ -11,41 +11,22 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;
-import java.util.Arrays;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import javax.activation.DataSource;
import javax.mail.MessagingException;
-import javax.portlet.ActionRequest;
-import javax.portlet.ActionResponse;
-import javax.portlet.PortletException;
-import javax.portlet.PortletMode;
-import javax.portlet.PortletPreferences;
-import javax.portlet.PortletSession;
-import javax.portlet.RenderRequest;
-import javax.portlet.RenderResponse;
+import javax.portlet.*;
import net.sf.mmapps.commons.bridge.RelationUtil;
-import org.apache.commons.lang.StringUtils;
import net.sf.mmapps.modules.cloudprovider.CloudProvider;
import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
-import org.apache.commons.fileupload.portlet.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
-
-import org.mmbase.bridge.Cloud;
-import org.mmbase.bridge.Node;
-import org.mmbase.bridge.NodeIterator;
-import org.mmbase.bridge.NodeList;
-import org.mmbase.bridge.NodeManager;
+import org.apache.commons.fileupload.portlet.PortletFileUpload;
+import org.apache.commons.lang.StringUtils;
+import org.mmbase.bridge.*;
import org.mmbase.bridge.util.SearchUtil;
import org.mmbase.remotepublishing.PublishManager;
import org.mmbase.remotepublishing.util.PublishUtil;
@@ -53,18 +34,18 @@
import com.finalist.cmsc.mmbase.PropertiesUtil;
import com.finalist.cmsc.navigation.ServerUtil;
import com.finalist.cmsc.portlets.ContentPortlet;
-import com.finalist.pluto.portalImpl.core.CmscPortletMode;
public class ResponseFormPortlet extends ContentPortlet {
protected static final String PARAMETER_MAP = "parameterMap";
protected static final String ERRORMESSAGES = "errormessages";
- private static final int DEFAULT_MAXFILESIZE = 2; // default file size in
- // Meg
+ private static final int DEFAULT_MAXFILESIZE = 2; // default file size in
Meg
private static final long MEGABYTE = 1024 * 1024; // 1 Meg
+
+ private static final String ENCODING_UTF8 = "UTF-8";
+
private static final String FIELD_PREFIX = "field_";
- // TODO: use these constants (and clean up this mess)
private static final int TYPE_TEXTBOX = 1;
private static final int TYPE_TEXTAREA = 2;
private static final int TYPE_RADIO = 4;
@@ -78,32 +59,30 @@
private static final String DEFAULT_EMAILREGEX =
"^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$";
+ @Override
@SuppressWarnings("unchecked")
public void processView(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
Map<String, String> errorMessages = new Hashtable<String, String>();
Map<String, Object> parameterMap = new HashMap<String, Object>();
DataSource attachment = processUserRequest(request, errorMessages,
parameterMap);
- String action = request.getParameter(ACTION_PARAM);
- Map<String, Object> formfields = new HashMap<String, Object>();
- StringBuffer data = new StringBuffer();
- if (action == null) {
- response.setPortletMode(CmscPortletMode.EDIT_DEFAULTS);
- }
- else if (action.equals("edit")) {
PortletPreferences preferences = request.getPreferences();
String contentelement = preferences.getValue(CONTENTELEMENT, null);
if (contentelement != null) {
if (parameterMap.size() > 0) {
+
+ String userEmailAddress = null;
+ StringBuffer data = new StringBuffer();
+ Map<String, Object> formfields = new HashMap<String, Object>();
+
CloudProvider cloudProvider =
CloudProviderFactory.getCloudProvider();
Cloud cloud = cloudProvider.getCloud();
Node responseForm = cloud.getNode(contentelement);
NodeList formfieldList =
SearchUtil.findRelatedOrderedNodeList(responseForm, "formfield", "posrel",
"posrel.pos");
- NodeIterator formfieldIterator = formfieldList.nodeIterator();
- String userEmailAddress = null;
+ NodeIterator formfieldIterator = formfieldList.nodeIterator();
while (formfieldIterator.hasNext()) {
Node formfield = formfieldIterator.nextNode();
String number = formfield.getStringValue("number");
@@ -133,9 +112,10 @@
}
if ((type == TYPE_TEXTBOX) && sendEmail) { //If data is
used as email address, then it should be valid
- if (!isEmailAddress(userEmailAddress))
+ if (!isEmailAddress(userEmailAddress)) {
errorMessages.put(fieldIdentifier,
"view.formfield.invalid");
}
+ }
if (type == TYPE_CHECKBOX) {
if(value != null && value instanceof String){
@@ -189,12 +169,6 @@
else {
getLogger().error("No contentelement");
}
- // switch to View mode
- response.setPortletMode(PortletMode.VIEW);
- }
- else {
- getLogger().error("Unknown action: '" + action + "'");
- }
}
@@ -309,13 +283,14 @@
String emailTextBefore = responseform.getStringValue("emailbody");
String emailTextAfter = responseform.getStringValue("emailbodyafter");
- String senderEmailAddress = userEmailAddress;
- String senderName = userEmailAddress;
- if (StringUtils.isBlank(userEmailAddress)) {
- senderEmailAddress =
responseform.getStringValue("useremailsender").trim();
- senderName =
responseform.getStringValue("useremailsendername").trim();
+ String senderEmailAddress =
responseform.getStringValue("useremailsender").trim();
+ String senderName =
responseform.getStringValue("useremailsendername").trim();
+ if (StringUtils.isNotBlank(userEmailAddress)) {
+ senderName = userEmailAddress + " [CMS]";
+ }
+ if (!isEmailAddress(senderEmailAddress)) {
+ return false; //Last check email address
}
- if (!isEmailAddress(senderEmailAddress)) return false; //Last check
email address
emailTextBefore = emailTextBefore.trim();
emailText.append(emailTextBefore);
@@ -327,9 +302,11 @@
emailText.append(emailTextAfter);
}
- String emailAddressesValue =
responseform.getStringValue("emailaddresses").replaceAll(" ","");
+ String emailAddressesValue =
responseform.getStringValue("emailaddresses");
String emailSubject = responseform.getStringValue("emailsubject").trim();
- List<String> emailList = Arrays.asList(emailAddressesValue.split(";"));
+
+ List<String> emailList = splitEmailAddresses(emailAddressesValue);
+
if (!isEmailAddress(emailList)) {
getLogger().error("error sending email. Some of the following
emailaddresses are incorrect: " + emailList.toString());
return false; //Could not sent email because of false email address
@@ -337,7 +314,7 @@
try {
EmailSender.getInstance().sendEmail(senderEmailAddress, senderName,
emailList, emailSubject, emailText.toString(),
- attachment);
+ attachment, userEmailAddress);
sent = true;
}
catch (UnsupportedEncodingException e) {
@@ -350,6 +327,17 @@
}
+ private List<String> splitEmailAddresses(String emailAddressesValue) {
+ List<String> emailList = new ArrayList<String>();
+ StringTokenizer addresssTokenizer = new
StringTokenizer(emailAddressesValue, " ,;");
+ while(addresssTokenizer.hasMoreTokens()) {
+ String address = addresssTokenizer.nextToken();
+ emailList.add(address);
+ }
+ return emailList;
+ }
+
+
@SuppressWarnings("unchecked")
@Override
protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
@@ -397,6 +385,7 @@
}
+ @Override
public void processEdit(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
super.processEdit(request, response);
@@ -418,12 +407,12 @@
Map<String, Object> parameterMap) {
List<FileItem> fileItems = null;
DataSource attachment = null;
- String encoding = "UTF-8";
+
List<String> parameterValues = null;
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
PortletFileUpload upload = new PortletFileUpload(factory);
- upload.setHeaderEncoding(encoding);
+ upload.setHeaderEncoding(ENCODING_UTF8);
fileItems = upload.parseRequest(request);
}
catch (FileUploadException e) {
@@ -444,15 +433,15 @@
else if (parameterMap.get(fileItem.getFieldName())
instanceof ArrayList){
parameterValues = (ArrayList<String>)
parameterMap.get(fileItem.getFieldName());
}
- parameterValues.add(fileItem.getString(encoding));
+ parameterValues.add(fileItem.getString(ENCODING_UTF8));
parameterMap.put(fileItem.getFieldName(),
parameterValues);
}
else{
- parameterMap.put(fileItem.getFieldName(),
fileItem.getString(encoding));
+ parameterMap.put(fileItem.getFieldName(),
fileItem.getString(ENCODING_UTF8));
}
}
catch (UnsupportedEncodingException e) {
- getLogger().error("UnsupportedEncoding " + encoding);
+ getLogger().error("UnsupportedEncoding " + ENCODING_UTF8);
}
}
else {
@@ -473,21 +462,33 @@
}
public boolean isEmailAddress(String emailAddress) {
- if (emailAddress == null) return false;
- if (StringUtils.isBlank(emailAddress)) return false;
+ if (emailAddress == null) {
+ return false;
+ }
+ if (StringUtils.isBlank(emailAddress)) {
+ return false;
+ }
String emailRegex = getEmailRegex();
return emailAddress.trim().matches(emailRegex);
}
public boolean isEmailAddress(List<String> emailList) {
- if (emailList == null) return false;
- if (emailList.isEmpty()) return false;
+ if (emailList == null) {
+ return false;
+ }
+ if (emailList.isEmpty()) {
+ return false;
+ }
String emailRegex = getEmailRegex();
for (String email : emailList) {
- if (email == null || StringUtils.isBlank(email)) return false;
- if (!email.matches(emailRegex)) return false;
+ if (email == null || StringUtils.isBlank(email)) {
+ return false;
+ }
+ if (!email.matches(emailRegex)) {
+ return false;
+ }
}
return true;
Index: EmailSender.java
===================================================================
RCS file:
/var/cvs/contributions/CMSContainer_Portlets/portlets-dynamicforms/src/java/com/finalist/portlets/responseform/EmailSender.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- EmailSender.java 9 Jun 2008 21:23:06 -0000 1.4
+++ EmailSender.java 14 Jul 2008 11:45:18 -0000 1.5
@@ -6,7 +6,11 @@
import javax.activation.DataHandler;
import javax.activation.DataSource;
-import javax.mail.*;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.Session;
+import javax.mail.Transport;
import javax.mail.internet.*;
import org.apache.commons.lang.StringUtils;
@@ -55,14 +59,32 @@
}
- /*
- * @param emailFrom The email address of the sender @param nameFrom The name
- * of the sender @param toAddresses The list of email addresses of the
- * receivers @param subject The subject of the email @param body The body of
- * the email @param fileName The name of the attachment
+ /**
+ * @param emailFrom The email address of the sender
+ * @param nameFrom The name of the sender
+ * @param toAddresses The list of email addresses of the receivers
+ * @param subject The subject of the email
+ * @param body The body of the email @param fileName The name of the
attachment
+ * @param attachment Binary part to add to the email message
*/
public void sendEmail(String emailFrom, String nameFrom, List<String>
toAddresses, String subject, String body,
- DataSource dataSource) throws UnsupportedEncodingException,
MessagingException {
+ DataSource attachment) throws UnsupportedEncodingException,
MessagingException {
+ sendEmail(emailFrom, nameFrom, toAddresses, subject, body, attachment,
null);
+ }
+
+
+ /**
+ * @param emailFrom The email address of the sender
+ * @param nameFrom The name of the sender
+ * @param toAddresses The list of email addresses of the receivers
+ * @param subject The subject of the email
+ * @param body The body of the email @param fileName The name of the
attachment
+ * @param attachment Binary part to add to the message
+ * @param replyTo Address as reply-to header in the message
+ */
+ public void sendEmail(String emailFrom, String nameFrom, List<String>
toAddresses,
+ String subject, String body, DataSource attachment, String replyTo)
+ throws MessagingException, UnsupportedEncodingException,
AddressException {
if (StringUtils.isBlank(emailFrom)) {
emailFrom = PropertiesUtil.getProperty("mail.system.email");
}
@@ -78,7 +100,18 @@
addresses[i] = new InternetAddress(toAddresses.get(i));
}
message.addRecipients(Message.RecipientType.TO, addresses);
+
+ if (StringUtils.isNotBlank(replyTo)) {
+ message.setReplyTo(InternetAddress.parse(replyTo));
+ }
+
message.setSubject(subject);
+ Multipart multipart = createMultiPart(body, attachment);
+ message.setContent(multipart);
+ Transport.send(message);
+ }
+
+ private Multipart createMultiPart(String body, DataSource dataSource)
throws MessagingException {
// create the message part
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(body);
@@ -93,18 +126,34 @@
messageBodyPart.setFileName(dataSource.getName());
multipart.addBodyPart(messageBodyPart);
}
- message.setContent(multipart);
- Transport.send(message);
+ return multipart;
}
- /*
- * @param emailFrom The email address of the sender @param nameFrom The name
- * of the sender @param emailTo The email address of the receiver @param
- * subject The subject of the email @param body The body of the email
+ /**
+ * @param emailFrom The email address of the sender
+ * @param nameFrom The name of the sender
+ * @param emailTo The email address of the receiver
+ * @param subject The subject of the email
+ * @param body The body of the email
*/
public void sendEmail(String emailFrom, String nameFrom, String emailTo,
String subject, String body)
throws UnsupportedEncodingException, MessagingException {
+ sendEmail(emailFrom, nameFrom, emailTo, subject, body, null);
+ }
+
+
+ /**
+ * @param emailFrom The email address of the sender
+ * @param nameFrom The name of the sender
+ * @param emailTo The email address of the receiver
+ * @param subject The subject of the email
+ * @param body The body of the email
+ * @param replyTo Address as reply-to header in the message
+ */
+ public void sendEmail(String emailFrom, String nameFrom, String emailTo,
String subject,
+ String body, String replyTo) throws MessagingException,
UnsupportedEncodingException,
+ AddressException {
if (StringUtils.isBlank(emailFrom)) {
emailFrom = PropertiesUtil.getProperty("mail.system.email");
}
@@ -115,6 +164,9 @@
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailFrom, nameFrom));
message.addRecipient(Message.RecipientType.TO, new
InternetAddress(emailTo));
+ if (StringUtils.isNotBlank(replyTo)) {
+ message.setReplyTo(InternetAddress.parse(replyTo));
+ }
message.setSubject(subject);
message.setText(body);
Transport.send(message);
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs