phpでのメール転送(添付ファイルつき)について
目的:
phpにて、添付付きメールを、件名だけ変更して、添付ファイルごと外部へ転送する。
現在、メール受信したものを、mysqlに保存(UID、件名、送信元メールアドレス(一致したものを、指定の件名に変更)、送信日、受信日、本文)、
添付ファイルはサーバー上に保存し、
メール送信時に、サーバー上に保存した添付ファイルとmysqlのデータを読み込み、送信しています。
(添付ファイルは、定期的に削除)
これを、もっと簡潔に出来ないでしょうか。
サーバー上に添付ファイルを残さないで済み、
未受信のメールのみ
1画面上で、添付メールごと転送できるのが理想です。
※mysqlへの保存は、あってもなくてもかまいません。
以下が、現在の状態です。
参考にしたのは、こちらのサイトです。
http://hal456.net/qdmail_rec/top
http://www.favorite-labo.org/view/202
※サーバはCPIです。
**メール受信処理**
<?php
// QdmailReceiver呼び出し
require_once('qdmail_receiver.php');
//POPサーバー(受信サーバー)にアクセスするための初期設定。
$server = array(
'protocol'=>'pop3',
'host'=>'(ホスト名)',
'user'=>'(ユーザー名)',
'pass'=>'(パスワード)',
);
qd_receive_mail( 'start' , $server , 'eucJP-win' );
//オブジェクト指向モードでの初期化
$receiver = QdmailReceiver::start( 'pop' , $server);
for($i = 1 ; $i <= $receiver->count() ; $i++){
$todaydata = date("Y-m-d");
// *************** メールデータ取得処理 ***************
$pointer = $receiver->pointer(); // pointer
$popuid = $receiver -> header( 'popuid' );// UID
$subject_name = mb_convert_encoding(($receiver->header( array('subject','name') , 'none' )),"Shift-JIS","auto");//件名
$from_mail = $receiver->header( array('from','mail') , 'none');//送信元メールアドレス
$date = $receiver -> header('date');//送信日
$text = mb_convert_encoding(($receiver->text()),"Shift-JIS","auto");//本文
// *************** UID照合処理 ***************
include '(mysql接続)';
$ii=0;
while ($row = mysql_fetch_assoc($result)) {
$ii++;
}
if($ii == 0){
// *************** 転送前データの保存 ***************
include '(mysql接続)';
// *************** 添付ファイル保存 ***************
$attach = $receiver->attach();
foreach($attach as $att){
$moji = mb_convert_encoding($att['filename'],"Shift-JIS","auto");
$fp=fopen($moji,'w');
fputs($fp,$att['value']);
fclose($fp);
}
}else{
print('取得済みにつき未処理');
}
?>
**メール送信**
<?php
//マイムタイプ定義
$mime_content_types = array(
'ez' => 'application/andrew-inset',
'atom' => 'application/atom+xml',
'atomcat' => 'application/atomcat+xml',
~略~
'avi' => 'video/x-msvideo',
'movie' => 'video/x-sgi-movie',
'ice' => 'x-conference/x-cooltalk'
);
//送信先メールアドレス
$to = '(送信先メールアドレス)';
//送信元メールアドレス
$from = '(取得した送信元メールアドレス)';
//件名
$subject = '(変更した件名)';
//メール本文
$message = (取得した本文);
//添付ファイル
$files = array('(添付ファイル1へのパス)','(添付ファイル2へのパス)…以下、あるだけ');
//件名・本文をエンコード
$subject = mb_convert_encoding($subject, 'JIS', 'Shift-JIS');
$message = mb_convert_encoding($message, 'JIS', 'Shift-JIS');
$subject = '=?iso-2022-jp?B?' . base64_encode($subject) . '?=';
//バウンダリ文字列を定義
if (empty($files)) {
$boundary = null;
} else {
$boundary = md5(uniqid(rand(), true));
}
//メールボディを定義
if (empty($files)) {
$body = $message;
} else {
$body = "--$boundary\n";
$body .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
$body .= "Content-Transfer-Encoding: 7bit\n";
$body .= "\n";
$body .= "$message\n";
foreach($files as $file) {
if (!file_exists($file)) {
continue;
}
$info = pathinfo($file);
$content = $mime_content_types[$info['extension']];
$filename = basename($file);
$body .= "\n";
$body .= "--$boundary\n";
$body .= "Content-Type: $content; name=\"$filename\"\n";
$body .= "Content-Disposition: attachment; filename=\"$filename\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "\n";
$body .= chunk_split(base64_encode(file_get_contents($file))) . "\n";
}
$body .= '--' . $boundary . '--';
}
//メールヘッダを定義
$header = "X-Mailer: PHP5\n";
$header .= "From: $from\n";
$header .= "MIME-Version: 1.0\n";
if (empty($files)) {
$header .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
} else {
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
}
$header .= "Content-Transfer-Encoding: 7bit";
//メール送信
if (mail($to, $subject, $body, $header)) {
echo 'メールが送信されました。';
} else {
echo 'メールの送信に失敗しました。';
}
?>
以上、よろしくお願いします
お礼
ご回答ありがとうございます。Beckyで見る限りウィンドウ下のヘッダータブになっているので本文ではなくヘッダーだと思っていました。 今返信でメールを作成してみましたが、本文であれば引用される部分に何も出てこないので、やはりヘッダーだと思います。 >メーラーソフトを使わず、SMTPサーバーに直に繋いで送信すれば、どのようなメールであろうが自由に送れます。 こういう事なんですね。だから基本はいたずらだろうと思っていたのですが、今回はスマホで撮影した写真をそのままメール送信したらしく、本文も何もありませんでした。いたずら以外のメールがこういう形式で来るとなると困ってしまいますね。