seikin123
@seikin123 (吉田 大希)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

quoted-printableについて

解決したいこと

・AWS SESメール本文に改行を設定しているが、正しく改行が反映されないこと

laravelで開発をしていて、sesライブラリを使用して開発をしていて
mailhogを使用して動作確認しています。

発生している問題・エラー

メールのデコード処理のプログラムに不具合があるため、調査しています。

問題となっているメールは、

「quoted-printable」でエンコードされています。
また、デコード前の本文は下記のようになっています。

<本文>

sample.blade.php
ご不明点は「株式会社AAA カスタマーサポート」へお問い合わせください。

株式会社AAA カスタマーサポート
受付時間:10:00~19:00(年中無休)

"お問い合わせください。"の後には改行があります。
このメールが「quoted-printable」でエンコードされると
mailhogでのSource↓

=E4=B8=8D=E6=98=8E=E7=82=B9=E3=81=AF=E3=80=8C=E6=A0=AA=E5=BC=8F=E4=BC=9A=
=E7=A4=BEAAA =E3=82=AB=E3=82=B9=E3=82=BF=E3=83=9E=E3=83=BC=E3=82=B5=
=E3=83=9D=E3=83=BC=E3=83=88=E3=80=8D=E3=81=B8=E3=81=8A=E5=95=8F=E3=81=84=
=E5=90=88=E3=82=8F=E3=81=9B=E3=81=8F=E3=81=A0=E3=81=95=E3=81=84=E3=80=82
=

=E6=A0=AA=E5=BC=8F=E4=BC=9A=E7=A4=BEAAA =E3=82=AB=E3=82=B9=E3=82=BF=
=E3=83=9E=E3=83=BC=E3=82=B5=E3=83=9D=E3=83=BC=E3=83=88
=E5=8F=97=E4=BB=
=98=E6=99=82=E9=96=93=EF=BC=9A10:00=EF=BD=9E19:00=EF=BC=88=E5=B9=B4=
=E4=B8=AD=E7=84=A1=E4=BC=91=EF=BC=89

となり、"お問い合わせください。"の末尾に"="が付与されます。(5行目)

mailhogでの表示は下記のようになります。
"お問い合わせください。"の後の改行が削除されてしまっています。
Plain text↓
スクリーンショット 2022-09-30 16.20.25.png

「quoted-printable」でエンコードされる場合は、
エンコード後の文字列長を76文字以下にする必要があるため、
"="が付与されることは、調べてわかったのですが、
上記の場合、76文字に満たないため、"="は不要かとおもいますが、
"="が何故付いてしまうのかわかりません。

ヘッダには、
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=utf-8
となっているため、「quoted-printable」でエンコードされていると判断しました。

76文字未満にもかかわらず、何故エンコード後に"="が付与されてしまうのかを
わかる方、いらっしゃいませんでしょうか?
また、こちらの解消方法をご教示願いたいです。

駄文で、申し訳ありませんが、よろしくお願いいたします。

0

3Answer

末巻を一読下さい。

先方の解釈ミスでは?
76未満で1行にするためソフト改行の = を付加し、復元の時は 改行を復元しない仕様です。

=DF=AD=
=DF=AD
=E5=90=88=E3...
=
改行

上記はデコードされるのでは?
つまり、仕様に違反しているが、仕様の寛容さが意図してか?偶然か?分かりませんが?

1Like

Comments

  1. @seikin123

    Questioner

    ご回答、資料提供ありがとうございます!

    1行76文字未満に達していない場合(71文字や72文字)でも、「=」(ソフト改行)がついてしまう場合はありますでしょうか。
    mailhogで確認すると、現状上記のような現象が起こってしまい意図しない文章になってしまっています。

=E7=A4=BEAAA を
=E7=A4=BE=61=61=61 にして無駄があつてもエンコードする方もいます。残念ながらライブラリーがRFCを完全に理解して実装しているか?疑問のケースが多々あります。
 例えばcsv形式です。このケースも同じではないでしょうか?

1Like

なぜ76文字未満なのに末尾 = がつくかは、どのライブラリで quoted-printable エンコーディングしているか分からないと答えられません。ついたとしても仕様には違反していない1ので、そのソースは正しくデコードできるべきです。

ちなみに、ソース5行目の = は「お問い合わせください。」の末尾についているのではなくて、 = 1文字だけが5行目に書かれています。その = と5行目末尾の改行は打ち消し合いますが、4行目「お問い合わせください。」の末尾にはちゃんと改行が存在し、6行目にも改行があるので、合計2つ改行して sample.blade.php と同じ形になります。(試しに https://www.en-pc.jp/tech/quoted-printable.php でデコードしてみてください。)

mailhog で改行が消えて見えるのは mailhog のデコーダか表示のバグではないかと思います。試しに適当な quoted-printable データを流し込んでみたところ、末尾の = の後に改行が複数個続くとまとめて打ち消されてしまうようでした。この挙動は仕様に違反しているはずです。

mailhog は置いておいて、実在のメールアドレスに送って見た目を確認してみるといいと思います。

  1. RFC2045 の quoted-printable 仕様では、1行が76文字を超えたら末尾に = をつけて改行しなくてはならないと書いてありますが、76文字以下の場合は特に何も言及されていません。

1Like

Comments

  1. @seikin123

    Questioner

    ご回答ありがとうございます!

    ちなみに、LaravelでSESを使う為下記ライブラリを使用しています!
    ・"guzzlehttp/guzzle": "^7.0.1",
    ・"aws/aws-sdk-php": "^3.225",

    ご説明いただいた通り、
    いただいた、デコードツールで試したところ、sample.blade.phpと同じになること確認できました。

    ```
    mailhog で改行が消えて見えるのは mailhog のデコーダか表示のバグではないかと思います。
    ```
    バグの可能性も考えられるのですね!
    私も引き続き、何回か、メール送信をしてmailhogで確認をしてみたのですが、
    別のメール本文の箇所でも、「=」が末尾に付与され、改行が消されるということがありました。

    予期せぬ「=」が付与される箇所に、規則性がなくランダムに付与されているようでした。

    mailhogでの表示確認が目的になってしまっていました。
    mailhogではなく、実際のメールでちゃんと表示されることが確認できれば良いので、実在のメールで表示確認をしてみます。

Your answer might help someone💌