Generating feedback messages on server-side vs client-side?

Hello,
I am maintening a client/server app (Swing client, no Web pages), basically an order processing system. The biggest part of it is to verify the conformity of orders to a set of business rules.
As usual, some of the verification can be made early on the client-side, but most of the verification work is done on the server-side. My problem is, I don't find a very satisfactory way to generate the user feedback to be displayed to the user.
If I generate them as Strings (or HTML Strings) on the server, where the rules are checked, this constrains the way these can be displayed on the client, and makes maintenance of the human-readable strings awkward and risky (e.g. localization, or restructuring the messages, like sorting them by severity vs by affected entity).
If I generate them on the client, I need a class to vehicle the diagnosis form server to client, and this class and its usage tends to become awkward in itself.
Concretely:
The initial version generated human-readable strings on the server, which assumed the messages would be displayed as strings in a JOptionPane.
Moreover, the logic evolved to distinguish between Info, Warning and Error messages, to be displayed in different colors of course, so the Strings evolved into HTML Strings, still generated on the server.
Do you think this approach is safe?
I'm afraid a simple maintenance of the strings (like, sorting the errors by severity vs by affected entity, filtering the strings,...) becomes a server-side development, which is a bit more risky (I would have to review code ownership policies, VCS and code-sharing policies,... to let less experienced staff maintain the darn error Strings).
Moreover, if the client app evolve to display the errors in complex widgets (colors in a tree/table, with tooltips), the server-side generated HTML strings would be constraining : coloring or tooltipping Tree nodes would now mean parsing the String to extract the "error level" or the "affected entity", which is quite inelegant and inflexible.
My current idea was then to use a collecting parameter to collect validation messages on the server, and traverse them on the client:
I designed a naive ErrorList class, with methods such as addInfo(String), addWarning(String), addError(Strin), and the corresponding getErrors() and hasErrors()/hasWarnings() methods. I can then generate the Strings (or whatever widget fits better, such as a table) on the client side. Moreover, I can add the client-side messages to the bag...
All nice and well, but the customer requested that the error messages be formatted such as "The profile <profile name in bold> does not allow you to order service <service name in italics>".
To format that on the client, my ErrorList class should evolve so that for a given message, I know that the error is of type ("incompatibility between profile and service", that the service is X and the prodile is Y).
That forces me to add in some API (shared by the client and server) the list of error types, and the data each error type requires.
I can evolve my ErrorList API to break up messages into a DTO giving (type, affected entity, arg1, arg2,...), but anyway the server and client have to agree on what is arg1, etc... which is a hidden coupling.
Do you use and recommend such an approach for server-to-client feedback: a collecting parameter in which the server puts the "errors", and that the client traverses to display the messages)? In particuler, isn't the coupling hard to maintain?
Thansk in advance,
J.

Presumably you are not over-engineering in that you
know that localization is a problem rather than that
in all possible worlds in might be.I appreciate your delicate questioning... I definitely have read much ruder ways to say YAGNI to a poster...
I do know that the customer will knit-pick to reword and reformat the messages. But I won't need to translate the messages to other locales. In that regard, I ackowledge my usage of the term localization is a bit liberal, but I think I should to extract the messages from the code, to be able to maintain them separately - keeping only experienced staff's hand in the server's core.
That is actually my question 1): from experience, is it worth the trouble to separate code and human-readable text, knowing that the text WILL have to be maintained?
Question 2 is about how to implement this.
In particular, the built-in MessageFormat templating engine, though originally introduced for i18n, actually suits my needs (including MessageFormat-built messages) and developing or using any other templating engine would probably be an overkill.
Given that there are two types of messages.
1. Fixed
2. Parameter driven.
In both cases you need to return an id which
identifies the message. The client has a locale
specific resource source which has a matching id.
From there a string is derived.
If the error requires parameters then the string has
formatting values in it and it s written with the
returned parameters. See java.text.MessageFormat.Yes. In some cases I don't know yet whether parameters will be displayed. I can conservatively assume the message requires a MessageFormat, and give all parameters (in my case, use rname, profile name, command id, service name, order date,...), whether thay are displayed or not in the final message.
Be warned you MUST deal with the possibility that a
id does not exist in the client, if so have a default
message that displays the id and any parameters.Good point.
"The customer name field can not be longer than 15
characters".
In the above the "15" would a parameter.Yes. The trouble is, you have to document somewhere (Sun suggests in the resource bundle file), that for error id #123456, the number of characters in in the '{0}', or in the {6}. I don't feel confident with that (this is the "coupling" part in my question 2�).
Thanks for your advices.

