簡體   English   中英

解析帶有“[”字符的電子郵件地址標頭時出現 javax.mail 錯誤

[英]javax.mail error when parsing email address header with '[' character

我正在嘗試消化一些通過 gmail 帳戶傳入的郵件,並且我收到的一封或多封郵件在發件人的標題中具有格式化的名稱。 類似的東西

[hris [hristerson <chrisDoesNotExist@gmail.com>

上面的名稱是假的,但說明了我遇到的情況,名稱將一個或多個 'C' 字符替換為 '['。

觸發錯誤的代碼

String header = "[hris [hristerson <chrisDoesNotExist@gmail.com>";
boolean strict = true; // I also tried using a false value
InternetAddress.parse(header, strict);

錯誤本身表現為: javax.mail.internet.AddressException: Missing ']'

我正在做的一些研究讓我認為使用每個 RFC-2047 的編碼詞可能是一個答案。 但除非我嘗試錯誤,否則它似乎不起作用。 此外,其他類似的非法字符在我的測試中不會給我同樣的錯誤,這讓我認為這是偶然的,並且更獨特的是一個 java 庫問題。

我用來嘗試基本編碼字修復的代碼是:

public String encodePrettyEmailHeader(String header, String charset, char encoding) {

    Map<String, String> illegalChars = new HashMap<>();

    illegalChars.put("\\[", "=5B");
    illegalChars.put("]", "=5D");
    illegalChars.put("\\(", "=28");
    illegalChars.put("\\);", "=29");
    illegalChars.put("<", "=3C");
    illegalChars.put(">", "=3E");
    illegalChars.put("@", "=40");
    illegalChars.put(",", "=2C");
    illegalChars.put(";", "=3B");
    illegalChars.put(":", "=3A");
    illegalChars.put("\"", "=22");
    illegalChars.put("/", "=2F");
    illegalChars.put("\\?", "=3F");
    illegalChars.put(" ", "=20");

    String email = getEmailFromHeader(header).trim(); // regex to get the <email@address.com> from the header
    String name = header.substring(0, header.indexOf(email)).trim();

    for (Map.Entry<String, String> anEntry : illegalChars.entrySet()) {
        name = name.replaceAll(anEntry.getKey(), anEntry.getValue());
    }

    return String.format("=?%s?%c?%s?= %s", charset, encoding, name, email);
}    

調用方式如下: InternetAddress.parse(encodePrettyEmailHeader(header, "UTF-8", 'Q'), strict);

我希望有一個不涉及將數據手動編碼為可打印引用的答案,我相信我應該能夠使這個笨拙的解決方案起作用,但是,這將增加更多開銷,因為我需要取消-在數據可以有用地顯示之前對其進行編碼。

有沒有人對我繼續有任何建議?

編輯:

我升級了我的版本,同樣的結果發生了。 然而,我意識到當我混淆地址標題時,我添加了一組額外的引號,超出了來自 gmail 的內容。 為簡潔起見:

這就是我錯誤地格式化它的方式: "[hris [hristerson" <chrisDoesNotExist@gmail.com>

這是對我來說失敗的正確格式: [hris [hristerson <chrisDoesNotExist@gmail.com>

編輯2:

為清楚起見,我使用group: 'com.sun.mail', name: 'javax.mail', version: '1.5.5' ,我已經升級到group: 'com.sun.mail', name: 'javax.mail', version: '1.6.0'行為沒有區別。

我也試過將strict設置為false,但拋出的異常沒有什么不同。 調試器截圖示例

我有兩個解決方案給你。

1)使用構造函數:

InternetAddress workingStyle2 = new InternetAddress("chrisDoesNotExist@gmail.com", "[hris [hristerson","UTF-8");
System.out.println(workingStyle2.getPersonal());
System.out.println(workingStyle2.getAddress());

2) 使用嚴格模式 = false 注意使用嚴格模式時的不同 API,調用parseHeader而不是僅僅 parse。

為了更好地支持在真實消息中看到的“無效”地址范圍,當嚴格標志為假時,此方法比解析方法強制執行更少的語法規則,並在嚴格標志為真時強制執行更多規則。 如果嚴格標志為假並且解析成功分離出一個或多個電子郵件地址,則不會檢查地址本身的語法。

    boolean strict = false;
    InternetAddress[] working = InternetAddress.parseHeader(header, strict);
    System.out.println(working[0].getPersonal());
    System.out.println(working[0].getAddress());

暫無
暫無

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

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