Attaching diff.
Note it's not the whole thing, and probably not final.
Greetings, Lilianne
# This patch file was generated by NetBeans IDE
# Following Index: paths are relative to:
D:\Work\Java\Open_Source\xwiki-trunks\xwiki-platform-core\xwiki-core\src\main\java
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and \n newlines.
# Above lines and this line are ignored by the patching process.
Index: com/xpn/xwiki/plugin/mailsender/MailConfiguration.java
--- com/xpn/xwiki/plugin/mailsender/MailConfiguration.java Base (BASE)
+++ com/xpn/xwiki/plugin/mailsender/MailConfiguration.java Locally Modified (Based On
LOCAL)
@@ -19,7 +19,12 @@
  */
 package com.xpn.xwiki.plugin.mailsender;
+import java.util.Properties;
+import java.util.Enumeration;
+
 import com.xpn.xwiki.api.XWiki;
+import java.io.IOException;
+import java.io.StringReader;
 /**
  * Represents a Mail Server configuration.
@@ -29,7 +34,11 @@
     private int port;
     private String host;
     private String from;
+    private String smtpUsername;
+    private String smtpPassword;
+    private Properties extraProperties;
+
     public MailConfiguration()
     {
         setPort(25);
@@ -49,8 +58,26 @@
         if (from.length() > 0) {
             setFrom(from);
         }
+
+        String smtpServerUsername =
+            xwiki.getXWikiPreference("smtp_server_username", "");
+        String smtpServerPassword =
+            xwiki.getXWikiPreference("smtp_server_password", "");
+        if ((smtpServerUsername.length() > 0) &&
+            (smtpServerPassword.length() > 0))
+        {
+            setSmtpUsername(smtpServerUsername);
+            setSmtpPassword(smtpServerPassword);
     }
+        String javaMailExtraProps =
+            xwiki.getXWikiPreference("javamail_extra_props", "");
+        if (javaMailExtraProps.length() > 0)
+        {
+            setExtraPropertiesAsString(javaMailExtraProps);
+        }
+    }
+
     public void setHost(String host)
     {
         this.host = host;
@@ -81,6 +108,88 @@
         return this.from;
     }
+    public void setSmtpUsername(String smtpUsername)
+    {
+        this.smtpUsername = smtpUsername;
+    }
+
+    public String getSmtpUsername()
+    {
+        return smtpUsername;
+    }
+
+    public void setSmtpPassword(String smtpPassword)
+    {
+        this.smtpPassword = smtpPassword;
+    }
+
+    public String getSmtpPassword()
+    {
+        return smtpPassword;
+    }
+
+    public boolean areSmtpUsernameAndPasswordSet()
+    {
+        return (getSmtpUsername() != null && getSmtpUsername().length() > 0)
&&
+            (getSmtpPassword() != null && getSmtpPassword().length() > 0);
+    }
+
+    public void setExtraPropertiesAsString(String extraPropertiesString)
+    {
+        if (extraPropertiesString == null ||
+            extraPropertiesString.trim().length() == 0)
+        {
+            extraProperties = null;
+        }
+        else
+        {
+            StringReader sr = new StringReader(extraPropertiesString);
+            extraProperties = new Properties();
+            try
+            {
+                extraProperties.load(sr);
+            }
+            catch(IOException e)
+            {
+                throw new RuntimeException(
+                    "WTF? IOException here shouldn't be possible.");
+            }
+        }
+    }
+
+    /**
+     * Add extraProperties to an external Properties object
+     *
+     * @param externalProperties
+     * @param overwrite
+     */
+    public void appendExtraPropertiesTo(Properties externalProperties,
+        boolean overwrite)
+    {
+        // sanity check
+        if( externalProperties == null )
+        {
+            throw new IllegalArgumentException(
+                "externalProperties can't be null");
+        }
+
+        if (extraProperties != null && extraProperties.size() > 0)
+        {
+            Enumeration propNames = extraProperties.propertyNames();
+            while (propNames.hasMoreElements())
+            {
+                String propName = (String)propNames.nextElement();
+                String propValue = extraProperties.getProperty(propName);
+
+                if (overwrite ||
+                    externalProperties.getProperty(propName) == null)
+                {
+                    externalProperties.setProperty(propName, propValue);
+                }
+            }
+        }
+    }
+
     public String toString()
     {
         StringBuffer buffer = new StringBuffer();
@@ -95,6 +204,12 @@
         buffer.append(", Port [" + getPort() + "]");
+        if( areSmtpUsernameAndPasswordSet() )
+        {
+            buffer.append(", Username [" + getSmtpUsername() + "]");
+            buffer.append(", Password [*****]");
+        }
+
         return buffer.toString();
     }
 }
Index: com/xpn/xwiki/plugin/mailsender/MailSenderPlugin.java
--- com/xpn/xwiki/plugin/mailsender/MailSenderPlugin.java Base (BASE)
+++ com/xpn/xwiki/plugin/mailsender/MailSenderPlugin.java Locally Modified (Based On
LOCAL)
@@ -73,6 +73,8 @@
  * @see MailSender
  * @version $Id: $
  */
