سؤال

من الواضح أن تشفير رسائل البريد الإلكتروني اليابانية يمثل تحديًا إلى حد ما، وهو ما أكتشفه بنفسي ببطء.في حالة وجود أي خبراء (حتى أولئك ذوي الخبرة المحدودة سيفعلون ذلك)، هل يمكنني الحصول على بعض الإرشادات حول كيفية القيام بذلك، وكيفية اختباره وكيفية التحقق منه؟

ضع في اعتبارك أنني لم أطأ أي مكان بالقرب من اليابان مطلقًا، الأمر ببساطة هو أن المنتج الذي أقوم بتطويره يُستخدم هناك، من بين أماكن أخرى.

ما (أعتقد) الذي أعرفه حتى الآن هو التالي:
- يجب ترميز رسائل البريد الإلكتروني اليابانية في ISO-2022-JP، أو صفحة الرموز JIS اليابانية 50220 أو ربما صفحة الرموز SHIFT_JIS 932
- يجب ضبط تشفير نقل البريد الإلكتروني على Base64 للنص العادي و7 بت لـ Html
-يجب تشفير موضوع البريد الإلكتروني بشكل منفصل للبدء بـ "=؟ ISO-2022-JP؟ B؟" (لا أعرف ماذا يفترض أن يعني ذلك).لقد حاولت ترميز الموضوع بـ

"=?ISO-2022-JP?B?" + Convert.ToBase64String(Encoding.Unicode.GetBytes(subject))

والذي يعطي بشكل أساسي السلسلة المشفرة كما هو متوقع ولكن لا يتم تقديمها كأي نص ياباني في برنامج البريد الإلكتروني
- لقد قمت باختبار Outlook 2003 وOutlook Express وGMail

أي مساعدة سيكون موضع تقدير كبير


حسنًا، لنشر تحديث قصير، بفضل الإجابتين المفيدتين، تمكنت من الحصول على التنسيق والتشفير الصحيحين.الآن، يقدم Outlook شيئًا يشبه الموضوع الصحيح:
=?iso-2022-jp?B?6 Japanese test に各々の視点で語ってもらった。 6相当の防水?=

ومع ذلك، فإن نفس البريد الإلكتروني في Outlook Express يقدم موضوعًا مثل هذا:
=?iso-2022-jp?B?6 Japanese test 縺ォ蜷・・・隕也せ縺ァ隱槭▲縺ヲ繧ゅi縺」縺溘・ 6逶ク蠖薙・髦イ豌エ?=

علاوة على ذلك، عند عرضه في طريقة عرض "علبة الوارد" في Outlook Express، يصبح موضوع البريد الإلكتروني أكثر غرابة، مثل هذا:
=?iso-2022-jp?B?6 Japanese test ??????????????? 6???????=

يبدو أن Gmail يعمل بنفس الطريقة التي يعمل بها Outlook، والذي يبدو صحيحًا.

أنا فقط لا أستطيع الحصول على رأسي حول هذا.

هل كانت مفيدة؟

المحلول

