Java 为HTML电子邮件正文编码希伯来文文本错误
我开发了一个程序,最终会发送一封确认电子邮件。 我需要用希伯来语发送电子邮件。 因此,我首先尝试以纯文本形式发送正文,这很好,但是为了使文本从右到左对齐,我必须将其格式化为HTML 首先,我使用:Java 为HTML电子邮件正文编码希伯来文文本错误,java,email,exception,character-encoding,jakarta-mail,Java,Email,Exception,Character Encoding,Jakarta Mail,我开发了一个程序,最终会发送一封确认电子邮件。 我需要用希伯来语发送电子邮件。 因此,我首先尝试以纯文本形式发送正文,这很好,但是为了使文本从右到左对齐,我必须将其格式化为HTML 首先,我使用: mbp1.setContent(new String(message.getBytes("UTF8"),"ISO-8859-1"), "text/html"); 西欧”字符集,在微软outlook中运行良好,但Gmail给了我胡言乱语。 然后我把它改成: mbp1.setConten
mbp1.setContent(new String(message.getBytes("UTF8"),"ISO-8859-1"), "text/html");
西欧”字符集,在微软outlook中运行良好,但Gmail给了我胡言乱语。
然后我把它改成:
mbp1.setContent(new String(message.getBytes("UTF8"),"ISO-8859-8-i"), "text/html");
现在可以完美工作了!!!
只是每次发送电子邮件时都会收到来自java的奇怪错误消息:
java.io.UnsupportedEncodingException: ISO-8859-8-E
at java.lang.StringCoding.decode(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at GoogleMail.Send(GoogleMail.java:78)
at GoogleMail.Send(GoogleMail.java:31)
at MainFrame.sendButtonActionPerformed(MainFrame.java:596)
at MainFrame.access$3(MainFrame.java:563)
at MainFrame$3.actionPerformed(MainFrame.java:423)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
java.io.UnsupportedEncodingException:ISO-8859-8-E
在java.lang.StringCoding.decode(未知源)
位于java.lang.String。(未知源)
位于java.lang.String。(未知源)
发送(GoogleMail.java:78)
发送(GoogleMail.java:31)
在MainFrame.sendbutonActionPerformed(MainFrame.java:596)
在MainFrame.access$3(MainFrame.java:563)
大型机$3.actionPerformed(MainFrame.java:423)
在javax.swing.AbstractButton.fireActionPerformed(未知源)
位于javax.swing.AbstractButton$Handler.actionPerformed(未知源)
在javax.swing.DefaultButtonModel.fireActionPerformed(未知源)
位于javax.swing.DefaultButtonModel.setPressed(未知源)
位于javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知源代码)
位于java.awt.Component.ProcessMouseeEvent(未知源)
位于javax.swing.JComponent.ProcessMouseeEvent(未知源)
位于java.awt.Component.processEvent(未知源)
位于java.awt.Container.processEvent(未知源)
位于java.awt.Component.dispatchEventImpl(未知源)
位于java.awt.Container.dispatchEventImpl(未知源)
位于java.awt.Component.dispatchEvent(未知源)
位于java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源)
位于java.awt.LightweightDispatcher.dispatchEvent(未知源)
位于java.awt.Container.dispatchEventImpl(未知源)
位于java.awt.Window.dispatchEventImpl(未知源)
位于java.awt.Component.dispatchEvent(未知源)
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$200(未知源)
在java.awt.EventQueue$3.run处(未知源)
在java.awt.EventQueue$3.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
在java.awt.EventQueue$4.run处(未知源)
在java.awt.EventQueue$4.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
现在一切正常,错误不是中止我的应用程序,但当我不知道它的根源时出现这样的错误让我很生气。
更新
2014年9月16日12:34
我刚刚将我的应用程序编译成一个jar文件,当我在Win7上使用ISO-8859-8-I编码运行它时,我在outlook和gmail中得到了gibrish
它只能在eclipse中正常工作!
我必须尝试将其设置回ISO-8859-1或ISO-8859-8。
将会更新
请帮忙
10倍
戴夫
更新2
2014年9月16日13:18
为了使用ISO-8859-I而不会出错,我尝试按照建议使用您的JCharset。
它确实修复了eclipse错误,但破坏了其他一切。
现在我使用ISO-8859-1字符集
当我在outlook上收到邮件时,它是完美的:
מק"ט: 19
התקבל ב: 2014-09-16
בשעה: 13:00:24
שם הפרוייקט:
שםמיןהעבכהה:
但是,当我收到Gmail上的信息时,一切都混乱了:
מק"ט: 19
התקבל ב: 2014-09-16
בשעה: 13:00:24
×©× ×”×¤×¨×•×™×™×§×˜:
×©× ×ž×–×ž×™×ד××、הודה:
我试着玩浏览器的编码设置,但没有这样的运气,
现在设置为Unicode UTF 8
有什么想法吗?默认情况下,Sun/Oracle的JRE会根据目标操作系统的配置安装转换器。如果Windows只有欧洲语言,则只安装受支持编码的子集。有关详细信息,请查看以下内容: 适用于Java 6 适用于Java 7 您的第一个代码似乎正确: 希伯来文电子邮件示例
MimeMessage message = new MimeMessage(mailSession);
Multipart multipart = new MimeMultipart("alternative");
BodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(new String(messageHtml.getBytes("UTF8"),"ISO-8859-1"), "text/html");
multipart.addBodyPart(htmlPart);
message.setContent(multipart);
message.setFrom(new InternetAddress(from));
message.setSubject(subject, "UTF-8");
诀窍是从UTF-8转换html(它来自我的消息属性),然后将其转换为ISO格式,这样就不需要设置任何标题。假设您尝试发送的字符是由Unicode标准定义的(它们不是全部吗?),并且您已经正确地创建了一个包含这些Unicode字符的Java字符串对象,您应该能够使用utf-8编码发送它们。当然,这取决于邮件阅读器理解utf-8(现在大多数都是这样)并能够显示这些特定的Unicode字符(这可能需要在客户端计算机上安装特殊字体或语言包) 但是,我不知道应该如何处理从右到左的显示问题。在某些Unicode字符的字符串显示中是否隐含了这一点 诸如新字符串(message.getBytes(“UTF8”)、“ISO-8859-1”)之类的代码不应该是必需的。如果“message”包含正确的Unicode字符,您应该能够使用mbp1.setText(message,“utf”)
// -- Create a new message --
final MimeMessage msg = new MimeMessage(session);
// -- Set the FROM and TO fields --
msg.setFrom(new InternetAddress(username));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientEmail, false));
if (ccEmail.length() > 0) {
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccEmail, false));
}
msg.setSubject(title, "utf-8");
msg.setText(message, "utf-8");
msg.setHeader("Content-Type", "text/html; charset=UTF-8");
msg.setSentDate(new Date());
MimeBodyPart mbp1 = new MimeBodyPart();
try {
mbp1.setDataHandler(new DataHandler(
new ByteArrayDataSource(message.toString(), "text/html")));
} catch (IOException e1) {
e1.printStackTrace();
}
mbp1.setHeader("Content-Type","text/plain; charset=\"utf-8\"");
mbp1.setContent( message, "text/html; charset=utf-8" );
mbp1.setHeader("Content-Transfer-Encoding", "quoted-printable");
// create the second message part
MimeBodyPart mbp2 = new MimeBodyPart();
// attach the file to the message
try {
mbp2.attachFile(fileName);
} catch (IOException e) {
e.printStackTrace();
}
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
msg.setContent(mp, "text/html");