web-dev-qa-db-ja.com

電子メールヘッダーの文字セット値としてutf-8または "utf-8"を使用する必要がありますか?

転送をオンにしてOutlook.comに電子メールを送信すると、転送されたメールが拒否されます。

送信されたメールとOutlookの受信トレイにあるメールを調べることについて。 Microsoftは基本的にメール本文の一部を書き直していることがわかりました。

例えば

This is a multi-part message in MIME format.
--=_5226908e44ebc0462f06052400644d2f
Content-Type: multipart/alternative;
 boundary="=_926d2a45bc543e1972443c87118fa61a"

--=_926d2a45bc543e1972443c87118fa61a
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=utf-8

SGF2aW5nIGFub3RoZXIgZ28gYXQgZm9yd2FyZGluZyBhbiBlbWFpbCB2aWEgT3V0bG9vay4NCg0K
DQo=
--=_926d2a45bc543e1972443c87118fa61a
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=utf-8

次のようになります。 charset値を囲む引用符に注意してください。

--=_5226908e44ebc0462f06052400644d2f
Content-Type: multipart/alternative;
boundary="=_926d2a45bc543e1972443c87118fa61a"

--=_926d2a45bc543e1972443c87118fa61a
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset="utf-8"

SGF2aW5nIGFub3RoZXIgZ28gYXQgZm9yd2FyZGluZyBhbiBlbWFpbCB2aWEgT3V0bG9vay4NCg0K
DQo=
--=_926d2a45bc543e1972443c87118fa61a
Content-Transfer-Encoding: base64
Content-Type: text/html; charset="utf-8"

メールRFCがとにかく本文の変更を明確に禁止しているという事実(DKIM署名を壊す)は別として、メールヘッダーにcharset=utf-8を書く正しい方法はどれかを尋ねる必要がありますか?

4
Ravenstar68

RFC2045 セクション5.1で、MIMEメッセージで有効な_Content-Type_ヘッダーを作成するために使用される文法を提供します。

_5.1.  Syntax of the Content-Type Header Field

   In the Augmented BNF notation of RFC 822, a Content-Type header field
   value is defined as follows:

     content := "Content-Type" ":" type "/" subtype
                *(";" parameter)
                ; Matching of media type and subtype
                ; is ALWAYS case-insensitive.

     type := discrete-type / composite-type

     discrete-type := "text" / "image" / "audio" / "video" /
                      "application" / extension-token

     composite-type := "message" / "multipart" / extension-token

     extension-token := ietf-token / x-token

     ietf-token := <An extension token defined by a
                    standards-track RFC and registered
                    with IANA.>

     x-token := <The two characters "X-" or "x-" followed, with
                 no intervening white space, by any token>

     subtype := extension-token / iana-token

     iana-token := <A publicly-defined extension token. Tokens
                    of this form must be registered with IANA
                    as specified in RFC 2048.>

     parameter := attribute "=" value

     attribute := token
                  ; Matching of attributes
                  ; is ALWAYS case-insensitive.

     value := token / quoted-string

     token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
                 or tspecials>

     tspecials :=  "(" / ")" / "<" / ">" / "@" /
                   "," / ";" / ":" / "\" / <">
                   "/" / "[" / "]" / "?" / "="
                   ; Must be in quoted-string,
                   ; to use within parameter values
_

valueが_token / quoted-string_としてどのように定義されているかに注意してください。

このセクションのさらに下には、例を含むテキストによる説明があります。

_   Note that the value of a quoted string parameter does not include the
   quotes.  That is, the quotation marks in a quoted-string are not a
   part of the value of the parameter, but are merely used to delimit
   that parameter value.  In addition, comments are allowed in
   accordance with RFC 822 rules for structured header fields.  Thus the
   following two forms

     Content-type: text/plain; charset=us-ascii (Plain text)

     Content-type: text/plain; charset="us-ascii"

   are completely equivalent.
_

ご覧のとおり、値がすでにtoken1*<any (US-ASCII) CHAR except SPACE, CTLs, or tspecials>)であるが有効な場合、引用符は必須ではありませんそれにもかかわらず。

3
Daniel B

良い質問。私の経験では、HTMLメールヘッダーはHTML(Webサーバー)ヘッダーとそれほど変わらないので、引用されていないバージョンは次のようにします。

Content-Type: text/html; charset=utf-8

そして、MIMEエンコーディングのRFC( RFC 2047 )を深く掘り下げて、これを見つけました:

2. Syntax of encoded-words

   An 'encoded-Word' is defined by the following ABNF grammar.  The
   notation of RFC 822 is used, with the exception that white space
   characters MUST NOT appear between components of an 'encoded-Word'.

   encoded-Word = "=?" charset "?" encoding "?" encoded-text "?="

   charset = token    ; see section 3

   encoding = token   ; see section 4

引用符で囲まれたトークン値が有効かどうかについては、どの時点でも言及されていません。だから私はマイクロソフトがどういうわけか引用符で囲まれた値を持つようにヘッダーを書き直していると仮定するつもりですか?提供された証拠を超えた手がかりはありませんが、Microsoftが行っていることをデフォルトにする代わりに、引用符で囲まれていない値を使用することを延期します。

1
JakeGould