質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Email

Email(電子メール)とは、ネットワークを介してメッセージを送受信するシステム。インターネット上で利用するメールを、Emailと呼ぶ場合が多いです。 インターネットの普及に伴い、現在では一般的なサービスとなっています。文字の他にも、画像、音声、プログラムなどを送受信することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

0回答

344閲覧

添付ファイルを含めるとDKIMをPASSしない件

Clementine

総合スコア158

Email

Email(電子メール)とは、ネットワークを介してメッセージを送受信するシステム。インターネット上で利用するメールを、Emailと呼ぶ場合が多いです。 インターネットの普及に伴い、現在では一般的なサービスとなっています。文字の他にも、画像、音声、プログラムなどを送受信することが可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

1クリップ

投稿2024/05/21 05:32

Codeigniter v3.1.0のメール送信ライブラリ

system/libraries/Email.phpを単体で使用する為に次のように改修しました。
改修は主にCommon.phpのヘルパー関数の一部をEmail.phpへ移設しget_instance()やlog_message()関数の首絞め等を行っています。

そのファイルを読み込んで次のようにメール送信プログラムを作成

php

1 $email = new CI_Email(); 2 $config = array( 3 'useragent' => 'Codeigniter', 4 'protocol' => 'sendmail', 5 'wordwrap' => FALSE, 6 'charset' => 'iso-8859-1', 7 'priority' => 1, 8 ); 9 10 $email->initialize($config); 11 $email->set_wordwrap(false); 12 $email->from($from); 13 $email->to($to); 14 15 if ($cc != false) { 16 $email->cc($cc); 17 } 18 19 $message = chunk_split($message, 75 , "\n"); 20 $message = mb_convert_encoding($message, 'UTF-8', 'AUTO'); 21 22 $message2 = ""; 23 foreach (explode("\r\n", $message) as $msg){ 24 $message2 .= "{unwrap}".$msg."{/unwrap}"."\n"; 25 } 26 $email->message($message2); 27 28 29 if ($attach != false) 30 { 31 $email->attach($attach); 32 } 33 34 $email->send(); 35 echo $email->print_debugger();

上記より添付ファイルが無い場合はDKIMは問題なくPASSしますが添付ファイル(PDF・画像ファイルなど)が含まれると次のエラーになります。

ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@example.com header.s=20240416dkim header.b=POhVQz12; spf=pass (google.com: domain of info@example.com designates 0.0.0.0 as permitted sender) smtp.mailfrom=info@example.com ; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=example.com

添付ファイルを含めてもDKIMをPASSする方法を探しています。
何卒ご教授頂けますようお願いします。

補足:諸事情によりドメイン名、IPは伏せています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tezcello

2024/05/21 06:51

> dkim=neutral (body hash did not verify) この文言で検索して、質問者さんのサーバ等の状況を確認しては? > 添付ファイルを含めるとDKIMをPASSしない メールを送信する為の諸ルールを守っていないのかもしれません。 __ボディがダメって言ってるっぽいので、勝手な改行が為されるとか
bsdfan

2024/05/21 07:30

添付ファイルをつけたときの Base64 でエンコードされた部分の改行コードが \r\n になっているとかは、ないでしょうか?
tezcello

2024/05/21 08:50

> ないでしょうか? それは解りません。 全てのサーバを検証できませんしする気も無いですし... ただ、テキトーな設定でメールを作成していると、ハッシュ値生成時のボディに \r が有ったり無かったりしていて、どこかのサーバが \r\n あるいは \n に統一したりするとアウトですよね? 1行の文字数を厳密に見ている(あるいは少なめに設定している)とかで、改行が挿入されちゃうとか? __実にテキトーな意見です
ikedas

2024/05/21 09:32