لقد كنت أتعامل مع الترميزات اليابانية منذ ما يقرب من 20 عامًا ولذا يمكنني أن أتعاطف مع الصعوبات التي تواجهها.ترسل مواقع الويب التي عملت عليها مئات رسائل البريد الإلكتروني يوميًا إلى العملاء اليابانيين حتى أتمكن من مشاركة ما نجح معنا.

  • بادئ ذي بدء، لا تستخدم Shift-JIS.أنا شخصيًا أتلقى عددًا كبيرًا من رسائل البريد الإلكتروني اليابانية ولم يتم تشفيرها مطلقًا باستخدام Shift-JIS.أعتقد أن الإصدار القديم (حوالي Win 98؟) من Outlook Express قام بتشفير البريد الصادر باستخدام Shift-JIS، لكنك لا تراه في الوقت الحاضر.

  • كما أدركت، فأنت بحاجة إلى استخدام ISO-2022-JP كتشفر خاص بك لأي شيء يتم إدراجه في رأس البريد على الأقل.يتضمن هذا الموضوع والسطر إلى والسطر CC.سيعمل UTF-8 أيضًا في معظم الحالات، لكن ولن يعمل على بريد Yahoo Japan، وكما يمكنك أن تتخيل، يستخدم العديد من المستخدمين اليابانيين بريد Yahoo Japan.

  • يمكنك استخدام UTF-8 في نص البريد الإلكتروني، ولكن من المستحسن أن تقوم base64 بتشفير النص الياباني المشفر بـ UTF-8 ووضعه في النص بدلاً من نص UTF-8 الخام.ومع ذلك، من الناحية العملية، أعتقد أن نص UTF-8 الخام سيعمل بشكل جيد هذه الأيام بالنسبة لنص البريد الإلكتروني.

  • كما أشرت أعلاه، تحتاج على الأقل إلى إجراء اختبار على Outlook (Exchange)، وOutlook Express (IMAP/POP3)، وبريد الويب Yahoo Japan.تعد شركة Yahoo Japan هي الأصعب لأنني أعتقد أنها تستخدم EUC لتشفير صفحات الويب الخاصة بها، ولذلك يتعين عليك اتباع المعايير الصحيحة لرسائل البريد الإلكتروني الخاصة بك وإلا فلن تعمل (ISO-2022-JP هو المعيار القياسي لإرسال رسائل البريد الإلكتروني اليابانية ).

  • كما يجب ألا يتجاوز سطر الموضوع 75 حرفًا في كل سطر.أي 75 حرفًا بعد لقد قمت بتشفير ISO-2022-JP وbase64، وليس 75 حرفًا قبل التحويل.إذا تجاوزت 75 حرفًا ، فأنت بحاجة إلى تقسيم موضوعك المشفر إلى خطوط متعددة ، بدءًا من "=؟ ISO-2022-JP؟ B؟" وتنتهي بـ "؟ =" على كل سطر.إذا لم تقم بذلك، فقد يتم اقتطاع موضوعك (اعتمادًا على قارئ البريد الإلكتروني، وكذلك محتوى نص الموضوع).وفقًا لـ RFC 2047:

"لا يجوز أن يزيد طول "الكلمة المشفرة" عن 75 حرفًا، بما في ذلك "مجموعة الأحرف" و"التشفير" و"النص المشفر" والمحددات.إذا كان من المرغوب فيه ترميز نص أكثر مما يمكن احتواؤه في "كلمة مشفرة" مكونة من 75 حرفًا، فيمكن استخدام "كلمات مشفرة" متعددة (مفصولة بمسافة CRLF)."

  • إليك بعض نماذج كود PHP لترميز الموضوع:

 // Convert Japanese subject to ISO-2022-JP (JIS is essentially ISO-2022-JP)

 $subject = mb_convert_encoding ($subject, "JIS", "SJIS");

 // Now, base64 encode the subject

 $subject = base64_encode ($subject);

 // Add the encoding markers to the subject

 $subject = "=?iso-2022-jp?B?" . $subject . "?=";

 // Now, $subject can be placed as-is into the raw mail header.
  • راجع RFC 2047 للحصول على وصف كامل لكيفية تشفير رأس بريدك الإلكتروني.

نصائح أخرى

http://en.wikipedia.org/wiki/MIME#Encoded-Word للحصول على وصفا حول كيفية ترميز حقول رأس في رسائل MIME المتوافقة. يبدو أنك لتكون في عداد المفقودين "؟ =" في نهاية موضوعك.

=?ISO-2022-JP?B?TEXTTEXT...

ISO_2022-JP يعني أن السلسلة مشفرة في صفحة الرموز ISO-2022-JP (على سبيل المثال.ليس Unicode) B يعني أن سلسلة BESE64 مشفرة

في المثال الخاص بك، يجب عليك فقط توفير السلسلة الخاصة بك بتنسيق ISO-2022-JP بدلاً من Unicode.

ولدي بعض الخبرة تأليف وإرسال البريد الإلكتروني في اليابانية ... عادة لديك إلى الحذر ما الترميز المستخدم لنظام التشغيل وكيفية تخزين سلاسل اليابانية الخاصة بك! يتم ترميز بلدي الأشياء البريد عادة على النحو التالي:

    string s = "V‚µ‚¢ŠwK–@‚Ì‚²’ñˆÄ"; // Our japanese are shift-jis encoded, so it appears like garbled
    MailMessage message = new MailMessage();
    message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
    message.Subject = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is
    message.Body = s.ToEncoding(Encoding.GetEncoding("Shift-Jis")); // Change the encoding to whatever your source is

وبعد ذلك لدي طريقة التمديد الذي يقوم بتحويل بالنسبة لي:

public static string ToEncoding(this string s, Encoding targetEncoding)
        {   
            return s == null ? null : targetEncoding.GetString(Encoding.GetEncoding(1252).GetBytes(s)); //1252 is the windows OS codepage            
        }