+// DEV NOTE: main JavaMail code is in sendMails method, near line 550.
+// note that most settings are initialized in MailConfiguration constructor.
 public class MailSenderPlugin extends XWikiDefaultPlugin
 {
     /**
@@ -108,6 +110,7 @@
      */
     public void init(XWikiContext context)
     {
+        LOG.debug("Entering init(...)...");
         try {
             initMailClass(context);
         } catch (Exception e) {
@@ -122,6 +125,7 @@
      */
     public void virtualInit(XWikiContext context)
     {
+        LOG.debug("Entering virtualInit(...)...");
         try {
             initMailClass(context);
         } catch (Exception e) {
@@ -428,6 +432,13 @@
             properties.put("mail.smtp.from", mailConfiguration.getFrom());
         }
+        if (mailConfiguration.areSmtpUsernameAndPasswordSet() )
+        {
+            properties.put("mail.smtp.auth", "true");
+        }
+
+        mailConfiguration.appendExtraPropertiesTo(properties, true);
+
         return properties;
     }
@@ -552,12 +563,26 @@
                 LOG.info("Sending email: " + mail.toString());
                 if ((transport == null) || (session == null)) {
+
+                    // initialize JavaMail Session and Transport
                     Properties props = initProperties(mailConfiguration);
                     session = Session.getDefaultInstance(props, null);
                     transport = session.getTransport("smtp");
+
+                    if (!mailConfiguration.areSmtpUsernameAndPasswordSet() )
+                    {
+                        // no auth info - typical 127.0.0.1 open relay scenario
                     transport.connect();
                 }
+                    else
+                    {
+                        // auth info present - typical with external smtp server
+                        transport.connect(mailConfiguration.getSmtpUsername(),
+                            mailConfiguration.getSmtpPassword());
+                    }
+                }
+
                 try {
                     MimeMessage message = createMimeMessage(mail, session, context);
Index: com/xpn/xwiki/XWiki.java
--- com/xpn/xwiki/XWiki.java Base (BASE)
+++ com/xpn/xwiki/XWiki.java Locally Modified (Based On LOCAL)
@@ -118,6 +118,7 @@
 import com.xpn.xwiki.objects.meta.MetaClass;
 import com.xpn.xwiki.plugin.XWikiPluginInterface;
 import com.xpn.xwiki.plugin.XWikiPluginManager;
+import com.xpn.xwiki.plugin.mailsender.MailSenderPluginApi;
 import com.xpn.xwiki.plugin.query.QueryPlugin;
 import com.xpn.xwiki.plugin.query.XWikiCriteria;
 import com.xpn.xwiki.plugin.query.XWikiQuery;
@@ -2711,10 +2712,9 @@
         needsUpdate |= bclass.addTextAreaField("menu", "Menu", 60,
8);
         needsUpdate |= bclass.addTextAreaField("meta", "HTTP Meta
Info", 60, 8);
+        // registration
         needsUpdate |=
             bclass.addBooleanField("use_email_verification", "Use eMail
Verification", "yesno");
-        needsUpdate |= bclass.addTextField("smtp_server", "SMTP
Server", 30);
-        needsUpdate |= bclass.addTextField("admin_email", "Admin
eMail", 30);
         needsUpdate |=
             bclass.addTextAreaField("validation_email_content",
"Validation eMail Content", 72,
                 10);
@@ -2725,6 +2725,13 @@
             bclass.addTextAreaField("invitation_email_content",
"Invitation eMail Content", 72,
                 10);
+        // mail
+        needsUpdate |= bclass.addTextField("admin_email", "Admin
eMail", 30);
+        needsUpdate |= bclass.addTextField("smtp_server", "SMTP
Server", 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.addTextField("macros_languages", "Macros
Languages", 60);
         needsUpdate |= bclass.addTextField("macros_velocity", "Macros for
Velocity", 60);
         needsUpdate |= bclass.addTextField("macros_groovy", "Macros for
Groovy", 60);
@@ -3207,6 +3214,63 @@
     public void sendMessage(String sender, String[] recipient, String message,
         XWikiContext context) throws XWikiException
     {
+      // TODO - provide some sensible default
+      String subject = "XWiki message";
+
+      sendMessage(sender, recipient, subject, message, context);
+    }
+
+    /**
+     * @deprecated replaced by the <a
+     *
href="http://code.xwiki.org/xwiki/bin/view/Plugins/MailSenderPlugin&qu…
Sender
+     *             Plugin</a>
+     */
+    public void sendMessage(String sender, String[] recipient, String subject,
+        String message, XWikiContext context) throws XWikiException
+    {
+        LOG.debug("Entering sendMessage(...)...");
+
+        MailSenderPluginApi mailSenderApi =
+            (MailSenderPluginApi)getPluginApi("mailsender", context);
+
+        LOG.debug("mailSenderApi = " + mailSenderApi);
+
+        LOG.debug("sender = " + sender);
+        LOG.debug("recipient.length = " + recipient.length);
+        for(int i = 0; i < recipient.length; i++)
+        {
+          LOG.debug("recipient[" + i + "] = " + recipient[i]);
+        }
+        LOG.debug("subject = " + subject);
+        LOG.debug("message = " + message);
+        LOG.debug("context = " + context);
+
+        String recipientsAsString = recipient[0];
+        for(int i = 1; i < recipient.length; i++)
+        {
+          recipientsAsString = recipientsAsString + "," + recipient[i];
+        }
+
+
+        int result = mailSenderApi.sendTextMessage(sender, recipientsAsString,
+            subject, message);
+
+        // note: -1 is magic number for any error
+        if( result == -1 )
+        {
+          String errorString = (String)context.get("error");
+          XWikiException xwe =
+              new XWikiException(XWikiException.MODULE_XWIKI_EMAIL,
+                  XWikiException.ERROR_XWIKI_EMAIL_ERROR_SENDING_EMAIL,
+                  errorString);
+          LOG.error(xwe, xwe);
+          throw xwe;
+        }
+
+        LOG.debug("Exiting sendMessage(...). It seems everything went ok.");
+
+
+        /*
         SMTPClient smtpc = null;
         try {
             String server = getXWikiPreference("smtp_server", context);
@@ -3269,6 +3333,7 @@
                 }
             }
         }
+         */
     }
     /**