aspas inteligentes em um MimeMessage não aparecendo corretamente no Outlook
-
22-08-2019 - |
Pergunta
A nossa aplicação leva o texto de um formulário web e envia-lo via e-mail para um usuário apropriado. No entanto, quando alguém copiar / pastas nas infames "aspas inteligentes" ou outros caracteres especiais de Word, as coisas cabeludas.
O usuário digita ??p>
ele disse “Olá” para mim-não que bom?
Mas quando a mensagem aparece no Outlook 2003, ele sai como esta:
Ele disse Olá para meisnt legal?
O código para isso foi:
Session session = Session.getInstance(props, new MailAuthenticator());
Message msg = new MimeMessage(session);
//removed setting to/from addresses to simplify
msg.setSubject(subject);
msg.setText(text);
msg.setHeader("X-Mailer", MailSender.class.getName());
msg.setSentDate(new Date());
Transport.send(msg);
Depois de um pouco de pesquisa, eu percebi que esta foi provavelmente uma questão de codificação de caracteres e tentou mudar as coisas para UTF-8. Então, eu atualizei o código assim:
Session session = Session.getInstance(props, new MailAuthenticator());
MimeMessage msg = new MimeMessage(session);
//removed setting to/from addresses to simplify
msg.setHeader("X-Mailer", MailSender.class.getName());
msg.addHeader("Content-Type", "text/plain");
msg.addHeader("charset", "UTF-8");
msg.setSentDate(new Date());
Transport.send(msg);
Esta me chegou mais perto, mas nenhum charuto:
Ele disse que um “hello” para MEA-isnÂ't legal?
Eu não posso imaginar que este é um problema incomum - o que eu perdi
Solução
É a página com o formulário também usando UTF-8, ou um conjunto de caracteres diferente? Se você não especificar o charset página, o formato dos dados que chegam ao seu roteiro é uma incógnita.
Edit: o conjunto de caracteres na mensagem deve ser definido assim:
msg.addHeader("Content-Type", "text/plain; charset=UTF-8");
desde charset não é um cabeçalho separado, mas uma opção para Content-type
Outras dicas
Por que você não substituir os agradáveis ??citações com citações principais regulares?
Gostaria de verificar que os dados recebidos do navegador está correta - despejar os pontos de código Unicode e verificá-los contra o gráficos :
public static void printCodepoints(char[] s) {
for (int i = 0; i < s.length; i++) {
int codePoint = Character.isHighSurrogate(s[i]) ? Character
.toCodePoint(s[i], s[++i])
: s[i];
System.out.println(Integer.toHexString(codePoint));
}
}
Por exemplo, o símbolo de duplo ESQUERDA aspas ( “) é o caráter U + 201C.
Tem sido um longo tempo desde que eu usei a API mail, mas o MimeMessage.html.setText (texto, charset) método pode valer a pena um olhar. A documentação sobre setText (string) diz que usa o conjunto de caracteres padrão (provavelmente windows-1252 se você estiver usando Inglês / Latin-1 Windows).
characterset IIRC, citações do MS Office são encontrados "iso-8859-1".