[PHP-users 24843] PEAR::Mailで添付ファイル付きメールが送れません。

古川敦史 agl @ violet.plala.or.jp
2005年 3月 13日 (日) 01:36:08 JST


古川@フリーランスSEです。
PEAR::MailとPEAR::Mail_Mimeで添付ファイルメールを送ろうとしているんですが、
メールがうまく送れません。

こちらの環境(Windows2000+Outlook Express,Outlook2000,電信8号)では、添付ファイルつきとなるのですが、
クライアント側の環境(WinXP-SP2+Outlook2002)では一つのテキストメールになっているようです。

何か理由がわかるでしょうか?
なお、こちらの環境は
Apache 1.3.33
PHP 4.3.10
です。

また、いかのクラスをつかってメールを送信しています。
agMail
class agMail {
  /**
  * @access private
  * @var agOptions オプション設定・取得用委譲クラス
  */
  var $_opt;  //
  
  /**
  * @access private
  * @var string[] Mailヘッダー
  */
  var $_header;
  
  /**
  * @access private
  * @var Mail メール送信ユニット
  */
  var $_mail;
  
  
  /**
  * コンストラクタ
  */
  function agMail($protocol = null, $param = null, $force_init = false)
  {
	$init_header = array(
	  "X-Mailer" => "agMailer Ver " . $this->version(),
	  "Mime-Version" => "1.0",
	  "Content-Type" => "text/plain; charset=iso-2022-jp",
	  "Content-Transfer-Encoding" => "7bit",
	);
	$init_opt = array(
	  "encode" => "JIS",
	  "header" => $init_header,
	);
	$this->_opt = & agOptions::init($init_opt, $force_init);
	$this->_header = &$this->getOption("header");
	
	// メール送信ユニット作成
	if ($protocol == null) {  $protocol = "mail";  }
	$this->_mail = Mail::factory($protocol, $param);
  }

  /**
  * agMailのバージョン取得
  *
  * @param void
  * @return string バージョンNo
  */
  function version()
  {
	return "1.00";
  }
  
  /**
  * オプション取得
  * 
  * 指定されたオプションに該当する値を取得する
  *
  * @param string オプション (null:全てのオプション)
  * @return string[] オプションリスト
  */
  function &setOption($name, $opt=null)
  {
	return $this->_opt->setOption($name, $opt);
  }
  
  /**
  * オプション取得
  * 
  * 指定されたオプションに該当する値を取得する
  *
  * @param string オプション (null:全てのオプション)
  * @return mixed オプションの値
  */
  function &getOption($opt=null)
  {
	return $this->_opt->getOption($opt);
  }
  

  /**
  * ヘッダ設定
  * メールのヘッダを設定する
  * @param string ヘッダーキー
  * @param string ヘッダーの値
  * @return boolean true:設定成功
  */
  function setHeader($key, $value)
  {
	if ($key != null) {
	  $this->_header[$key] = $value;
	}
	return true;
  }
  
  /**
  * ヘッダ設定
  * メールのヘッダを設定する
  * @param string ヘッダーキー
  * @param string ヘッダーの値
  * @return boolean true:設定成功
  */
  function unsetHeader($key)
  {
	if ($key != null) {
	  unset($this->_header[$key]);
	}
	return true;
  }

  /**
  * ヘッダ取得
  * 
  * 指定されたメールヘッダーを取得する
  * 
  * @param string ヘッダーキー (null:全てのヘッダ)
  * @return string ヘッダーの値
  */
  function getHeader($key = null)
  {
	$ret = null;
	if ($key == null) {
	  $ret = $this->_header;
	} else {
	  $ret = $this->_header[$key];
	}
	return $ret;
  }

  /**
  * 送信者一覧リストを作成する
  * 送信社名があるときはMimeエンコードしたかたちでメールアドレスに付加する
  *
  * @param string メールアドレス
  * @return string メールアドレスリスト
  */
  function fromList($addresses)
  {
	$list = null;
	if (!is_array($addresses)) {
	  $addresses = array($addresses);
	}
	$list = array();
	foreach ($addresses as $addr=>$name) {
	  if (is_int($addr)) {  // only address
		$addr = $name;
		$name = null;
	  } else {
		$addr = $this->mailEncode($name) . " <" . $addr . ">";
	  }
	  array_push($list, $addr);
	}
	$list = implode(", ", $list);
	return $list;
  }

