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