WP email 的標題亂碼

其實這個問題困擾我很久了,以前一直以為人是 Becky 殺的,結果我錯怪了。

WP 可以啟用「當有人發表留言的時候使用電子郵件通知」這個功能,不過通知信件寄到我的 Email 信箱後,我用 Becky 收下來內文正常,但是標題跟來源卻是亂碼。由於我如果設定把通知信件寄到 Gmail 的話看是正常的,我一直以為是 Becky 設定的問題。只是無論我再怎麼設定,WP寄過來的信,其標題顯示還是亂碼。

今天火大了,乾脆把 WP 寄出來的信 source 挖出來看,再翻進去 WP source 裡找到pluggable-functions.php 裡的 wp_mail() 。原來是 WP 要寄信的時候沒有對 from/to/subject 等欄位做處理,我錯怪 Becky了。

既然人是 WP 殺的,那就簡單了。先找找有沒有人發明好現成的輪子,果然有:

quakemachine » Blog Archive » UTF-8 Mail Header Fix Plugin For WordPress

不過這個 Plugin一方面只處理了 subject 欄位,對於 from 並沒有處理,而且原程式的做法是取代原有的 wp_mail function,我覺得不夠彈性。於是又翻了一下。

在 WP 1.5.2 之後新增了 comment_notification_subject / comment_notification_headers 等幾個 filter,可以用來寫 plugin,不過在我的 1.5.2 上作者竟然是這樣放:

$message_headers = apply_filters(‘comment_notification_headers’, $message_headers);

$message_headers = “MIME-Version: 1.0\n”
. “$from\n”
. “Content-Type: text/plain; charset=\”” . get_settings(‘blog_charset’) . “\”\n”;

@wp_mail($user->user_email, $subject, $notify_message, $message_headers);

apply_filters 的位置放錯了…… -.-

所以等未來WP 2.0 Release時我再改寫吧(應該快了:p)。

在這之前,我就先拿 AvP 的版本改一改,一樣是直接卡掉 wp_mail,不過改用另一種寫法,以後要改成 filter type 的plugin 時比較快。

來去 UTF-8 Mail Header Fix Plugin(PipperL version)

在〈WP email 的標題亂碼〉中有 10 則留言

  1. 感謝您的 plug-in… Google 建議的第一個輪子呢(笑)。
    但是我安裝到 2.0.4 的 WordPress 之後它就爆炸了@@

    不知道您有沒有寫 2.x 用的版本?

    回覆
  2. timdream:
    有的,我一直在用,不過一直忘了放上來 :p

    我把檔案放在 終極邊疆BLOG » UTF-8 Mail Header Fix (PipperL version) 該頁的後面,使用上有問題的話再告訴我 🙂

    回覆
  3. Hi 我拿去用了~~ 但是WP寄的信到Gmail內文變成一片空白…
    初步研究是因為內文base64_encode()之後沒有chunk_split(),超過字數…

    我把 function filter_encode_utf8_mail_text() 的第二行改成這樣:

    $content = chunk_split(base64_encode($content));

    有沒有效… 要等有人在我那裡寫comments才知道XD

    回覆
  4. 現在確定filter_encode_utf8_mail_text()要改成那樣才ok了…

    突然想到一件事情,
    就是在Gmail那邊 原本也只有 subject會亂碼而已|||
    Form其實不會… 內文也不會

    內文在傳輸的過程本來就不會爛掉
    把它base64起來好像不是很有必要@@

    (沒差 總之有base有保庇XD)

    回覆
  5. 謝謝你的外掛, 終可解決亂碼.
    不過當我安裝另外掛Custom Contact和啟動它,並且在選項/Custom Contact設定好, 最後在前端填表發送email後, 收到的是亂碼, 如何在哪修正? (可在此下載http://rane.hasitsown.com/blog/wp-content/shared/custom-contact.zip) 需wordpress2.X版

    大安

    回覆
  6. Peter:

    我這個外掛Plugin是利用 wp_notify_postauthor 呼叫的hook 來作處理UTF-8的亂碼,而該函數最後是呼叫 wp_mail()來把信件寄出。

    而Custom Contact 是直接呼叫 wp_mail 把信件寄出,因此信件不會經過這個plugin 的處理,當然就會維持亂碼的原狀…..

    回覆
  7. So, 你意指Custtom Contact修正為利用類似wp_notify_postauthor 呼叫的hook 來作處理UTF-8的亂碼,而該函數最後是呼叫 wp_mail()來把信件寄出。
    如要修正Custtom Contact, 是否麻煩? 可惜我對編寫程式無概念…

    回覆
  8. Peter:
    不會很麻煩,你可以請原作者如同 wp_notify_postauthor 一樣加上apply_filters(‘comment_notification_headers’…) 等段落即可。

    回覆
  9. 在 WordPress 2.2 版以後,由於使用了PHPMailer class 來寄信,因此亂碼的問題也因此消失了。所以 2.2 版以後的朋友們,不必再使用這個 plugin了 🙂

    回覆

發佈留言