Hi Jacques,

sorry for the delay, we were in the middle of our movement to a new ecomify headquarter.

This is now fixed in r1810260, thanks for spotting!

Regards,

Michael


Am 27.09.17 um 14:12 schrieb Jacques Le Roux:
Hi Michael,

You introduced attachmentType in this commit but the service sendMailFromScreen does not declare this parameter, nor any other service, same for attachmentTypeList.

Please check

Thanks

Jacques


Le 18/08/2017 à 21:10, [email protected] a écrit :
Author: mbrohl
Date: Fri Aug 18 19:10:41 2017
New Revision: 1805459

URL: http://svn.apache.org/viewvc?rev=1805459&view=rev
Log:
Improved: EmailServices.sendMailFromScreen improved to take multiple
attachments with appropriate type along with several email fixes.
(OFBIZ-9395)

This patch fixes a number of issues combined in a patch because of the
code dependencies.

1. it enables to add BCC adress(es) to service
OrderServices.sendOrderNotificationScreens to oversteer
ProductStoreEmailSetting of BCC the same was as for CC.

2. a method UtilValidate.isEmailList(String) is added to check a
comma separated list of email addresses, used for example to check the
String passed to the new BCC field for an Order-Notification.

3. there are improvements in EmailServices.sendMailFromScreen. The
attachment type of MailAttachments is now not only .pdf but depends on
the specific file. This has not been the case before - the mime type was
always hard coded as .pdf. The same goes for the bodyPart content-type
which is now set to the passed content type or the default text/html
type. Before this was also always set to text/html.
Additionally, an attachment that has the mime-type text/plain is not
rendered with the fop-renderer anymore but with a simple text-renderer.
Therefore it is possible to send an CSV file as attachment now.

The patch also refactors some catch-Blocks in the
EmailServices.sendMailFromScreen by using multi-catch since the e
xception handling is always the same.

Thanks Martin Becker for reporting and providing the patch.

Modified:
ofbiz/ofbiz-framework/trunk/applications/order/servicedef/services.xml
ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderServices.java
ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilValidate.java
ofbiz/ofbiz-framework/trunk/framework/common/src/main/java/org/apache/ofbiz/common/email/EmailServices.java

Modified: ofbiz/ofbiz-framework/trunk/applications/order/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/order/servicedef/services.xml?rev=1805459&r1=1805458&r2=1805459&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/order/servicedef/services.xml (original) +++ ofbiz/ofbiz-framework/trunk/applications/order/servicedef/services.xml Fri Aug 18 19:10:41 2017
@@ -34,6 +34,7 @@ under the License.
          <attribute name="body" type="String" mode="OUT" optional="true"/>           <attribute name="sendTo" type="String" mode="IN" optional="true"/>           <attribute name="sendCc" type="String" mode="IN" optional="true"/> +        <attribute name="sendBcc" type="String" mode="IN" optional="true"/>           <attribute name="note" type="String" mode="IN" optional="true"/>           <attribute name="temporaryAnonymousUserLogin" type="org.apache.ofbiz.entity.GenericValue" mode="IN" optional="true"/>           <attribute name="messageWrapper" type="org.apache.ofbiz.service.mail.MimeMessageWrapper" mode="OUT" optional="true"/>

Modified: ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderServices.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderServices.java?rev=1805459&r1=1805458&r2=1805459&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderServices.java (original) +++ ofbiz/ofbiz-framework/trunk/applications/order/src/main/java/org/apache/ofbiz/order/order/OrderServices.java Fri Aug 18 19:10:41 2017
@@ -83,6 +83,9 @@ import org.apache.ofbiz.service.ServiceU
    import com.ibm.icu.util.Calendar;
  +import org.apache.commons.lang.StringUtils;
+import org.apache.fop.apps.MimeConstants;
+
  /**
   * Order Processing Services
   */
