[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 メーリングリストの案内