  /**
  * メッセージをISO-2022-JPに変換する
  *
  * @param string 元のメッセージ
  * @param string エンコード変換後のメッセージ
  */
  function mailConvert($message)
  {
	return mb_convert_encoding($message, $this->getOption("encode"));
  }
  
  /**
  * Subjectなどように文字列をMimeエンコードする
  */
  function mailEncode($message)
  {
	return mb_encode_mimeheader($message, $this->getOption("encode"));
  }

  
  /**
  * メール送信
  *
  * @param string 送信先リスト
  * @param string 送信元
  * @param string メールSubject
  * @param string メールメッセージ
  * @return boolean true:メール送信成功/PEAR_Error:送信失敗
  */
  function send($to, $from, $subject, $message)
  {
	$message = $this->mailConvert($message);
	$this->setHeader("From", $this->fromList($from));
	$this->setHeader("Subject", $this->mailEncode($subject));
	return $this->_mail->send($to, $this->getHeader(), $message);
  }
}

class agMail_Mime extends agMail {
  /**
  * mime設定用
  * @var Mail_mime 添付ファイル付加用Unit
  */
  var $mime;

  /**
  * コンストラクタ
  */
  function agMail_Mime($protocol = null, $param = null, $force_init = false)
  {
	$this->agMail($protocol, $param, $force_init);
	$this->mime = new Mail_mime();
  }

  // 添付ファイル処理
  /**
  * 添付ファイル存在チェック
  *
  * @param void
  * @return boolean true:添付ファイルあり/false:添付ファイルなし
  */
  function isAttached()
  {
	$ret = false;
	if (!$ret && !empty($this->mime->_parts))  $ret = true;
	if (!$ret && !empty($this->mime->_htmlbody))  $ret = true;
	return $ret;
  }
  
  /**
  * 添付ファイル追加
  * 
  * 添付ファイルデータをバッファに追加する
  * @param string 添付ファイル名
  * @param mixed 添付ファイルデータ
  * @return boolean: true:追加成功/false:追加失敗
  */
  function addAttach($filename, $data)
  {
	$c_type = ag_mimeType($filename);
	$c_type .= '; name="' . $filename . '"';
	$ret = $this->mime->addAttachment($data, $c_type, $filename, false);
	return $ret;
  }
  
  /**
  * charset取得
  *
  * @param void
  * @return string charset
  */
  function textCharset()
  {
	$c_type = explode(";", $this->getHeader("Content-Type"));
	$charset = trim(preg_replace("/charset=/", "", $c_type[1]));
	return $charset;
  }
  
  /**
  * メッセージボディ取得
  * 
  * @param string メッセージボディ
  * @return string エンコード、ファイル添付後のBody
  */
  function getBody($message)
  {
	$message = $this->mailConvert($message);
	if ($this->isAttached()) {
	  $this->mime->setTxtBody($message);
	  $opt = array(
		"text_charset" => $this->textCharset(),
	  );
	  $message = $this->mime->get($opt);
	}
	return $message;
  }
  
  /**
  * メール送信
  * 
  * @param string 送信先リスト
  * @param string 送信元
  * @param string メールSubject
  * @param string メールメッセージ
  * @return boolean true:メール送信成功/PEAR_Error:送信失敗
  */
  function send($to, $from, $subject, $message)
  {
	$this->unsetHeader('Mime-Version');
	$this->mime->setSubject($this->mailEncode($subject));
	$this->mime->setFrom($this->fromList($from));
	$message = $this->getBody($message);
	$headers = $this->mime->headers($this->getHeader());
	return $this->_mail->send($to, $headers, $message);
  }
}

以上、よろしくお願いします。

-- /Private
PHPlibrary "aglib" http://aglib.sourceforge.jp で公開中
//Furukawa Atsushi / 古川 敦史
E-Mail: agl @ violet.plala.or.jp
MOBILE: 090-6959-6225
FAX: 020-4622-3018
HomePage: http://www.aglabo.com/agl/
	  http://www.furukawa-select.com/mt/



-- 
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.308 / Virus Database: 266.7.2 - Release Date: 2005/03/11



PHP-users メーリングリストの案内