@@ -2533,8 +2536,10 @@ public class OrderServices {
          GenericValue userLogin = (GenericValue) context.get("userLogin");
          String orderId = (String) context.get("orderId");
          String orderItemSeqId = (String) context.get("orderItemSeqId");
+        String shipGroupSeqId = (String) context.get("shipGroupSeqId");
          String sendTo = (String) context.get("sendTo");
          String sendCc = (String) context.get("sendCc");
+        String sendBcc = (String) context.get("sendBcc");
          String note = (String) context.get("note");
          String screenUri = (String) context.get("screenUri");
          GenericValue temporaryAnonymousUserLogin = (GenericValue) context.get("temporaryAnonymousUserLogin");
@@ -2589,10 +2594,17 @@ public class OrderServices {
              String xslfoAttachScreenLocation = productStoreEmail.getString("xslfoAttachScreenLocation");               sendMap.put("xslfoAttachScreenLocation", xslfoAttachScreenLocation);               // add attachmentName param to get an attachment namend "[oderId].pdf" instead of default "Details.pdf"
-            sendMap.put("attachmentName", orderId + ".pdf");
+            sendMap.put("attachmentName", (UtilValidate.isNotEmpty(shipGroupSeqId) ? orderId + "-" + StringUtils.stripStart(shipGroupSeqId, "0") : orderId) + ".pdf");
+            sendMap.put("attachmentType", MimeConstants.MIME_PDF);
          } else {
              sendMap.put("bodyScreenUri", screenUri);
          }
+
+        if (context.containsKey("xslfoAttachScreenLocationList")) {
+            sendMap.put("xslfoAttachScreenLocationList", context.get("xslfoAttachScreenLocationList")); +            sendMap.put("attachmentNameList", context.get("attachmentNameList")); +            sendMap.put("attachmentTypeList", context.get("attachmentTypeList"));
+        }
            // website
          sendMap.put("webSiteId", orderHeader.get("webSiteId"));
@@ -2636,6 +2648,7 @@ public class OrderServices {
              bodyParameters.put("partyId", placingParty.get("partyId"));
          }
          bodyParameters.put("note", note);
+        bodyParameters.put("shipGroupSeqId", shipGroupSeqId);
          sendMap.put("bodyParameters", bodyParameters);
          sendMap.put("userLogin",userLogin);
  @@ -2657,6 +2670,10 @@ public class OrderServices {
              sendMap.put("sendCc", productStoreEmail.get("ccAddress"));
          }
  +        if ((sendBcc != null) && UtilValidate.isEmailList(sendBcc)) {
+            sendMap.put("sendBcc", sendBcc);
+        }
+
          // send the notification
          Map<String, Object> sendResp = null;
          try {

Modified: ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilValidate.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilValidate.java?rev=1805459&r1=1805458&r2=1805459&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilValidate.java (original) +++ ofbiz/ofbiz-framework/trunk/framework/base/src/main/java/org/apache/ofbiz/base/util/UtilValidate.java Fri Aug 18 19:10:41 2017
@@ -691,6 +691,20 @@ public final class UtilValidate {
          if (isEmpty(s)) return defaultEmptyOK;
          return EmailValidator.getInstance().isValid(s);
      }
+
+    /**
+     * Checks a String for a valid Email-List seperated by ",".
+     */
+    public static boolean isEmailList(String s) {
+        if (isEmpty(s)) return defaultEmptyOK;
+        String[] emails = s.split(",");
+        for (String email : emails) {
+            if (!EmailValidator.getInstance().isValid(email)) {
+                return false;
+            }
+        }
+        return true;
+    }
        /** isUrl returns true if the string contains ://
       * @param s String to validate

Modified: ofbiz/ofbiz-framework/trunk/framework/common/src/main/java/org/apache/ofbiz/common/email/EmailServices.java URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/common/src/main/java/org/apache/ofbiz/common/email/EmailServices.java?rev=1805459&r1=1805458&r2=1805459&view=diff ============================================================================== --- ofbiz/ofbiz-framework/trunk/framework/common/src/main/java/org/apache/ofbiz/common/email/EmailServices.java (original) +++ ofbiz/ofbiz-framework/trunk/framework/common/src/main/java/org/apache/ofbiz/common/email/EmailServices.java Fri Aug 18 19:10:41 2017
@@ -51,6 +51,7 @@ import javax.mail.internet.MimeMultipart
  import javax.xml.parsers.ParserConfigurationException;
  import javax.xml.transform.stream.StreamSource;
  +import org.apache.fop.apps.FOPException;
  import org.apache.fop.apps.Fop;
  import org.apache.fop.apps.MimeConstants;
  import org.apache.ofbiz.base.util.Debug;
@@ -438,6 +439,12 @@ public class EmailServices {
          if (UtilValidate.isNotEmpty(xslfoAttachScreenLocationListParam)) xslfoAttachScreenLocationList.addAll(xslfoAttachScreenLocationListParam);           if (UtilValidate.isNotEmpty(attachmentNameListParam)) attachmentNameList.addAll(attachmentNameListParam);           +        List<String> attachmentTypeList = new LinkedList<String>(); +        String attachmentTypeParam = (String) serviceContext.remove("attachmentType"); +        List<String> attachmentTypeListParam = UtilGenerics.checkList(serviceContext.remove("attachmentTypeList")); +        if (UtilValidate.isNotEmpty(attachmentTypeParam)) attachmentTypeList.add(attachmentTypeParam); +        if (UtilValidate.isNotEmpty(attachmentTypeListParam)) attachmentTypeList.addAll(attachmentTypeListParam);
+
          Locale locale = (Locale) serviceContext.get("locale");
          Map<String, Object> bodyParameters = UtilGenerics.checkMap(serviceContext.remove("bodyParameters"));
          if (bodyParameters == null) {
@@ -504,9 +511,9 @@ public class EmailServices {
              List<Map<String, ? extends Object>> bodyParts = new LinkedList<Map<String, ? extends Object>>();
              if (bodyText != null) {
                  bodyText = FlexibleStringExpander.expandString(bodyText, screenContext, locale); -                bodyParts.add(UtilMisc.<String, Object>toMap("content", bodyText, "type", "text/html")); +                bodyParts.add(UtilMisc.<String, Object>toMap("content", bodyText, "type", UtilValidate.isNotEmpty(contentType) ? contentType : "text/html"));
              } else {
-                bodyParts.add(UtilMisc.<String, Object>toMap("content", bodyWriter.toString(), "type", "text/html")); +                bodyParts.add(UtilMisc.<String, Object>toMap("content", bodyWriter.toString(), "type", UtilValidate.isNotEmpty(contentType) ? contentType : "text/html"));
              }
                            for (int i = 0; i < xslfoAttachScreenLocationList.size(); i++) {
@@ -515,39 +522,51 @@ public class EmailServices {
                  if (UtilValidate.isNotEmpty(attachmentNameList) && attachmentNameList.size() >= i) {
                      attachmentName = attachmentNameList.get(i);
                  }
+
+                String attachmentType = MimeConstants.MIME_PDF;
+                if (UtilValidate.isNotEmpty(attachmentTypeList) && attachmentTypeList.size() >= i) {
+                    attachmentType = attachmentTypeList.get(i);
+                }
+
                  isMultiPart = true;
                  // start processing fo pdf attachment
                  try {
                      Writer writer = new StringWriter();
-                    MapStack<String> screenContextAtt = MapStack.create();
                      // substitute the freemarker variables...
-                    ScreenStringRenderer foScreenStringRenderer = new MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "screenfop.name", dctx.getDelegator()), - EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer", dctx.getDelegator()));
+                    ScreenStringRenderer foScreenStringRenderer = null;
+ if(MimeConstants.MIME_PLAIN_TEXT.equals(attachmentType)){
+                        foScreenStringRenderer = new MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "screentext.name", dctx.getDelegator()), + EntityUtilProperties.getPropertyValue("widget", "screentext.screenrenderer", dctx.getDelegator()));
+                    }else{
+                        foScreenStringRenderer = new MacroScreenRenderer(EntityUtilProperties.getPropertyValue("widget", "screenfop.name", dctx.getDelegator()), + EntityUtilProperties.getPropertyValue("widget", "screenfop.screenrenderer", dctx.getDelegator()));
+                    }
                      ScreenRenderer screensAtt = new ScreenRenderer(writer, screenContext, foScreenStringRenderer);                       screensAtt.populateContextForService(dctx, bodyParameters);
-                    screenContextAtt.putAll(bodyParameters);
screensAtt.render(xslfoAttachScreenLocation);
  -                    // create the input stream for the generation
-                    StreamSource src = new StreamSource(new StringReader(writer.toString()));
-
                      // create the output stream for the generation
                      ByteArrayOutputStream baos = new ByteArrayOutputStream();   -                    Fop fop = ApacheFopWorker.createFopInstance(baos, MimeConstants.MIME_PDF);
-                    ApacheFopWorker.transform(src, null, fop);
+                    if (MimeConstants.MIME_PLAIN_TEXT.equals(attachmentType)) {
+ baos.write(writer.toString().getBytes());
+                    } else {
+                        // create the input stream for the generation
+                        StreamSource src = new StreamSource(new StringReader(writer.toString())); +                        Fop fop = ApacheFopWorker.createFopInstance(baos, attachmentType);
+                        ApacheFopWorker.transform(src, null, fop);
+                    }
  -                    // and generate the PDF
+                    // and generate the attachment
                      baos.flush();
                      baos.close();
                        // store in the list of maps for sendmail....
-                    bodyParts.add(UtilMisc.<String, Object> toMap("content", baos.toByteArray(), "type", "application/pdf", "filename",
-                            attachmentName));
-                } catch (Exception e) {
-                    Debug.logError(e, "Error rendering PDF attachment for email: " + e.toString(), module); -                    return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonEmailSendRenderingScreenPdfError", -                            UtilMisc.toMap("errorString", e.toString()), locale)); +                    bodyParts.add(UtilMisc.<String, Object>toMap("content", baos.toByteArray(), "type", attachmentType, "filename", attachmentName));
+
+                } catch (GeneralException|IOException|SAXException|ParserConfigurationException |TemplateException ge) { +                    Debug.logError(ge, "Error rendering PDF attachment for email: " + ge.toString(), module); +                    return ServiceUtil.returnError(UtilProperties.getMessage(resource, "CommonEmailSendRenderingScreenPdfError", UtilMisc.toMap("errorString", ge.toString()), locale));
                  }
serviceContext.put("bodyParts", bodyParts);





Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to