Similar Messages

  • How to send Subtopic Message From Server-Side to Client ?

    I’m new at flex and i have a new question about Flex
    Message Service.
    How to send messages from Server-Side Java Code with
    Subtopic?
    For example.
    I customed a Flex Message Adapter in Tomcat Server , with
    this Adapter , i can send message to Client with following code .
    ---------------------Send message to Client------------
    MessageBroker msgBroker =
    MessageBroker.getMessageBroker(null);
    String clientID = UUIDUtils.createUUID(false);
    AsyncMessage msg = new AsyncMessage();
    msg.setDestination("CustomMsgServiceDes");
    msg.setClientId(clientID);
    msg.setMessageId(UUIDUtils.createUUID(false));
    msg.setTimestamp(System.currentTimeMillis());
    msg.setBody(clientID + "this is my message from server! \n");
    msgBroker.routeMessageToService(msg, null);
    ---------------------Send message to Client------------
    But i want send a message that have Subtopic to the Client ,
    How to do ?
    Thank you for reply.

    There's a white paper that talks about this subject -
    http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=8f1eb6ea

  • How can i dispaly an Error Message from Server Side To form

    Hi All,
    How can i dispaly an Error Message from Server Side To form side .
    i try several ways nothing succed.
    i put the error in stack and after call the procedure from form i added
    Qms$Trans_Errors.Display_Messages;
    and because it is an error not informantional error the error screen displayed and enter
    in infinite loop acts like flashing .
    can any one help me please i use C/S Headstart6i and Designer 6i
    thanks alot
    radi

    hi,
    thanks alot lauri.
    yr code work only using information message but in error message its still the same .
    the error window still flash and enter in infinite loop of executeing the same triggers.
    thanks again
    radi

  • [ASK] Duplicated Error Message on server side validation

    I want to use server-side validation instead of client-side validation for my input form as suggested by John Stageman, by:
    1). set required=false
    2). set showRequired=true
    3). Ensure that the attribute is mandatory in the model layer
    It seems to work, except that the error message displayed by <af:messages> is kinda weird bcause they are repeated, for example;
    Attribute Attr1 in MyAM.MyView is required
    Attribute Attr2 in MyAM.MyView is required
    - Attribute Attr1 in MyAM.MyView is required
    - Attribute Attr2 in MyAM.MyView is required
    Attribute Attr1 in MyAM.MyView is required
    Attribute Attr2 in MyAM.MyView is requiredand the number of reduplication seems growing each time I click the Save button.
    besides, for "value required" validation, the component related error message is not displayed (the red message under the component).
    Any clues?
    Thanks..
    @John : I decide to open it as new thread bcause it seems to be different question..

    Hi, thanks for your fast response Frank,
    My page has several iterator binding and I have tried to set all of their refresh options as you suggested, but the problem still remains the same T_T
    Maybe somewhere, someone has put some additional manual validation, bcause it is a team project, I still dont know where to find those phantom codes..
    Regards,
    from island of gods

  • Logging of SOAP messages at server side, Axis 1.2, NO SoapMonitor / TCPMon.

    Hello,
    I�m looking for a way to log all SOAP communication at a Axis Server.
    I want to log the messages into my logdatabase or to files at least.
    I am not interrested af SOAPMonitor or TCPMonitor, those are good tools but not for my purposes.
    Anyone can help me out?

    Hi,
    You should have a look at the Axis users guide, under "More deployment - Handlers and Chains". This part describes a LogHandler to be included in the WSDD that basically logs information about the requests and/or responses.
    Also look at the class org.apache.axis.handlers.LogHandler

  • Error message during server side process

    Bonjour,
    In my application's method i call a standard r/3 function for created an order in IS-MEDIA.
    In certain cases this function send an message id type 'E'.
    This message causes the error: HTTP 500 - on my BSP page.
    Is-it possible to avoid this ?
    Best regards.

    check this thread
    https://forums.sdn.sap.com/click.jspa?searchID=3157097&messageID=70898

  • Changes in server side java file not reflecting in Client side java code?

    Hi friends,
    iam using eclipse IDE, JBoss server, SWING GUI and Oracle DB
    ( looks like : SWINGGUI (Client) <--> EJB's (serverside) <---oracle )
    my problem is , when i make change in server side bean file, that changes are not reflecting in GUI programs.
    (for ex: iam adding settr and getter for a field and using that in GUI program. but its not identifying that setter or getter).
    please tell me what should i do for every change done to server side program, that should reflect / available to GUI?

    my problem is , when i make change in server side bean file, that changes are not reflecting in GUI programs.
    (for ex: iam adding settr and getter for a field and using that in GUI program. but its not identifying that setter or getter).what do you mean it's not "identifying" the methods?
    you have to call those methods you know
    are you getting NoSuchMethodError?
    please tell me what should i do for every change done to server side program, that should reflect / available to GUI?you haven't posted any code or error messages that might help us debug

  • How to use server-side classes in a web service proxy client ?

    Greetings,
    I'm using WebLogic 10.3 with Workshop 10.3 on Windows. I generate a Web Service client in Workshop. There are two options in the New->Others->Web Service category: ClientGen Web Service Client and Web Service Client. I've chosen the second one as it's a JAX-WS Web Service and I think that the first one (ClientGen Web Service is to be used with JAX-RPC Web Services. The proxy is generated but, since the Web Service is using POJOs as parameters, a new version of these POJOs is also generated. For example, my Web Service has an operation like: public OrderStatus putOrder (Order), where OrderStatus and Order are application scoped POJOs. The proxy generation process generates a _PortType class which is supposed to be used by the calling client. This class defines an operation public OrderStatus putOrder(Order), but the OrderStatus and Order classes aren't the original ones but the generated ones. The issue is that these generated classes aren't completely equivalent to the original ones, for examples all lists become arrays, the constructors are different, etc. This is extrememly annouying. Is there any option to say to the proxy generation process to keep with the server-side classes ?
    many thanks in advance for any help.
    Nicolas

    The only solution to this problem seems to be using dynamic proxies. But it doesn't work neither as the following code:
    Service service = Service.create(new URL("http://localhost:7001/OrderServiceProject/OrderService?WSDL"),
    new QName("http://www.simplex_software.fr/demo/services", "OrderService"));
    OrderService orderService = service.getPort(new QName("http://www.simplex_software.fr/demo/services", "OrderServicePort"), OrderService.class);
    raises the following exception:
    16 déc. 2009 19:55:51 com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
    INFO: Dynamically creating request wrapper Class fr.simplex_software.demo.services.jaxws.PutOrder
    16 déc. 2009 19:55:51 com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
    INFO: Dynamically creating response wrapper bean Class fr.simplex_software.demo.services.jaxws.PutOrderResponse
    16 déc. 2009 19:55:51 com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
    INFO: Dynamically creating request wrapper Class fr.simplex_software.demo.services.jaxws.GetOrderStatus
    16 déc. 2009 19:55:51 com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
    INFO: Dynamically creating response wrapper bean Class fr.simplex_software.demo.services.jaxws.GetOrderStatusResponse
    Exception in thread "main" java.lang.IllegalArgumentException: fr.simplex_software.demo.services.OrderService is not an interface
         at java.lang.reflect.Proxy.getProxyClass(Proxy.java:362)
         at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:630)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:331)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:313)
         at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:295)
         at javax.xml.ws.Service.getPort(Service.java:92)
         at fr.simplex_software.demo.client.OrderServiceClient.main(OrderServiceClient.java:23)
    As a matter of fact, fr.simplex_software.demo.services.OrderService is not an interface but, nevertheless, it's a SEI and it was generated as it is by the IDE Web Service wizard. Big, big confusion ! Of course, this sample works perfectly with Metro, in NetBeans using Glassfish.

  • How to start streaming from server side after applet initialized on client

    Hi,
    I am using JSP for on demand streaming server.
    I have included an applet in jsp page which start new player on client side after on streamreceive event.
    But my problem is how to give call to server that applet on client side has been initialized and now streaming can go on.
    Is there any method / way to call class file which will start streaming?

    Oracle is designed to support connection from client to server. The client originates the connection.
    If you want the server to initiate the connection, you need to make the server pretend it is a client. Oracle even does this internally, when they want to use 'External Procedures'
    You may also use Oracle's Message Queue mechanism, called 'Advanced Queueing' to use a 'publish subscribe' model instead of a connection model. That is discussed in the Advanced Queue manual in the documentation at http://docs.oracle.com
    Finally, you can explore the possibility of using RMI from the database, as discussed in the Java related documentation at the same location.

  • Server side rule filtering and message colorization

    I've been using server side rule filtering (Sieve) to handle all my mail filtering, mainly because I don't have a .Mac account and I have multiple machines that I access my mail from. This setup works really well except I have not been able to figure out how to color a message.
    I've searched and read through emails, but I haven't seen anything else about this problem. I even found a message that had been colorized by Mail's Junk filter, and found that Mail adds an additional mime part onto the message which is a property list that specifies the color of the message.
    What I really want is some way that I can set a header on my message, which Mail will see and apply that color to the message when it caches it on my Mac. A lot of my messages get moved to specific folders, but I still want to colorize them, and as far as I've seen, Mail's rules only work on messages that end up in the INBOX.
    Although I fear that its not possibly, I figured I'd ask for help if anyone has encountered similar problem and solved it.
    -d

    The IMAP-protocol (I suppose that's the one you use, otherwise server side mail filtering won't be visible in Mail.app) does not have any mechanism to transmit colorization information to the client. You have to set up these manually on each client.

  • Turning off server side stack trace in error message for weblogic81

    Hi,
    I am seeing server side stack trace in getMessage() method which is being stuffed
    by application server. I am using weblogic 81. Could you please let me know how
    to turn off that in getMessage() to return my only original message?
    Thanks
    Praveen

    Did you solve this problem? I am facing this problem and don't seem to solve with
    "Instrument Stack Traces" flag
    "Franck" <[email protected]> wrote:
    >
    Hi there,
    In order to manage my own exceptions in some EJB, i have developped some
    classes
    extending Exception.
    Now i would like to display proper messages to the final user, based
    on the messages
    defined in my exception classes.
    Using standard try/catch, i can easily get reference to the exception
    that can
    occur during EJB execution.
    The problem is that my message (myException.getMessage) is followed by
    the extra
    long message generated by the Server and starting with "Start server
    side stack
    trace:".
    For exemple :
    com.xx.ejb.DamageHistoryException: Can't find the price for this object
    (objId=7569,
    sizeCode=LI, colorCode=2)
    Start server side stack trace:
    com.xx.ejb.DamageHistoryException: Can't find the price for this object
    (objId=7569,
    sizeCode=LI, colorCode=2)
    at com.xx.ObjectAccess.getObjectPrice(Unknown Source)
    at com.xx.ejb.ObjectBusinessService.getObjectPrice(Unknown Source)
    <....>
    about 20 lines here !!
    <....>
    Any idea about how to avoid the extra message ??
    Thanx in advance
    Franck

  • Establish a connection through RF modem's on client & server side & to set up PPP communication for data transfer

    hi
    can any1 over here help me out in how to establish connection between 2 RF modem's for data transfer , between client & server USing LABVIEW?
    I want to establish a connection between 2 PC's through  RF modem on client & server side & to set up PPP communication for data transfer.
    (I have tried data transfer through RS-232 using TCP/IP whn the 2 PC's are connected over ethernet... which is working.
    I also tried connecting loopback cable between 2 PC's COM port & geting data transfer using VIsa configure serial port & other visa functions  ... which is working)
    can u guide me how to establish connection between 2 RF modem's using LABview?
    & how does the data transfer take place between 2 RF modems through RS-232?
    is it using TCP/IP?
    If you got any links to go abt this issue do send me related links .. or any examples .....
    I am currently using Labview version 8.
    Waiting in anticipation.. reply ASAP..
    thanking you
    Regards
    Yogan..

    Howdy yogan,
    Maybe you could clarify a few things for me, and we'll see how we can help ya. TCP/IP protocol occurs through an ethernet connection; RS-232 communication occurs through an RS-232 serial connection, typically through a cable that has a DB9 connector on both ends. Do you mean that the RF modems in question have the option to communicate via RS-232 and/or via TCP/IP ethernet? Specific information like the manufacturer of your RF modems, the model number of your RF modems, and how you connect the modems to the PC would enable us to give you more efficient support.
    You can check our Instrument Driver Network (IDNet) to see if a plug-and-play/IVI driver already exists for your RF modem. (You'll need to know its manufacturer and model number.) In the case that you do find an IDNet driver for your modem, you can use this KnowledgeBase article for instructions on how to use the driver.
    Another excellent resource to consider is the NI Example Finder. You can access this within LabVIEW by navigating to Help»Find Examples and then searching for serial or TCP/IP examples.
    Message Edited by pBerg on 03-10-2008 04:35 PM
    Warm regards,
    pBerg

  • How to automate accept client of the server side?

    Hi.....
    I am a beginner of using J2ME to developing my final year project. I have some problem of using bluetooth packet. I can't accept again the client message when the server accepted before. Any one can solve my problem? How can I using the loop or timer to accept the client message without using acceptAndOpen() packet? Thank a lot.....
    The sample code is here:
    - Server side
    public class BluetoothServer implements Runnable {
         private GameMIDlet gameMIDlet;
         private HandleSetting setting;
         private HandleScore score;
         private ScreenGame screenGame;
         private int playerMethod;
         //private GUIGameServer guiGameServer;
    StreamConnectionNotifier notifier;
    StreamConnection conn;
    LocalDevice localDevice;
    ServiceRecord serviceRecord;
    InputStream input;
    OutputStream output;
    private boolean isInit;
    private boolean isReady;
    private static String serverUrl = "btspp://localhost:" + ScreenMultiPlay.SHARE_UUID + ";name=GameServer;authorize=true";
    public BluetoothServer(GameMIDlet gameMIDlet,HandleSetting setting, HandleScore score, int playerMethod) {
         this.gameMIDlet = gameMIDlet;
    this.setting = setting;
              this.score = score;
              this.playerMethod = playerMethod;
         isReady = false;
    isInit = false;
    Thread accepterThread = new Thread(this);
    accepterThread.start();
    public void run() {
    if (!isInit) {
    // Initialization is done in the thread to avoid dead lock 'isInit' ensures it is done once only
    try {
    conn = null;
    localDevice = LocalDevice.getLocalDevice();
    localDevice.setDiscoverable( DiscoveryAgent.GIAC );
    notifier = (StreamConnectionNotifier)Connector.open(serverUrl);
    } catch (BluetoothStateException e) {       
    System.err.println( "BluetoothStateException: " + e.getMessage() );
    } catch (IOException e) {       
    System.err.println( "IOException: " + e.getMessage() );
    isInit=true;
    System.out.println( "Starting Echo Server" );      
    try {
    System.out.println("\n\nServer Running...");
    isReady=true;
    if (isReady) {
         try {
                        screenGame = new ScreenGame(this.gameMIDlet,this.setting,this.score,playerMethod);
              screenGame.start();
    Display.getDisplay(gameMIDlet).setCurrent(screenGame);
                   } catch(Exception e) {
                        gameMIDlet.showErrorMsg(null);
    // Pauses thread until Transmission occurs
    conn = notifier.acceptAndOpen();
    // Read Data Transmission
    String msg = ScreenMultiPlay.readData(conn);
    System.out.println("Received Message from Client: " + msg);
    // Send Back a Message
    msg = "Hello Back from Server";
    output = conn.openOutputStream();
    output.write(msg.length()); // length is 1 byte
    output.write(msg.getBytes());
    output.close();
    } catch (Exception ex) {
    System.err.println("Bluetooth Server Running Error: " + ex);     
    public void destroy() {
    //isClosed = true;
    // finilize notifier work
    if (notifier != null) {
    try {
    notifier.close();
    isInit=false;
    } catch (IOException e) {} // ignore
    // wait for acceptor thread is done
    /*try {
    accepterThread.join();
    } catch (InterruptedException e) {} // ignore*/
    -Client side
    class BluetoothClient implements DiscoveryListener {
         private GameMIDlet gameMIDlet;
         private HandleSetting setting;
         private HandleScore score;
         private ScreenGame screenGame;
         private int playerMethod;
    private DiscoveryAgent discoveryAgent;
    private RemoteDevice[] remoteDevices;
    private UUID[] uuidSet;
    private String serviceUrl;
    public BluetoothClient(GameMIDlet gameMIDlet,HandleSetting setting, HandleScore score, int playerMethod) {
    this.gameMIDlet = gameMIDlet;
    this.setting = setting;
              this.score = score;
              this.playerMethod = playerMethod;
    try {
    LocalDevice localDevice = LocalDevice.getLocalDevice();
    discoveryAgent = localDevice.getDiscoveryAgent();      
    discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this);
    //-----go to deviceDiscovered()-----------------
    } catch (Exception e) {
    System.out.println(e);
    public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
    try {
    // Get Device Info
    System.out.println("Device Discovered");
    System.out.println("Major Device Class: " + cod.getMajorDeviceClass() + " Minor Device Class: " + cod.getMinorDeviceClass());
    System.out.println("Bluetooth Address: " + btDevice.getBluetoothAddress());
    System.out.println("Bluetooth Friendly Name: " + btDevice.getFriendlyName(true));
    // Search for Services
    uuidSet = new UUID[1];
    uuidSet[0] = ScreenMultiPlay.SHARE_UUID;
    int searchID = discoveryAgent.searchServices(null,uuidSet,btDevice,this);
    //-------------go to inquiryCompleted()----------------------
    } catch (Exception e) {
    System.out.println("Device Discovered Error: " + e);     
    public void inquiryCompleted(int discType) {
    System.out.println("InquiryCompleted");
    //---------------go to servicesDiscovered()------------------------
    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
    System.out.println("ServicesDiscovered");
    // in this example there is only one service
    for(int i=0;i<servRecord.length;i++) {      
    serviceUrl = servRecord.getConnectionURL(0,false);
    //---------------go to serviceSearchCompleted()--------------------
    public void serviceSearchCompleted(int transID, int responseCode) {   
    if(responseCode == SERVICE_SEARCH_ERROR)
    System.out.println("SERVICE_SEARCH_ERROR\n");
    if(responseCode == SERVICE_SEARCH_COMPLETED) {
    System.out.println("SERVICE_SEARCH_COMPLETED\n");
    System.out.println("Service URL: " + serviceUrl);
    StreamConnection conn = null;
    try {
         String msg = "Say Hello World";
    conn = (StreamConnection)Connector.open(serviceUrl);
    OutputStream output = conn.openOutputStream();
    output.write(msg.length());
    output.write(msg.getBytes());
    output.close();
    System.out.println(ScreenMultiPlay.readData(conn));
    } catch (Exception ex) {
         System.out.println(ex);
    } finally {
         try {
         conn.close();
         } catch (IOException ioe) {
         System.out.println("Error Closing connection " + ioe);
    if(responseCode == SERVICE_SEARCH_TERMINATED)
    System.out.println("SERVICE_SEARCH_TERMINATED\n");
    if(responseCode == SERVICE_SEARCH_NO_RECORDS)
    System.out.println("SERVICE_SEARCH_NO_RECORDS\n");
    if(responseCode == SERVICE_SEARCH_DEVICE_NOT_REACHABLE)
    System.out.println("SERVICE_SEARCH_DEVICE_NOT_REACHABLE\n");

    This question isn't logical at all. You don't execute javascript on the server. But if you want to waste time on it. .. look at Rhino http://www.mozilla.org/rhino/
    Best of luck...

  • Vacation messages / server side mail rules

    With WebMail depreciated in OS X Server, is there a recommended (incorporated) way for users to configure vacation messages and other server side rules?

    The seive rules are referenced by the imap server on OS X and it is responsible for the mail sort. The old webmail (SquirrelMail) and the newer webmail on Lion (Roundcube) were only writing the rules that the sieve engine of the server were reading.  In other words, the webmail doesn't handle the sorting of the incoming messages, its built in filter settings write the rules that the server uses to sort them.
    In Roundcube, that is the managesieve plugin. By default, the rules get saved in /Library/Server/Mail/Data/rules/[user UniqueID]/dovecot.sieve with the new Roundcube and older rules are default.sieve. Dovecot seems to look for one or the other and uses it.
    So, and I still have to read (and if anyone can answer!) since I've not looked at this since 10.8 server has first come out:  They moved the mailstor moved in ML, but does Dovecot still have sieve rules ENABLED or does that require a .conf change?
    To answer your configuration question:
    if you're comfortable with editing a text file, Roundrube is VERY simple to configure in my opinion. Everything is well commented in the settings files. Almost all of the settings are having it connect to your IMAP and SMTP server, same as an email client's settings.  And that's it, you don't need to compile anything to use it.
    You will need to setup MySQL or ProtegeSQL with it, but they have scripts that setup the tables for you, again, pretty simple.  PERSONALLY, I chose to install MySQL (they have a Mac .pkg install and a System Preference Pane for it).  I did not want to use the ProtegeSQL Apple supplies with OS X because we've all learned this lesson: who knows when they'll abandon THAT and leave us all scrambling for a solution again.
    This way, my SQL install is indepenent, ready for the next OS upgrade without wondering if Apple will take it away, or even transportable to another platform.

  • Server side rule - inline forwarding of a message

    We have a solution that generates custom x-header on all emails (via an Outlook Add-in).  Using Outlook, User A creates a server-side rule which forwards messages onto User B.  User B receives a message without the custom
    x-header.  My question is how can I retain the custom x-header, at the moment I cannot think of any way!
    The server-side rule can use 'forward as attachment' which keeps the custom x-header in the attached message, but the 'inline forward' action (where the forward message is embedded into the body of the new message) doesn't.  Requirement is for both
    types of forwarding to function!
    Thanks
    A

    Have you looked at using a Transport Rule instead ?, because Transport Rules allow you to process messages in the Transport Pipeline you should be able to copy the Forward recipient on the message and that will means they will get an exact copy of the
    message.
    Cheers
    Glen

Maybe you are looking for