Index: email-impl/impl/src/java/org/sakaiproject/email/impl/BasicEmailService.java =================================================================== --- email-impl/impl/src/java/org/sakaiproject/email/impl/BasicEmailService.java (revision 46553) +++ email-impl/impl/src/java/org/sakaiproject/email/impl/BasicEmailService.java (working copy) @@ -21,6 +21,7 @@ package org.sakaiproject.email.impl; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.Collection; import java.util.Date; @@ -421,6 +422,10 @@ msg.setSubject(subject, charset); } + encodeAddressList(msg, "To", charset); + encodeAddressList(msg, "From", charset); + encodeAddressList(msg, "Cc", charset); + // fill in the body of the message msg.setText(content, charset); @@ -974,6 +979,10 @@ if ( getSubject() != null ) setSubject(getSubject(), charset); + encodeAddressList(this, "To", charset); + encodeAddressList(this, "From", charset); + encodeAddressList(this, "Cc", charset); + // if we have a full Content-Type header, set it NOW (after setting the body of the message so that format=flowed is preserved) if (contentType != null && !contentType.contains("multipart/")) { @@ -996,4 +1005,41 @@ } } } + + + private void encodeAddressList(MimeMessage msg, String headerName, String charset) + throws MessagingException, AddressException { + if(msg.getHeader(headerName) != null) + { + String[] headerList = msg.getHeader(headerName); + msg.removeHeader(headerName); + for(int i = 0; i < headerList.length; i++) + { + String headerData = headerList[i]; + + try { + StringBuffer newHeader = new StringBuffer(); + InternetAddress[] addrs = InternetAddress.parseHeader(headerData, false); + for (int j = 0 ; j < addrs.length ; j++ ) { + InternetAddress addr = addrs[j]; + String personal = addr.getPersonal(); + if(personal != null) { + addr.setPersonal(personal, charset); + } + + if(newHeader.length() != 0 ) { + newHeader.append(", "); + } + newHeader.append(addr.toString()); + } + msg.addHeader(headerName, newHeader.toString()); + } + catch(UnsupportedEncodingException e) + { + msg.addHeader(headerName, headerData); + M_log.warn("Failed to encode To header for " + headerData + " adding unencoded."); + } + } + } + } }