在处理邮件的时候,可能会遇到主题或者其他内容是类似=?utf-8?b?44Gv5piG5piO77yI5YWs5Lqk6L2m4oyS54eD54On?=这样的,这是邮件的QP(QuotedPrintable)编码,来看下怎么解码。
实现
以下代码实现了QP(QuotedPrintable)解码,详见decodeQuotedPrintable方法
import javax.mail.internet.MimeUtility; import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test3 { public static void main(String[] args) throws Exception { String subject = null; try { subject = MimeUtility.decodeText(message.getSubject()); } catch (Exception e) { subject = message.getSubject(); } if (isEncoded(subject)) subject = parserEncoded(subject); } private static boolean isEncoded(String str) { Pattern p = Pattern.compile("=\\?([^\\?]+)\\?([^\\?]+)\\?(.*)\\?="); Matcher m = p.matcher(str); return m.find(); } private static String parserEncoded(String rawContent) { String subject = rawContent; // 类似 =?utf-8?b?44Gv5piG5piO77yI5YWs5Lqk6L2m4oyS54eD54On?= Pattern p = Pattern.compile("=\\?([^\\?]+)\\?([^\\?]+)\\?(.*)\\?="); Matcher m = p.matcher(rawContent); StringBuilder sb = new StringBuilder(); while (m.find()) { String encode = m.group(1).toLowerCase();// utf-8 String bOrQ = m.group(2).toLowerCase();// b base64 q meams String content = m.group(3); Charset c = Charset.defaultCharset(); try { c = Charset.forName(encode); } catch (Exception ignored) { } try { if ("q".equals(bOrQ)) {// QP编码 sb.append(new String(decodeQuotedPrintable(content.getBytes()), c)); } else { sb.append(Base64Coder.decodeString(content)); } } catch (Exception ignored) { } } if (sb.length() > 0) subject = sb.toString(); return subject; } /** * QP(QuotedPrintable)解码 */ public static byte[] decodeQuotedPrintable(byte[] bytes) throws Exception { if (bytes == null) { return null; } byte ESCAPE_CHAR = '='; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); for (int i = 0; i < bytes.length; i++) { int b = bytes[i]; if (b == ESCAPE_CHAR) { try { int u = Character.digit((char) bytes[++i], 16); int l = Character.digit((char) bytes[++i], 16); if (u == -1 || l == -1) { throw new Exception("Invalid quoted-printable encoding"); } buffer.write((char) ((u << 4) + l)); } catch (ArrayIndexOutOfBoundsException e) { throw new Exception("Invalid quoted-printable encoding"); } } else { buffer.write(b); } } return buffer.toByteArray(); } }
文章评论