You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2006/06/02 14:39:28 UTC

svn commit: r411144 - /james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java

Author: norman
Date: Fri Jun  2 05:39:27 2006
New Revision: 411144

URL: http://svn.apache.org/viewvc?rev=411144&view=rev
Log:
Let it deal with encoded subjects

Modified:
    james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java

Modified: james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java?rev=411144&r1=411143&r2=411144&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java (original)
+++ james/server/trunk/src/java/org/apache/james/transport/mailets/AddSubjectPrefix.java Fri Jun  2 05:39:27 2006
@@ -22,6 +22,7 @@
 
 import org.apache.mailet.GenericMailet;
 import org.apache.mailet.Mail;
+import org.apache.mailet.RFC2822Headers;
 
 /**
  * Add an prefix (tag) to the subject of a message <br>
@@ -60,15 +61,88 @@
      *             if an error arises during message processing
      */
     public void service(Mail mail) throws MessagingException {
+        String newSubject = null;
         MimeMessage m = mail.getMessage();
 
         String subject = m.getSubject();
 
         if (subject != null) {
-            m.setSubject(subjectPrefix + " " + subject);
+            // m.setSubject(subjectPrefix + " " + subject);
+            newSubject = subjectPrefix + " " + m.getSubject().toString();
+
         } else {
-            m.setSubject(subjectPrefix);
+            newSubject = subjectPrefix;
+        }
+
+        /*
+         * Get sure to use the right encoding when add the subjectPrefix..
+         * otherwise we get problems with some special chars
+         */
+        String rawSubject = m.getHeader(RFC2822Headers.SUBJECT, null);
+        String mimeCharset = determineMailHeaderEncodingCharset(rawSubject);
+        if (mimeCharset == null) { // most likely ASCII
+            // it uses the system charset or the value of the
+            // mail.mime.charset property if set
+            m.setSubject(newSubject);
+            return;
+        } else { // original charset determined
+            String javaCharset = javax.mail.internet.MimeUtility
+                    .javaCharset(mimeCharset);
+            try {
+                m.setSubject(newSubject, javaCharset);
+            } catch (MessagingException e) {
+                // known, but unsupported encoding
+                // this should be logged, the admin may setup a more i18n
+                // capable JRE, but the log API cannot be accessed from here
+                // if (charset != null) log(charset +
+                // " charset unsupported by the JRE, email subject may be
+                // damaged");
+                m.setSubject(newSubject); // recover
+            }
         }
+        m.saveChanges();
+    }
+
+    public String getMailetInfo() {
+        return "AddSubjectPrefix Mailet";
+    }
+
+    /**
+     * It attempts to determine the charset used to encode an "unstructured" RFC
+     * 822 header (like Subject). The encoding is specified in RFC 2047. If it
+     * cannot determine or the the text is not encoded then it returns null.
+     * 
+     * Here is an example raw text: Subject:
+     * =?iso-8859-2?Q?leg=FAjabb_pr=F3ba_l=F5elemmel?=
+     * 
+     * TODO: Should we include this in a util class ?
+     * 
+     * @param rawText
+     *            the raw (not decoded) value of the header. Null means that the
+     *            header was not present (in this case it always return null).
+     * @return the MIME charset name or null if no encoding applied
+     */
+    static private String determineMailHeaderEncodingCharset(String rawText) {
+        if (rawText == null)
+            return null;
+        int iEncodingPrefix = rawText.indexOf("=?");
+        if (iEncodingPrefix == -1)
+            return null;
+        int iCharsetBegin = iEncodingPrefix + 2;
+        int iSecondQuestionMark = rawText.indexOf('?', iCharsetBegin);
+        if (iSecondQuestionMark == -1)
+            return null;
+        // safety checks
+        if (iSecondQuestionMark == iCharsetBegin)
+            return null; // empty charset? impossible
+        int iThirdQuestionMark = rawText.indexOf('?', iSecondQuestionMark + 1);
+        if (iThirdQuestionMark == -1)
+            return null; // there must be one after encoding
+        if (-1 == rawText.indexOf("?=", iThirdQuestionMark + 1))
+            return null; // closing tag
+        String mimeCharset = rawText.substring(iCharsetBegin,
+                iSecondQuestionMark);
+        return mimeCharset;
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org