Hello,
Here's the newest version.

Basically it bridges XWiki.sendMessage to MailSenderPlugin.

It uses Reflection, so no circulars, but it's not exactly pretty.

Why it's needed - registration / validation / activation e-mails are
still sent via obsolete Apache Commons SmtpClient, so they _do not_
support SMTP AUTH.

This is a _major_ problem because due to spam and other abuse less and
less hosting providers / network admins allow SMTP without
authorization, and those who do are likely to have very insecure
infrastructure.

I honestly believe this is a MUST HAVE for a secure, spam-free
configuration.

Greetings, Lilianne
Index: main/resources/XWiki/AdminGeneralSheet.xml
===================================================================
--- main/resources/XWiki/AdminGeneralSheet.xml  (revision 18064)
+++ main/resources/XWiki/AdminGeneralSheet.xml  (working copy)
@@ -61,6 +61,6 @@
 #set($params.language = ['multilingual', 'languages' , 'default_language', 
'dateformat'])
 #set($params.editor = ['editor'])
 #set($params.admin = ['admin_email'])
-#set($params.server = ['smtp_server'])
+#set($params.server = ['smtp_server', 'smtp_server_username', 
'smtp_server_password', 'javamail_extra_props'])
 #includeForm('XWiki.AdminFieldsDisplaySheet')</content>
 </xwikidoc>
Index: main/java/com/xpn/xwiki/XWiki.java
===================================================================
--- main/java/com/xpn/xwiki/XWiki.java  (revision 17953)
+++ main/java/com/xpn/xwiki/XWiki.java  (working copy)
@@ -161,6 +161,8 @@
 import com.xpn.xwiki.web.XWikiURLFactoryService;
 import com.xpn.xwiki.web.XWikiURLFactoryServiceImpl;
 import com.xpn.xwiki.web.includeservletasstring.IncludeServletAsString;
