Java调用Outlook新建邮件:主题与正文含空格异常问题求助
解决Java调用Outlook创建邮件时主题/正文空格显示异常的问题
问题场景
用Java打开Outlook创建新邮件,可正常填充收件人(to)、抄送人(cc)字段,但主题(subject)和正文(body)内容含空格时出现异常:
- 不编码时,Java提示URL存在非法字符
- 用
URLEncoder编码后,Outlook中空格显示为“+” - 手动替换空格为
%20,Outlook直接显示%20字符
使用Outlook版本:Microsoft® Outlook® für Microsoft 365 MSO (Version 2302 Build 16.0.16130.20684) 64 Bit,需求为仅打开Outlook创建邮件,不直接发送。现有代码如下:
String subject = "This is the subject";// %20 String body = "Dear colleagues this is a"; String to = "mail1@xxx.com"; String cc = "mail2@xxx.com;mail3@xxx.com"; try { subject = URLEncoder.encode(subject, "UTF-8"); body = URLEncoder.encode(body, "UTF-8"); } catch (UnsupportedEncodingException e2) { e2.printStackTrace(); } try { Desktop.getDesktop().mail( new URI( "mailto:" + to + "?subject=" + subject + "&cc=" + cc + "&body=" + body) ); } catch (IOException e1) { e1.printStackTrace(); } catch (URISyntaxException e1) { e1.printStackTrace(); }
解决方案
问题根源在于URLEncoder遵循application/x-www-form-urlencoded规范,会将空格转为+,但mailto协议要求空格用%20编码。因此需要在编码后额外将+替换为%20。
修改后的完整代码:
String subject = "This is the subject"; String body = "Dear colleagues this is a test body with spaces"; String to = "mail1@xxx.com"; String cc = "mail2@xxx.com;mail3@xxx.com"; try { // 先编码处理特殊字符,再替换+为%20适配mailto协议 subject = URLEncoder.encode(subject, "UTF-8").replace("+", "%20"); body = URLEncoder.encode(body, "UTF-8").replace("+", "%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { URI mailtoUri = new URI("mailto:" + to + "?subject=" + subject + "&cc=" + cc + "&body=" + body); Desktop.getDesktop().mail(mailtoUri); } catch (IOException | URISyntaxException e) { e.printStackTrace(); }
说明
URLEncoder会先处理除空格外的其他URL非法字符,确保URI格式合法- 替换
+为%20后,完全符合mailto协议的编码要求,Outlook可正常识别并显示空格
内容的提问来源于stack exchange,提问作者Nisbo
相关产品推荐
相关产品推荐

