簡體   English   中英

Java 發送帶有日文字符的電子郵件

[英]Java send email with Japanese character

我正在使用 java 發送電子郵件。 要求是以不同語言發送電子郵件,對於日語,我收到的電子郵件為“???????” 人物。

代碼是這樣的:

import java.io.IOException;
import static java.nio.charset.StandardCharsets.*;
import javax.mail.MessagingException;

import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import java.io.File;

import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@Service
public class EmailService {

    @Autowired(required=true)
    private JavaMailSenderImpl javaMailSender;

    void sendEmailhtml(String to, String sub, String body, String imageFile) throws MessagingException, IOException {
        javaMailSender = new JavaMailSenderImpl();

    javaMailSender.setHost("smtp.test.com");
        MimeMessage msg = javaMailSender.createMimeMessage();
        msg.setHeader("Content-Type", "text/html; charset=UTF-8");
        msg.setContent("Content-Type", "text/html; charset=UTF-8");

        MimeMessageHelper helper = new MimeMessageHelper(msg, true);
        helper.setTo(to);
        byte[] bytes = sub.getBytes();
        sub = new String(bytes, UTF_8);
        helper.setSubject(sub);
        byte[] bytesBody = body.getBytes();
        body = new String(bytesBody, UTF_8);
        helper.setText(body,true);
        // add image file as inline image
        if(imageFile!= null) {
            FileSystemResource fileresource = new FileSystemResource(new File(imageFile));
            helper.addInline("referral-email-image", fileresource);
        }
        helper.setFrom("test@invalidemail.com");
        javaMailSender.send(msg);
    }

}

我正在使用以下參數值調用 sendEmailhtml 函數。

body=<p style="align-content: center;"> <img alt="referral emai header" src="cid:referral-email-image"/> </p>  <p>FirstNameさん, </p>     <p>CandidateFName CandidateLastName さんの社員紹介プロセスが完了しました.CandidateFNameさんは候補者プロフィールを作成され、現在、採用擔當者がレビューを実施中です。<b>CandidateFName</b> さんに連絡を差し上げ、當社の <b> <a alt="Careers Site" href="https://test.com/">キャリアサイト</a></b> へのリンクから他の求人にも応募可能であることもご案內しました。 </p>    <p>         <p>            今回の推薦について重ねて御禮申し上げます。今後、あなたから當人に連絡をしていただく必要はありません。選考プロセスを進めるかどうかについて、採用擔當者より <b>CandidateFName</b>さんに直接連絡を取らせていただきます。
 
sub=あなたが紹介した候補者に関する最新情報

提供的任何幫助將不勝感激。

我認為您的問題在於byte[] bytes = sub.getBytes(); 此行為您獲取系統上默認的字符集中的字符串字節,該字符集中可能不是 UTF-8。 將其更改為
byte[] bytes = sub.getBytes(StandardCharsets.UTF_8);
這將首先將 String 轉換為 UTF-8,然后將表示您的 String 內容的字節數組返回為 UTF-8 編碼,而不是編碼為您的系統默認字符集。 那么當你用 line 讀取你的字節時

body = new String(bytesBody, UTF_8);

你應該得到想要的結果。
這里還有一個工具,它對我診斷和調試棘手的編碼問題有很大幫助。 有一個開源 java 庫 MgntUtils(由我編寫),它有一個實用程序,可以將字符串轉換為 unicode 序列,反之亦然:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

這段代碼的輸出是:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

該庫可以在Maven CentralGithub上找到

這是StringUnicodeEncoderDecoder類的javadoc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM