我正在使用Javamail API从Gmail服务器读取邮件。我发送的邮件中包含从gmail ID到其他Gmail ID的阿拉伯语内容。邮件的Charset编码类型是windows-1256。当我使用Javamail下载邮件时,我收到“??????”的内容格式而不是阿拉伯字符。我将下载的内容转换为UTF-8格式,但仍未获得正确的显示。
提前致谢,
添
更新
我使用以下代码来获取内容:
Object content = message.getContent();
if (message.isMimeType("text/html")
|| message.isMimeType("text/plain")) {
Al = (String) content;
}
下载内容后,以下代码用于UTF-8编码:
byte[] utf8Bytes = s.getBytes("UTF-8");
s = new String(utf8Bytes, "UTF-8");
更新:我目前用于阅读邮件内容的完整代码
String gmailMultipartMailDownload(Multipart multipart, String Uids)
throws SocketException, UnsupportedDataTypeException, UnsupportedEncodingException {
String Content = new String("");
try {
int numParts = multipart.getCount();
for (int k = 0; k < numParts; k++)
{
BodyPart bodyPart = multipart.getBodyPart(k);
Object tmp = null;
try
{
tmp = bodyPart.getContent();
}
catch (UnsupportedDataTypeException UEE)
{
try {
InputStream is = bodyPart.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null)
{
sb.append(line + "\n");
}
br.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
} catch (UnsupportedEncodingException UEE) {
UEE.printStackTrace();
try {
InputStream is = bodyPart.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null)
{
sb.append(line + "\n");
}
br.close();
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
String disposition = bodyPart.getDisposition();
if (tmp instanceof InputStream) {
try{
if( super.Downloadfiles(bodyPart, hashCode, attnumcount,this.getgmailattachmentfolder()))
{
//Download Attachments
}
}catch (FileNotFoundException err) {
return Content;
}
catch(IOException fex){
fex.printStackTrace();
return Content;
}
}
else if (disposition != null
&& (disposition.equals(BodyPart.ATTACHMENT) || disposition.equals(BodyPart.INLINE) || disposition.equals("ATTACHMENT"))) {
try{
if( super.Downloadfiles(bodyPart, hashCode, attnumcount,this.getgmailattachmentfolder()))
{
//Download Attachments
}
}catch (FileNotFoundException err) {
System.out.println(err.getMessage());
return Content;
}
catch(IOException fex){
fex.printStackTrace();
return Content;}
} else if (bodyPart.isMimeType("multipart/*")) {
Multipart mp = (Multipart) bodyPart.getContent();
Content += gmailMultipartMailDownload(mp, Uids);
} else if (bodyPart.isMimeType("text/html")) {
Content += bodyPart.getContent().toString();
}
}
}
catch (Exception Ex) {
System.out.println("Content object error is "+Ex);
return Content;
} finally {
return Content;
}
}
答案 0 :(得分:1)
这对我有用:
public boolean sendEmail(String sender, String recipient, String subject, String body)
{
try
{
// set properties of mail server
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.setProperty("charset","utf-8");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
// connect to mail server
javax.mail.Session session = javax.mail.Session.getDefaultInstance(props,
new javax.mail.Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{ return new PasswordAuthentication(gmailUser,gmailPassword); }
});
// create email
MimeMessage message = new MimeMessage(session);
message.setSender(new InternetAddress(sender));
message.setSubject(subject, "UTF-8");
message.setContent(body, "text/plain; charset=utf-8");
message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
// send email
Transport.send(message);
return true;
}
catch (Exception e)
{
System.out.println("Exception thown "+e.getMessage());
return false;
}
答案 1 :(得分:0)
你可以使用这样的东西:
protected static String readContent(Part part) throws IOException, MessagingException {
return new String(part.getContent().toString().getBytes(), readCharset(part.getContentType()));
}
/**
* Read charset from ContentType of javax.mail.internet.Part (MimePart, BodyPart, etc).
* eg: "text/plain; charset=iso-8859-1"
* The result: Charset ISO-8859-1
*
* @param contentType content-type like "text/plain; charset=iso-8859-1"
* @return Charset
*/
protected static Charset readCharset(String contentType) {
Charset charset = Charset.defaultCharset();
if (StringUtils.hasText(contentType)) {
String[] _split = contentType.split("charset=");
if (_split != null && _split.length == 2) {
String _c = _split[1];
try {
charset = Charset.forName(_c);
} catch (Exception ex) {
log.error("Invalid content-type charset: " + contentType);
}
}
}
return charset;
}
这不是最好的解决方案,但它确实有效。
此致 佩德罗索萨
答案 2 :(得分:0)
message.setContent(content +“”,“ text / html; charset = utf-8”);
您需要添加此行以阿拉伯语。