您在這裡

註冊信內文產生亂碼

jason's 的頭像
jason 在 2007-03-06 (二) 10:17 發表

爬文及搜尋好久,還是找不到解決的方法,相當的困擾,不知站上是否有人能知道解決方法
就是使用者註冊後,寄出的確認信,標題能正確顯示,但是內文會變亂碼

我的環境是:
Drupal 5.1 繁體中文
Mail Server 和主機商確認後為 exim mail server, 使用 qmail 寄信,主機商也確認都支援UTF-8 (我從其他信箱寄 UTF-8 的信都正常)
用過 Gmail, Hinet, Hotmail, Yahoo, Horde, Squirrelmail 等等信箱,也確認編碼為 UTF-8,但是都是顯示亂碼

不知其他大大是否有遇到相同問題
請問有沒有解決方法
謝謝

我剛剛去看了一下資料庫
發現資料都是存在 variable 這個資料表裡
如果說這個表格編碼錯誤
其他的顯示應該都是亂碼才對

更奇怪的是,只有信的內文才會這樣
標題也是從這個表格中撈出來的,但是卻可以正常顯示
真是有夠怪

請問這段寄出註冊信的這一段 code 是寫在那裡?
User這個模組嗎?

嗯...我最近發現一個奇怪的狀況,就是用 K2 版型時,css 裡的附註的 url 會跟著寄去...很詭異...
你是用預設版型嗎?

寄註冊信是在 user module 裡沒錯。

後來用 contact 模組來測,狀況是一樣的
所以我去查了 Code,發現都是用同一段 Code 及 Function 來 處理的

在Contact.module 有一個 drupal_mail 的 function
這個 function 是寫在 include/common.inc 中
Code 看起來沒有任何問題,也試著去改MIME Type都是一樣
function drupal_mail($mailkey, $to, $subject, $body, $from = NULL, $headers = array()) {
$defaults = array(
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=UTF-8; format=flowed',
'Content-Transfer-Encoding' => 'quoted-printable',
'X-Mailer' => 'Drupal'
);

而且奇怪的是 $subject 不會亂碼,所以可以確定從資料庫中撈出都是正確的
所以現在懷疑是程式在處理 $body (撈回來的內文) 時產生了問題
是用PHP 的 implode()來處理的嗎,有人知道嗎??
倒底問題出在那,快昏了!!

另外,試過各種寄信方式,只要不經過 Drupal 的信都可以正確顯示!!

對了,比對一下mail的原始碼是否有差異
用drupal寄出的和用其他寄出的同樣內容,原始碼是否有所差異
尤其是header

--
from open mind to open source~

我也跟你遇到一樣的問題 寫信問主機商也沒理我 :(
我個人測試過feedback module和contact
問題一樣是主旨中文正常 但是內文會是亂碼
檢查一下是UTF-8 encoding 硬被改成iso-8859-1的encoding
我也懷疑是 implode()的問題 因為$body內容會在mail之前經過他處理
改了php.ini裡的mbstring的所有選項還是不理我
該怎麼辦呢><
誰能給點靈感?

所有收信的信箱都這樣嗎?
不是,那是該信箱的編碼問題
是,那就比較可能是smtp 設定的問題,不然就是php版本的問題

因為drupal用最單純的mail涵式來做
所以出問題比較容易跟php直接相關
問問主機商,smtp有沒有可以設定的?

--
from open mind to open source~

先感謝jimmy兄回應:)

為了找出問題花了好幾天,也在自己電腦上架設環境來測試
一切正常 但虛擬主機那邊send出來就是一切正常
只有中文的部份亂碼 整個搞的快瘋掉
初步判斷應該是主機商的問題 但直接找線上客服居然不理我直接斷線
先mail把我的問題呈上去 希望能有救
下面是我的環境跟暫時的解決方法:

主機商的php版本是 php 4.4.4 mbstring cjk都有支援
將mail函數改為mb_send_mail()
subject前處理的mime encode函式拿掉
這樣暫時解決了 此方法對feedback ,simple news leter模組都有用
有此鬼問題的各位請試試看吧~

Jiroro 兄:

我向一個美國 web host 網站申請了一個網站,使用Drupal 5架了一個網站 http://hokafn.com/,結果也有同樣的問題。想要用你的方法來解決中文亂碼的問題,只是我看不太懂你的解決方法,可否稍微詳細描述一下檔案的位置,及如何修改,謝謝萬分。

由於這些主機商都是外國人他們沒有考慮到cjk這些族群
因此我發生的問題是php->mail or sendmail(?)這段處理mail內文的字串時
utf-8的內文他會以iso-latin-1的編碼方式pass內文送出去
就是這樣才會造成亂碼 如果有同樣問題的朋友也可測測看是不是這段產生問題

找到問題點了 就來動手改吧我的是drupal 4.7
沒看過 5.0的 但應該差不多
到module下面找出user.module
進入程式碼找到
function user_mail()這段 drupal就是用他發送信件的
接著把裡面的return mail(bla bla bla);這段
改成下面這樣
return mb_send_mail(
$mail,
$subject,
str_replace("\r", '', $message),
"MIME-Version: 1.0\nContent-Type: text/plain; charset=UTF-8; format=flowed\nContent-transfer-encoding: 8Bit\n" . $header
);

這樣就可以解決了 但只能治標不能治本 要是drupal更新你就得每次重改
所以還是要跟主機商爭取一下請他下次編譯時這些套件時加入utf8或cjk支援
希望這樣可以幫到各位需要的朋友們

感謝 Jiroro 兄的快速回應,小弟在5.1版的 user.module 下找不到 function user_mail() 這段程式碼,我猜名稱可能已經改了,但實在找不到類似的名稱。真不知如何是好。

哪位大大的網站空間是在美國,用Drupal 5.1 架站,中文註冊信曾變成亂碼、而現在沒問題的人可以出來解救一下苦難同胞嗎?

感謝 Jimmy 兄的指引,讓小弟成功利用 Jiroro 兄的方法寄出沒有亂碼的中文信。修改方法如下:

將include/common.inc裡頭的function drupal_mail 的
return mail(
$to,
mime_header_encode($subject),
str_replace("\r", '', $body),
join("\n", $mimeheaders)
);

改為
return mb_send_mail(
$to,
$subject,
str_replace("\r", '', $body),
join("\n", $mimeheaders)
);

終於可以成功寄出沒有亂碼的中文註冊信,真是太高興了。謝謝幾位熱心大哥的協助,小弟給諸位大哥行三鞠躬禮。

我的網站也遇到這個問題,就是寄出去的信都是亂碼...

本來也嘗試過 hokafn 的這個解法,結果連內文都被encode成 8bit編碼了...

最後想說自己換成 php-mailer,卻發現早就有 php-mailer的模組了...

在這裡: http://drupal.org/node/95819

安裝這個膜組織後,用SMTP來寄信就可以擺脫亂碼的窘境

特別回來 Drupal Taiwan分享一下