=======更新========
問題は、Content-Type を使用する必要があるときにヘッダー ContentType を使用していたことにありました。
助けてくれてありがとう。
ダープダープダープ。
=======/更新=======
不愉快なほど長い質問を前もってお詫びします。
PHP 経由で添付ファイル付きのメールを送信しようとしています。私は以前に単一の添付ファイルでこれを成功させました。しかし、複数の添付ファイルで動作させることはできません。さらに言えば、この方法を使用して単一の添付ファイルで動作させることもできません。それで、私は何を間違っていますか?
これらの関数を利用できる他のライブラリがあることを理解しています。しかし、これが機能しない理由を知りたいです。
実際の電子メールを生成するメソッドは次のとおりです。
function gen_mail ()
{
$files = $this->files();
$has_attachments = (bool) $files;
$EOL = "\r\n"; // tried \n, PHP_EOL
$message = $this->message;
$headers = $this->gen_headers();
$headers .= "MIME-Version: 1.0$EOL";
if ($has_attachments) {
$hash = md5(time());
$sep = "=={$hash}==";
$headers .= "ContentType: multipart/mixed; boundary=\"$sep\"$EOL$EOL";
$headers .= "This is a MIME-encoded message.$EOL$EOL";
$headers .= "--$sep$EOL";
}
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"$EOL";
$headers .= "Content-Disposition: inline$EOL";
$headers .= "Content-Transfer-Encoding: 7bit$EOL$EOL";
$headers .= "$message$EOL$EOL";
if ($has_attachments) { // here go attachments
foreach ($files as $key => $value) {
$filename = is_numeric($key)? basename($value) : $key;
$file = fopen($value, 'rb');
$data = fread($file, filesize($value));
fclose($file);
$content = chunk_split(base64_encode($data));
$headers .= "--$sep$EOL";
$headers .= "Content-Type: application/octet-stream; ";
$headers .= "name=\"$filename\"$EOL";
$headers .= "Content-Transfer-Encoding: base64$EOL";
// tried Content-Disposition, attachment, and every combination
$headers .= "Content-Description: inline; $EOL ";
$headers .= "filename=\"$filename\"$EOL$EOL";
$headers .= "$content$EOL$EOL";
}
$headers .= "--$sep--$EOL$EOL";
}
return $headers;
}
上記の関数によって返されるヘッダーは次のようになります。
From: test@urbido.es
MIME-Version: 1.0
ContentType: multipart/mixed; boundary="==cd42448edf10bca4640bc7d6365e1961=="
This is a MIME-encoded message.
--==cd42448edf10bca4640bc7d6365e1961==
Content-Type: text/html; charset="iso-8859-1"
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Travis, you are so cool!!!1!
--==cd42448edf10bca4640bc7d6365e1961==
Content-Type: application/octet-stream; name="html.login.php"
Content-Transfer-Encoding: base64
Content-Description: inline;
filename="html.login.php"
PD9waHANCgkNCiRoZWFkZXJfY29uZmlnID0gYXJyYXkoKTsNCiRtc2cgPSAnUmVnaXN0ZXJlZCBP
cGVyYXRvcnMsIGVudGVyIHlvdXIgT3BlcmF0b3IgSUQgYW5kIHBhc3N3b3JkIHRvIGxvZ2luJzsN
CiRtc2dfY2xhc3MgPSAnbm9ybWFsJzsNCmlmICgkbG9nZ2VkX2luKSB7DQoJJGhlYWRlcl9jb25m
aWdbJ2NvbnRyb2xzJ10gPSBhcnJheSAoDQoJCWFycmF5ICgndGV4dCcgPT4gJ1N1Ym1pdCBFbnRy
aWVzJywgJ2hyZWYnID0+ICdlbnRyeScpLA0KCSk7DQoJJG1zZyA9ICdZb3UgYXJlIGxvZ2dlZCBp
bi4gVXNlIHRoZSBhYm92ZSBsaW5rcywgb3IgDQoJCWNsaWNrIDxhIGhyZWY9ImVudHJ5Ij5oZXJl
PC9hPiB0byBiZWdpbiBvciByZXN1bWUgYSBqb2InOw0KCSRtc2dfY2xhc3MgPSAnc3VjY2Vzcyc7
DQp9DQoNCj8+
--==cd42448edf10bca4640bc7d6365e1961==--
私は他の人が書いた関数を試しましたが、それらは一見同一の出力を生成します。しかし、これらのヘッダーを mail($address, $subject, '', $headers) で送信すると
受信トレイにこれを受け取ります:
This is a MIME-encoded message.
--==cd42448edf10bca4640bc7d6365e1961==
Content-Type: text/html; charset="iso-8859-1"
Content-Disposition: inline
Content-Transfer-Encoding: 7bit
Travis, you are so cool!!!1!
--==cd42448edf10bca4640bc7d6365e1961==
Content-Type: application/octet-stream; name="html.login.php"
Content-Transfer-Encoding: base64
Content-Description: inline;
filename="html.login.php"
PD9waHANCgkNCiRoZWFkZXJfY29uZmlnID0gYXJyYXkoKTsNCiRtc2cgPSAnUmVnaXN0ZXJlZCBP
cGVyYXRvcnMsIGVudGVyIHlvdXIgT3BlcmF0b3IgSUQgYW5kIHBhc3N3b3JkIHRvIGxvZ2luJzsN
CiRtc2dfY2xhc3MgPSAnbm9ybWFsJzsNCmlmICgkbG9nZ2VkX2luKSB7DQoJJGhlYWRlcl9jb25m
aWdbJ2NvbnRyb2xzJ10gPSBhcnJheSAoDQoJCWFycmF5ICgndGV4dCcgPT4gJ1N1Ym1pdCBFbnRy
aWVzJywgJ2hyZWYnID0+ICdlbnRyeScpLA0KCSk7DQoJJG1zZyA9ICdZb3UgYXJlIGxvZ2dlZCBp
bi4gVXNlIHRoZSBhYm92ZSBsaW5rcywgb3IgDQoJCWNsaWNrIDxhIGhyZWY9ImVudHJ5Ij5oZXJl
PC9hPiB0byBiZWdpbiBvciByZXN1bWUgYSBqb2InOw0KCSRtc2dfY2xhc3MgPSAnc3VjY2Vzcyc7
DQp9DQoNCj8+
--==cd42448edf10bca4640bc7d6365e1961==--