وشيء من هذا القبيل يجب انجاز هذه المهمة في بيثون:


#!/usr/bin/python                                                                                                            
# -*- mode: python; coding: utf-8 -*-                                                                                        
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def send_from_gmail( from_addr, to_addr, subject, body, password, encoding="iso-2022-jp" ):

    msg = MIMEText(body.encode(encoding), 'plain', encoding)
    msg['Subject'] = Header(subject.encode(encoding), encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo(); s.starttls(); s.ehlo()

    s.login(from_addr, password)
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
    return "Sent mail to: %s" % to_addr



if __name__ == "__main__":
    import sys
    for n,item in enumerate(sys.argv):
        sys.argv[n] = sys.argv[n].decode("utf8")

    if len(sys.argv)==6:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5] )
    elif len(sys.argv)==7:
        print send_from_gmail( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], encoding=sys.argv[6] )
    else:
        raise "SYNTAX: %s <from_addr> <to_addr> <subject> <body> <password> [encoding]"

و** صارخ سرقة / مقتبس من:

http://mtokyo.blog9.fc2.com/blog-entry -127.html

وقبل كل شيء يجب أن يكون مستخدما:

وEncoding.GetEncoding("ISO-2022-JP")

ولتحويل سطر الموضوع الخاص بك إلى وحدات البايت التي سيتم تجهيزها من قبل Convert.ToBase64String ().

و=؟ ISO-2022-JP؟ B؟ TEXTTEXT ...؟ = يحكي عميل البريد المتلقي الذي كان يستخدم الترميز على الجانب المرسل إلى تحويل "الرسائل" اليابانية في تيار بايت.

وحاليا كنت تستخدم UTF-16 إلى ترميز، ولكن تحديد ISO-2022-JP فك شفرة. ومن الواضح أن هذه اثنين من ترميزات مختلفة، وأعتقد، تماما مثل ISO-8859-1 يختلف عن يونيكود (وأكثرها طويلة حرف غرب أوروبا من بايت واحد في ISO-XXX، لكن بايت اثنين في Unicode).

ولست متأكدا ما الذي تعنيه UTF-8 يجري من الدرجة الثانية مواطن. طالما يفهم عميل البريد المتلقي UTF-8 ويكون قادرا على تحويله إلى لغة اليابانية الحالية، كل شيء على ما يرام.

<?php

function sendMail($to, $subject, $body, $from_email,$from_name)
 {
$headers  = "MIME-Version: 1.0 \n" ;
$headers .= "From: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";
$headers .= "Reply-To: " .
       "".mb_encode_mimeheader (mb_convert_encoding($from_name,"ISO-2022-JP","AUTO")) ."" .
       "<".$from_email."> \n";


$headers .= "Content-Type: text/plain;charset=ISO-2022-JP \n";


/* Convert body to same encoding as stated
in Content-Type header above */

$body = mb_convert_encoding($body, "ISO-2022-JP","AUTO");

/* Mail, optional parameters. */
$sendmail_params  = "-f$from_email";

mb_language("ja");
$subject = mb_convert_encoding($subject, "ISO-2022-JP","AUTO");
$subject = mb_encode_mimeheader($subject);

$result = mail($to, $subject, $body, $headers, $sendmail_params);

return $result;
}

ومقدمة من الترميز الياباني إلى البريد الإلكتروني حدث في مايكروسوفت لنشر (على شبكة UUCP على مستوى الأمة) في وقت مبكر 90.

وفي ذلك الوقت، تم تعريف RFC1468.  إذا كنت تتبع RFC1468 في بريد نص عادي، لن يكون هناك أي مشكلة.

إذا كنت تريد التعامل مع البريد HTML، RFC1468 لا طائل منه إلا لقطع الرأس.

وإليك ما يمكنني استخدامها لإرسال رسائل البريد الإلكتروني اليابانية. سطر الموضوع تبدو على ما يرام في Outlook 2010، بريد جوجل وعلى اي فون.

Encoding encoding = Encoding.GetEncoding("iso-2022-jp");
byte[] bytes  = encoding.GetBytes(subject);
string uuEncoded = Convert.ToBase64String(bytes);
subject = "=?iso-2022-jp?B?" + uuEncoded + "?=";

// not sure this is actually necessary...
mailMessage.SubjectEncoding = Encoding.GetEncoding("iso-2022-jp");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top