+import java.io.BufferedReader;
+import java.io.StringReader;
 
 public class XWiki implements XWikiDocChangeNotificationInterface
 {
@@ -2838,9 +2840,13 @@
         needsUpdate |= bclass.addTextAreaField("meta", "HTTP Meta Info", 60, 
8);
         needsUpdate |= bclass.addTextField("dateformat", "Date Format", 30);
 
+        // mail
         needsUpdate |= bclass.addBooleanField("use_email_verification", "Use 
eMail Verification", "yesno");
+        needsUpdate |= bclass.addTextField("admin_email", "Admin eMail", 30);
         needsUpdate |= bclass.addTextField("smtp_server", "SMTP Server", 30);
-        needsUpdate |= bclass.addTextField("admin_email", "Admin eMail", 30);
+        needsUpdate |= bclass.addTextField("smtp_server_username", "SMTP 
Server username (optional)", 30);
+        needsUpdate |= bclass.addTextField("smtp_server_password", "SMTP 
Server password (optional)", 30);
+        needsUpdate |= bclass.addTextAreaField("javamail_extra_props", 
"Additional JavaMail properties", 60, 6);
         needsUpdate |= bclass.addTextAreaField("validation_email_content", 
"Validation eMail Content", 72, 10);
         needsUpdate |= bclass.addTextAreaField("confirmation_email_content", 
"Confirmation eMail Content", 72, 10);
         needsUpdate |= bclass.addTextAreaField("invitation_email_content", 
"Invitation eMail Content", 72, 10);
@@ -3311,9 +3317,139 @@
      *             Plugin</a>
      */
     @Deprecated
-    public void sendMessage(String sender, String[] recipient, String message, 
XWikiContext context)
+    public void sendMessage(String sender, String[] recipients, String 
message, XWikiContext context)
         throws XWikiException
     {
+        LOG.info("Entering sendMessage(...)...");
+
+        Object mailSender;
+        Class mailSenderClass;
+        Method mailSenderSendText;
+
+        try
+        {
+            mailSender = getPluginApi("mailsender", context);
+            mailSenderClass = 
Class.forName("com.xpn.xwiki.plugin.mailsender.MailSenderPluginApi");
+
+            // public int sendTextMessage(String from, String to, String 
subject, String message)
+            mailSenderSendText = mailSenderClass.getMethod("sendTextMessage",
+                    new Class[]{String.class, String.class, String.class, 
String.class});
+        }
+        catch(Exception e)
+        {
+            String eMsg = "Problem getting MailSender via Reflection: " + e;
+            LOG.error(eMsg);
+            throw new XWikiException(XWikiException.MODULE_XWIKI_EMAIL,
+                    XWikiException.ERROR_XWIKI_EMAIL_ERROR_SENDING_EMAIL, 
eMsg);
+        }
+
+        LOG.trace("Message = \"" + message + "\"");
+
+        String messageParsed[] = parseRawMessage(message);
+        String messageSubject = messageParsed[0];
+        String messageBody = messageParsed[1];
+        String messageRecipients = recipients[0];
+        for( int i = 1; i < recipients.length; i++)
+        {
+          messageRecipients = messageRecipients + "," + recipients[i];
+        }
+
+        if( messageSubject == null )
+        {
+          // TODO: provide some sensible default
+          messageSubject = "Message from XWiki";
+        }
+
+        LOG.trace("Subject = \"" + messageParsed[0] + "\"");
+        LOG.trace("Text = \"" + messageParsed[1] + "\"");
+
+        try
+        {
+          mailSenderSendText.invoke(mailSender, sender, messageRecipients, 
messageSubject, messageBody);
+        }
+        catch(InvocationTargetException ite)
+        {
+          Throwable cause = ite.getCause();
+          if( cause instanceof XWikiException )
+          {
+            throw (XWikiException)cause;
+          }
+          else
+          {
+            throw new RuntimeException(cause);
+          }
+        }
+        catch(Exception e)
+        {
+          // probably either IllegalAccessException or IllegalArgumentException
+          // shouldn't happen unless there were an incompatible code change
+          throw new RuntimeException(e);
+        }
+
+        LOG.info("Exiting sendMessage(...). It seems everything went ok.");
+    }
+
+    /**
+     *
+     * @return [subject (can be null), text (never null)]
+     */
+    public String[] parseRawMessage(String rawMessage)
+    {
+      String SUBJECT = "Subject: ";
+
+      String messageSubject = null;
+      String messageText = "";
+
+      // sanity check
+      if( rawMessage == null )
+      {
+        throw new IllegalArgumentException("rawMessage can't be null");
+      }
+      else if( rawMessage.trim().equals("") )
+      {
+        throw new IllegalArgumentException("rawMessage can't be empty");
+      }
+
+      try
+      {
+        StringReader sr = new StringReader(rawMessage);
+        BufferedReader br = new BufferedReader(sr);
+        String line;
+
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+
+        line = br.readLine();
+        if( line.startsWith(SUBJECT) )
+        {
+          messageSubject = line.substring(SUBJECT.length());
+          line = br.readLine();
+          if( !line.trim().equals("") )
+          {
+            pw.println(line);
+          }
+        }
+
+        while( (line = br.readLine()) != null )
+        {
+          pw.println(line);
+        }
+
+        messageText = sw.toString();
+      }
+      catch(IOException ioe)
+      {
+        // can't happen here
+      }
+
+      return new String[]{messageSubject, messageText};
+    }
+
+
+    @Deprecated
+    public void sendMessageOld(String sender, String[] recipient, String 
message, XWikiContext context)
+        throws XWikiException
+    {
         SMTPClient smtpc = null;
         try {
             String server = getXWikiPreference("smtp_server", context);
Index: main/resources/ApplicationResources.properties
===================================================================
--- main/resources/ApplicationResources.properties      (revision 17953)
+++ main/resources/ApplicationResources.properties      (working copy)
@@ -181,6 +181,9 @@
 use_email_verification=Use email verification
 admin_email=Admin email
 smtp_server=Outgoing SMTP Server
+smtp_server_username=SMTP Server Username (optional)
+smtp_server_password=SMTP Server Password (optional)
+javamail_extra_props=Additional JavaMail properties
 validation_email_content=Validation e-Mail Content
 confirmation_email_content=Confirmation e-Mail Content
 preferences=Preferences
_______________________________________________
users mailing list
users@xwiki.org
http://lists.xwiki.org/mailman/listinfo/users

Reply via email to