上と同じことも書いていますが、昼に書いて今投稿しているので。 ___ CodeIgniterにはDKIM署名を付加する機能はないようなので、MTAにメッセージを渡してそちらで署名を付加しているのでしょうね。 DKIM署名でbody hashが正常でない原因で割とありそうなのは、次のようなものではないかと思います (他にもあるかもしれませんが)。 ・MTAに渡すメッセージの中で改行コードとして “\r\n” と “\n” が混在している。 ・MTAに渡すメッセージの最終行が改行コードで終わっていない (最終行が空行である必要はないです。行の最後に改行文字がない場合です)。 このような場合にはDKIM署名の計算が正しく行われない可能性があります。 sendmailを使ってMTAにメッセージを渡しているようなので、sendmail ($email->mailpathで設定されているプログラム) に入力されるデータの内容を確認してみたらよいのではないでしょうか。 あと、Code Igniter側ではない原因としては、MTAで署名した後にメッセージを改変するようなことをしている (ウィルススキャンなどによって添付ファイルのパートが改変されるなど) といったことはないでしょうか。 あと、直接関係ないかもしれませんが指摘のみ。 19 $message = chunk_split($message, 75 , "\n"); ですが一方 23 foreach (explode("\r\n", $message) as $msg){ と、改行コードが一致していないです。意図してこのようにしているのなら気にしないでください。
ikedas

2024/05/21 10:06

> 添付ファイルをつけたときの Base64 でエンコードされた部分の改行コードが \r\n になっているとかは、ないでしょうか? Email.phpのソースをざっとみてみましたが、base64_encode() の値に“\r\n” が含まれていても改行を正規化 (設定により“\n” か “\r\n” のどちらか) するようになっているように見えました。が、全部をちゃんと追ったわけではないので、同様の問題がどこかに潜んでいる可能性もありますね。
bsdfan

2024/05/21 12:45

ソースコードをざっと見た限り、添付ファイルについては base64_encode() したものを、デフォルトのseparator = "\r\n" で chunk_split() しているので、そこの改行コードが怪しいような気がしました。 (ほかの場所でちゃんと正規化されているのかまでは追えていないので自身ありません)
tezcello

2024/05/21 21:27

CodeIgniterのメールクラス内で「改行文字」を \r\n としているのならば、\n でしか区切っていない文字列を与えてもチャンと変換していて当り前でしょうけど、どうなってるんでしょうかねぇ? > $message = chunk_split($message, 75 , "\n"); と意図的に \n を利用していますけど、CodeIgniter の流儀なんでしょうか? マニュアルを見ると、rfcに寄せる為のデフォルト値( \r\n )みたいですけど。 また、mail()のマニュアルには、送信メッセージは70文字を超えてはいけないってのがあるけれど、75バイトの分割で大丈夫? また、CodeIgniterのメールクラス内でキチンと MIMEを通してくれるなら、この辺りは不要なのかも... > $message = mb_convert_encoding($message, 'UTF-8', 'AUTO'); chunkした後で、文字エンコードを変換するって事は、chunkする前は普通の文字列って事ですよね? 一定バイト数で切ってしまうと、文字化けの原因にしかならないのでは? そして、バイト数を揃えた後に文字エンコードを変更すると、揃えた意味が無くなるのでは? __今時 UTF-8ではない文字エンコードでデータを保持しているとは思えない... __本当にこの行が必要でしょうか? __元が Shift_JISとかだとバイト数が異なる可能性が大 > foreach (explode("\r\n", $message) as $msg){ \n で chunkしたのに、\r\n で分割すると、全体が一気に出て来るだけでは? しかも、chunk前が普通の文字列(BASE64ではない)なので、その中に \r\n が含まれているとそこで分割されたモノが対象となるけれど、それが意図した動作なのでしょうか? CodeIgniterは使っていませんので、内部でどの様な処理をしているのか知りませんが(調べる気も無いですが)、僕自身は自前でメールボディを生成して mail()で送っています。 本文も添付ファイルデータも base64_encode() の出力を chunk_split()で68バイト、\r\n で分割してます。 DKIMに関しては Postfixと連携した Rspamdがやってくれていて、特に問題なく送信出来ています。
ikedas

2024/05/21 23:38 編集

> CodeIgniterのメールクラス内で「改行文字」を \r\n としているのならば $email->newline や $email->crlf の初期値は "\n" です。 ただ、sendmailはMTAにメッセージを渡すときに自動的に改行を判別して "\r\n" に変換してくれます……のですが、改行コードが混在している場合は自動的に変換してくれないことがあります。たとえばPostfixに付属のsendmailの場合はメッセージの最初の行の改行コードを見て "\n" だったら改行を変換します。"\r\n" だったら以降の改行コードは変換されません。 > 送信メッセージは70文字を超えてはいけない え? と思って見てみたら本当にそう書いてありますね。RFC822/RFC5322の規定は | Each line of characters MUST be no more than 998 characters, and SHOULD be no more than 78 characters, excluding the CRLF. です。 まあ「改行を除いて78文字」は「SHOULD」なので、それを超えているからといってメッセージの受け付けを拒否したりするのは感心しないですが。それにしても「70文字」というのはどこから出てきたのだろう。 質問者さんへ: まあとにかく、/usr/sbin/sendmailを一時的に置き換えて,入力されたデータを何かファイルに落とすようにしておいてメールを送ってみれば送られているデータが取れます。まずはそういうことをやって現状どうなっているか確認してみてはどうですか。
tezcello

2024/05/22 04:47

> メッセージの最初の行の改行コードを見て "\n" だったら改行を変換します。"\r\n" だったら以降の改行コードは変換されません やはり、中途半端に混在すると色々都合が悪いのかもしれませんね。 > RFC822/RFC5322の規定は 僕も不思議な感じがしたのですが、PHPの中の人に問い合わせるまではしていません。 明言している以上ナニカあるのだろう...って思ってます。 個人的には色々不思議な処理(\nで chunkして、\r\nで分割して {unwrap} ~ {/unwrap}\n とか)が理解できませんが、これが CodeIgniterでのお作法だとしたら、CodeIgniterは全体として DKIMには対応できていないのかもと疑ってしまいます。 でも、実は悪さをしているのはローカルサーバではなく、中継サーバじゃないかというのは、少し強く疑っています。 __中継サーバーがポンコツ(ある意味厳密?)で、勝手に改行を付加するとか
Clementine

2024/06/11 09:02

コメントありがとうございます。が解決しました! ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
tezcello

2024/06/11 10:02

> コメントありがとうございます。が解決しました! > ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか? これでは誰に対して発言しているのか判らない...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問