▼ デコメール
ここでは、日本の携帯端末特有のデコメの送り方について説明します。
前提として、テキストメールとHTMLメールの送り方は、知っておいて下さい。
基本的な送り方
例を示します。$mail = & new Qdmail(); $body = '<html><body bgcolor="#aabbff"> <h1>HTMLメールテスト</h1> <b>太字</b> <font color="red">文字色を変えてみます。</font> <div>画像はこのように</div> <img src="cid:test2.jpg"> <div>文章中に置くことができます。</div> <p>Send by Qdmail</p> <div>携帯端末、キャリアによって使えるHTMLタグが違いますので注意してください。</div> <div><a href="mailto:address@example.com">メールはこちらへ</a></div> <div><a href="tel:00-0000-0000">電話はこちらへ</a></div> </body></html>'; $mail -> easyDeco( array('address@exaple.com' ,'宛先(日本語OK)' ), 'デコメのテスト' , $body, array( 'from@example.com' ,'配信元(日本語OK)'), 'test2.jpg' );PHP5の場合は、new の前の"&"は必要ありません。
test2.jpgという名前の、適当な画像ファイルを、貴方のほうで準備しておいてください。もちろん、ファイル名はアルファベットと数字であれば、なんでも構いません。(cid:との連携は必要)
インテリジェント・デコメ・システム
通信キャリア(ドコモ、au、ソフトバンクモバイル、イーモバイル)は、それぞれデコメの仕様が異なりますが、Qdmailは、その違いを吸収して、@以下のアドレスで、キャリアを判別し、それぞれに適した形にHTMLメールを加工して、メールを送ります。ただし、端末毎の違いをすべて検証すたわけではありません。場合によっては、表示が崩れることもあるかも知れません。
その際は情報をお寄せいただければ、幸いです。
技術的参考記事:CPA-LABテクニカル-デコメール携帯4社MIMEマルチパート比較
キャリアをごちゃまぜにして、一度に送る
ちょっと複雑にみえますが、テキストメールの送り方を理解していれば簡単です。test2.jpgとtest3.jpgという名前の画像ファイルを適当に用意してください。
$mail = & new Qdmail(); $to[] = array('××××××@docomo.ne.jp','ドコモ端末さん'); $to[] = array('××××××@ezweb.ne.jp','au端末さん'); $to[] = array('××××××@softbank.ne.jp','ソフトバンク端末さん'); $to[] = array('××××××@emnet.ne.jp','イーモバイル端末さん'); $body = '<html><body bgcolor="#aabbff"> <h1>HTMLメールテスト</h1> <b>太字</b> <font color="red">文字色を変えてみます。</font> <div>画像はこのように</div> <img src="cid:test2.jpg"> <div>文章中に置くことができます。</div> <p>Send by Qdmail</p> <img src="cid:test3.jpg"> <div>携帯端末、キャリアによって使えるHTMLタグが違いますので注意してください。</div> <div><a href="mailto:address@example.com">メールはこちらへ</a></div> <div><a href="tel:00-0000-0000">電話はこちらへ</a></div> </body></html>'; $attach = array('test2.jpg','test3.jpg'); $mail -> easyDeco( $to , 'デコメのテスト' , $body, array( 'from@example.com' , '配信元(日本語OK)'), $attach );コツtips
- 画像のリンクは、”cid:ファイル名”とし、ファイル名を同じにします。これはコンテンツIDといいますが、別途指定することもできます。デフォルトは、ファイル名です。
- easyDecoモードでは、複数の宛先を指定しても、それをQdmailがひとつづつに分解し、1通ごとにメールを送付します。(そうしないこともできます。)
- 使える画像の種類、容量はキャリアによって異なりますが、携帯端末にはごく小さなファイルしか送れないと理解しておいたほうがいいでしょう。詳細は各キャリアの仕様をみてください。
▼ htmlメール
■メールアドレスの指定の基本
メールアドレスだけの場合 | 'address@example.com' |
表示名もつける場合 | array( 'address@example.com' , '表示名' ) |
表示名をつけて、複数指定 | array(array( 'address@example.com' , '表示名' ),array( 'address@example.com' , '表示名' ).....) |
メールアドレスだけの複数指定 | array(array( 'address@example.com'),array( 'address@example.com')... |
■htmlメール
ここで説明するのは、画像をインターネットに置いておくタイプのHTMLメールです。HTML内に表示する画像もいっしょに送るタイプは、「インラインHTMLメール」といい、別項にて説明します。デコメは、インラインHTMLメールであり、日本の携帯端末向けのデコレーションメールは、別に説明します。
require_once('qdmail.php'); $mail = & new Qdmail();*1 $mail -> easyHtml( array8 'mailto@example.com' , '宛先(日本語OK)' ), 'タイトル(日本語OK)' , '本文(日本語OK)', array( 'from@example.com' , '配信元(日本語OK)' ) );Htmlの部分が変わった以外は、easyText と全く同じです。
添付ファイルやその他のヘッダーの設定の仕方も同じです。
もちろん、'本文(日本語OK)'の部分には、htmlで内容を書かなくてはなりません。
Qdmailでは、htmlメールを解析することができないメーラーや、ポリシーとしてhtmlメールを読まない方にも、内容だけは届くように、htmlメールから、代替テキストを自動的に生成して、メールに添えています。
このオプションは変更することもできます。
HTMLメールの例
ここでは、簡単なhtmlメールの内容の例を書いておきます。$body = '<html><body bgcolor="#aabbff"><h1>HTMLメールテスト</h1><b>太字</b><font color="red">文字色を変えてみます。</font><p>Send by Qdmail</p><div><a href="mailto:address@example.com">メールはこちらへ</a></div></body></html>'; $mail -> easyHtml( array('address@example.com' , '宛先(日本語OK)') , 'タイトル(日本語OK)' , $body, array('from@example.com' ,'配信元(日本語OK)') );このHTMLは古い書き方ですが、わかりやすいのであえて、古い方法で書きました。
*1 : PHP5では、"&"は必要ありません。
# 2009年11月27日(金) 午後0時48分
HTMLメールをSMTP送信で行いたいと思っています。
下記ソースでテキストメールを送れることは確認したのですが、
これをHTMLメールとして送信する場合、どこをどう変えたら
良いのか判りません。
======================================================================
<?php
require_once('./qdmail.php');
$strMailAddr = "xxxx@xxxx.co.jp";
$strMailBody = "<HTML><BODY> .... </BODY></HTML>";
mailsnd($strMailAddr, $strMailBody);
function mailsnd($mailaddr, $mailbody){
$mail = new Qdmail();
$mail -> smtp(true);
$param = array(
'host'=>'smtp.xxxx.co.jp',
'port'=> 587,
'from'=>'from_addr@xxxx.co.jp',
'protocol'=>'SMTP_AUTH',
'user'=>'username',
'pass' => 'password',
);
$mail -> smtpServer($param);
$mail -> to($mailaddr,'staff');
$mail -> subject('SUBJECT');
$mail -> from('from_addr@xxxx.co.jp');
$mail -> text($mailbody);
$return_flag = $mail ->send();
}
?>
======================================================================
# 2009年11月27日(金) 午後0時52分
上記コメント忘れました。
実行環境はWIndowsXP, PHP Ver5.2.10, Qdmail Ver 1.2.6b です。
- TB-URL http://hal456.net/qdmail/058/tb/
▼ easy型の使い方(ver1系)
バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。
easyモードの使い方(バージョン1系)
easyモードは、オブジェクト指向型でなるべく簡単に、様々なメールを送信できるよう工夫したライブラリです。特徴
全くオブジェクト指向型を抜きにしての指定はできませんが、オブジェクト指向独特の「->」演算子をなるべく使わずに、通常の関数のように使うのが特徴です。一方で、e-mailは設定項目が多いので、関数の引数の数は多くなり、場合によっては多次元配列を使わなくてはならない場合もあります。
目次
- easyText_ver1
簡単テキストメール - 文字化けなしのテキストメールの送付。添付ファイル日本語名も簡単。
- easyHtml_ver1
簡単HTMLメール - easyTextのHTMLメール版。自動代替テキスト生成機能付き。
- easyReplace_ver1 そのうちマニュアル化します。。。。
簡単テンプレート - 名前、メールアドレスの他、送付先に適合したメッセージやIDを送る機能
- easyDeco_ver1
簡単デコメール - 日本の携帯端末向けデコレーションメールの送付
- easyDecoRep
簡単デコメール+簡単テンプレート
- TB-URL http://hal456.net/qdmail/056/tb/
▼ テキストメール
■単純なテキストメール
推奨文字コード
Qdmailは、ソースコードや渡された文字コードを自動的に判別し、もっとも文字化けの少ない方法で送るように試みます。しかし、インターネットメールの環境は様々であり、自動判別は完璧なものではありません。
もっとも文字化けが出る可能性が低いのは、当方の開発環境と同じ以下の環境です。
スクリプトの文字コード:UTF-8で統一。デフォルトでは、Qdmailは、このUTF-8を日本語のメールに適したiso-2022-jpに変換して送ります。
スクリプトの改行コード:CRLF
もちろん、EUC-JP,SHIFT-JISでも、改行コードLFのみでも大丈夫なようには設計してあります。
■メールアドレスの指定の基本
メールアドレスだけの場合 | 'address@example.com' |
表示名もつける場合 | array( 'address@example.com' , '表示名' ) |
表示名をつけて、複数指定 | array(array( 'address@example.com' , '表示名' ),array( 'address@example.com' , '表示名' ).....) |
メールアドレスだけの複数指定 | array(array( 'address@example.com'),array( 'address@example.com')... |
一番簡単なメール
インクルードできるパスの通ったところに、qdmail.phpを配置してください。わからなければ、呼び出すファイルと同じディレクトリ(フォルダ)で構わないです。
require_once('qdmail.php');
$mail = & new Qdmail();
$mail -> easyText(
array( 'mailto@example.com' , '宛先(日本語OK)' ),
'タイトル(日本語OK)' ,
'本文(日本語OK)',
array('from@example.com' , '配信元(日本語OK)')
);
(PHP5の時は、new 前の "&" は必要ありません。)オブジェクト指向(OOP)的な書き方がわからない方は、-> や new の意味がわからないかも知れませんが、おまじないと思って、上記をコピー&ペーストしてみてください。
「$mail -> 関数名()」で、ひとつの関数と思って構いません。
なお、「$mail -> & new Qdmail();*1」は、最初に一回だけやっておけば、それ以降は必要ありません。
「$mail」は、自分の好きな変数名にして構いません。以後は、その「newした変数名->関数名」に置き換えて下さい。
添付ファイルを添付する
添付ファイルの置き場所:まずは、呼びだしもとのファイルと同じ場所において試してみて下さい。このファイルの置き場所は変更することもできます。$mail = & new Qdmail();();*1 $mail -> easyText( array( 'mailto@example.com' , '宛先(日本語OK)' ), 'タイトル(日本語OK)' , '本文(日本語OK)', array( 'from@example.com' , '配信元(日本語OK)' ), array( 'test.jpg', '添付された時のファイル名(日本語OK).jpg') );なお、添付ファイルの置き場所は、呼びだしもとファイルからの相対パスでも、絶対パスでも指定できます。
例えば、
相対パス「./images/test.jpg」「images/test.jpg」
絶対パス「/home/hogehoge/images/test.jpg」「c:\htdocs\hogehoge\test.jpg」
最初の文字が「/」「¥」「\」の場合は、絶対パスとして解釈しますので注意してください。
複数のファイルを添付する。
これ以降は、$mail = & new Qdmail(); は省略します。$param[] = array( 'test.jpg' , '添付ファイル名(日本語OK省略も可能).jpg' ); $param[] = array( 'test2.jpg' , '添付ファイル名2(日本語OK省略も可能).jpg' ); $mail -> easyText( array( 'mailto@example.com' , '宛先(日本語OK)' ), 'タイトル(日本語OK)' , '本文(日本語OK)', array( 'from@example.com' , '配信元(日本語OK)' ), $param );
複数の宛先に送付する
この例では、2人に送っていますが、何人でも追加できます。toヘッダに複数指定した場合は、その指定された人全員が、全員のメールアドレスを知ることになりますので注意しましょう。
それがまずい場合(ネットサービスでは、ほとんどがそうですよね)は、後で述べるBCCを使いましょう。
複数の宛先に送付する
複数の宛先に送付する (表示名も指定)
$to[] = array('mailto1@example.com' , '表示名1(日本語OK)' ); $to[] = array('mailto2@example.com' , '表示名2(日本語OK)' ); $mail -> easyText( $to , 'タイトル(日本語OK)' , '本文(日本語OK)', array('from@example.com' , '配信元(日本語OK)' ) );必ず、メールアドレスのキーがゼロ、表示名のキーが1になるようにします。
cc や bcc も追加する。
$address['to'][] = array('mailto1@example.com' , '表示名1(日本語OK)' ); $address['to'][] = array('mailto2@example.com' , '表示名2(日本語OK)' ); $other_heder['cc'][] = array('mailto3@example.com' , '表示名3(日本語OK)' ); $other_heder['cc'][] = array('mailto4@example.com' , '表示名4(日本語OK)' ); $other_heder['bcc'][] = array('mailto5@example.com' , '表示名5(日本語OK)' ); $other_heder['bcc'][] = array('mailto6@example.com' , '表示名6(日本語OK)' ); $other_heder['from'][] = array('from@example.com' , '配信元(日本語OK)' ); $mail -> easyText( $address , 'タイトル(日本語OK)' , '本文(日本語OK)', $other_header );toやccは大文字でも小文字でも問題ありません。
ccやbccは省略可能ですが、toには最低1つの宛先が必要になりますので、注意して下さい。
Fromを指定していた引数の部分が、other_headerに置き換わります。その代わりに、$other_headerの中に、fromを指定しておきます。Fromヘッダーは必須ヘッダーです。
reply-toを設定する
WEBサービスでは、Fromは配信専用にして、reply-toを設定したい場合もあるでしょう。$var['from'] = array('mailto2@example.com' , '表示名2(日本語OK)'); $var['reply-to'] = array('mailto3@example.com' , '表示名3(日本語OK)'); $mail -> easyText( 'address1@example.com' , 'タイトル(日本語OK)' , '本文(日本語OK)', $var );
*1 : PHP5の時は、new 前の "&" は必要ありません。
# 2013年01月21日(月) 午前11時37分
すみません。
ここのサンプルコード「cc や bcc も追加する。」のアドレスなどを変更しても
Notice: Undefined variable: other_header in /var/www/htdocs/index.php on line 22 Notice: Undefined offset: 0 in /var/www/htdocs/qdmail.1.2.6b/qdmail.php on line 1933 Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.3.3
Qdmail error: OS Linux ; PHP Version 5.3.3 ; Qdmail version 1.2.6b
php.ini status: mb_language = Japanese ; mb_internal_encoding = UTF-8 ; mb_detect_order = ASCII,JIS,UTF-8,EUC-JP,SJIS
Qdmail Status debug: 0, log: 0, errorlog: 0
Qdmail error: Tyr Varidate Error by regex preg_match('/[^@]+@[^@]+/') the address is -> line -> 3699
Qdmail error: Illegal Mail AddressSystemValidete Address Method line -> 2770
Qdmail error: Must Header is not exist 'TO' line -> 2232
Qdmail error: Must Header is not exist 'FROM' line -> 2232
Qdmail error: No recipient line -> 2849
Qdmail error: Error happen, see upper line -> 2194
Qdmail error: Send Error line -> 2115
のようになってしまいます。
変数初期化など試してみたのですが何故かわかりません。
何かわかりますでしょうか?
「複数の宛先に送付する (表示名も指定)」は正常に動作しているようです。gmailには届いているので。。。
- TB-URL http://hal456.net/qdmail/057/tb/
-
▼
easy型の使い方(ver1系)
Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte バージョン0系と1系では、easyモードの使い方が異なります。バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。easyモードの使い方(バージョン1系)easyモードは、オブジェクト指向型でなるべく簡単に、様々なメールを送信...
▼ Optionの指定方法
通常のテキストメールを送るだけであれば、次のように、第1引数には'text'を指定するだけでした。
qd_send_mail( 'text' , $to , $subject , $body , $from );ここを配列にして、キー(添え字)を、'option' とし、さらにその option を配列で指定します。
例えば、本文文字コードセットをデフォルトのiso-2022-jpではなく、utf-8にして、さらに本文エンコードを base64 にすることを考えてみましょう。
$to,$subject,$body,$fromの設定は省略。それはqd_send_mailでのテキストメールの送り方をみてください。
$op = array( 'charset'=>array('utf-8','base64')); // 文字コード設定 $option = array( 'type'=>'text' , 'option'=>$op); // テキストタイプ設定、オプションセット qd_send_mail( $option , $to ,$subject , $body , $from );このような指定をすることで、Qdmailの内部的には、
$op = array( 'charset'=>array('utf-8','base64'));
のオプションが解釈され、内部的に以下のようなコードが走ります。$mailには、Qdmailインスタンスが入っています。
$mail -> charset( array('utf-8','base64') )これは、sendモード、OOPでの文字コードセットの変更の指定方法と全く同じです。
つまり、qd_send_mailでは、option に、配列として
array( 'メソッド名' => 'パラメータ' )を指定することで、すべてのオプションを指定することができるのです。
第1引数を配列で指定するときには、配列地獄形式で表すと以下のようになります。
array( 'type'=>'text' , //メールタイプは必須。 'option'=> array( 'メソッド名1'=>'パラメータ1', 'メソッド名2'=>'パラメータ2', 'メソッド名3'=>'パラメータ3', ・・・・・・・・・ ), );
- TB-URL http://hal456.net/qdmail/055/tb/
▼ 簡単な差し込み例
require_once('qdmail.php'); $to = array('test@example.com','日本語表示名'); $subject="こんにちは、%name%さん。"; $body="%name%さんの登録内容をお送りします。 名前:%name% メールアドレス:%mail% このように、qd_send_mailでは、簡単にインサートメールを送信することができます。"; $from = array( 'from@example.com' , '送り元日本語名' ); $option = array('type'=>'text','option'=>array('simpleReplace'=>true)); $flag =qd_send_mail( $option , $data , $subject , $body , $from );
# 2008年09月24日(水) 午後6時38分
%name%が日本語(utf-8)のときメール本文の該当箇所が文字化けしてしまうのですが、どこかで変換を行っていますでしょうか。
# 2008年09月25日(木) 午前7時10分
ワワワさん
>%name%が日本語(utf-8)のとき
というのは、%名前%などと、%の中を日本語にしているという意味でしょうか?
それとも、addressの名前が日本語ということでしょうか。
どちらであっても、基本的には文字化けしないように作っているのですが、どこかでバグがあるかも知れません。
以下の情報をお寄せ下さいませ。
■Qdmailバージョン
■QdSmtpバージョン
■PHPのバージョン
■OS名称 & バージョン
■MTAの種類(sendmailかPostfixかqmailか)
■お使いのソースコード(公開されて支障がある部分は適当に変更してください。)
■ソースコードの文字コード、改行コード
そして、http://hal456.net/qdmail/debug
を参考にデバッグモードで出力された内容を、「非公開コメント」にチェックの上、お教え下さい。
# 2008年10月01日(水) 午前11時46分
iso-2022jpで送りたいのですが、必ず「Content-Type: text/plain; charset="utf-8"」になります。文字化けの原因もここだと思うのですが、何か明示的に設定する必要があるのでしょうか。PHPコードはutf-8、メールテンプレートもutf-8で書いています。mb関数は日本語に定義しています。
# 2008年10月01日(水) 午前11時51分
ワワワさん
以下の情報をお寄せ下さいませ。
■Qdmailバージョン
■QdSmtpバージョン
■PHPのバージョン
■OS名称 & バージョン
■MTAの種類(sendmailかPostfixかqmailか)
■お使いのソースコード(公開されて支障がある部分は適当に変更してください。)
■ソースコードの文字コード、改行コード
# 2008年10月01日(水) 午後3時28分
ワワワさん
こちらでも再現しました。ご指摘ありがとうございました。バグです。
1.1.6bにアップグレードすれば治ると思います。
現行バージョンでしのぐのであれば、
cakeText( $content , $template , $layout , null , 'iso-2022-jp' );
と指定してみてください。
# 2009年03月14日(土) 深夜1時30分
できれば%記号も変更可能にできませんでしょうか?
- TB-URL http://hal456.net/qdmail/053/tb/
▼ 置き換え記号を変更する
Qdmailでは、フィールド名の前にプリフィックス(prefix)を指定することができます。
オプションrepPrefix('pre')
$op = array('simpleReplace'=>true,'repPrefix'=>'pre'); $option = array('type'=>'text','option'=>$op );
- TB-URL http://hal456.net/qdmail/054/tb/
▼ データベースから一気に差し込み
■データベース連動
データベースから、データをフェッチ(Fetch)した場合、多くの場合、次のようなデータ構造になっているはずです。(もちろん、フィールド名やデータは例です。)
$data = array( array('name'=>'スポック','id'=>1,'mail'=>'spok@example.com', 'age'=>'24','address1'=>'東京都品川区','address2'=>'三田0-0-0', 'tel'=>'03-0000-0000',), array('name'=>'カーク','id'=>2,'mail'=>'kirk@example.com', 'age'=>'20','address1'=>'大阪府大阪市','address2'=>'難波0-0-0', 'tel'=>'06-0000-0000',), array('name'=>'ウフーラ','id'=>3,'mail'=>'urhoora@example.com', 'age'=>'22','address1'=>'愛知県名古屋市','address2'=>'中央区近衛0-0-0', 'tel'=>'045-0000-0000',), array('name'=>'マッコイ','id'=>4,'mail'=>'maccoy@example.com', 'age'=>'50','address1'=>'鹿児島県鹿児島市','address2'=>'中区聖0-0-0', 'tel'=>'092-0000-0000',), );このデータを一気に、Qdmailに差し込むことで、上記のデータの場合、4人にそれぞれ個人別にカスタマイズしたメールを一度に送信することができます。
通常、$to として、宛先を指定する引数に、$dataをします。
そして、件名や本文で、置き換えたい項目を%記号で囲みます。
サンプルをみるのが早いでしょう。上記の$dataが入っているものとします。
上記の$dataのメールアドレス部分を自分が管理している別のメールアドレスに入れて試してください。
require_once('qdmail.php'); $subject="こんにちは、%name%さん。"; $body="%name%さんの登録内容をお送りします。 名前:%name% id: %id% メールアドレス:%mail% 年齢:%age% 住所:%address1% %address2% TEL: %tel% 専用URL:http://example.com/login/?id=%id% このように、qd_send_mailでは、簡単にインサートメールを送信することができます。"; $from = array( 'from@example.com' , '送り元日本語名' ); $option = array('type'=>'text','option'=>array('simpleReplace'=>true)); $flag = qd_send_mail( $option , $data , $subject , $body , $from );この
$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
の部分が、SimpleReplace機能をONにする箇所です。フィールド名と連動
%でデータベースのフィールド名を囲めば(%フィールド名%)、自動的にリプレースされるわけですが、どのフィールドのデータをメール宛先の送信者表示名にするか、どれが送信先のメールアドレスなのかを指定する必要があります。デフォルトでは、次のようになっています。
フィールド名 | 意味 |
送信先メールアドレス | |
name | 送信先表示名 |
その時、SimpleReplaceは、正常に動作しますが、Qdmailは肝心の送信先アドレスを見失ってしまいます。
ですので、mail,nameではなない場合は、次の指定を加えてください。
$op = array( 'simpleReplace'=>true, 'addressField'=>array('mail_address','pen_name') ); $option = array('type'=>'text','option'=>$op);
# 2008年09月11日(木) 深夜0時44分
メールを一通しか送らないのですが、メール内で変数との置き換えをしたいのです。
この通りやっていますが、うまく動作しないですね…
dmail error: Illegal Mail Address "" line -> 2539
Qdmail error: Error happen, see upper line -> 1957
Qdmail error: Error 'TO' Separate mode in Sendbase function , the Address is -> hoge@example.com line -> 1879
Qdmail error: Send Error line -> 1898
PHP4.3.11
Qdmail ver 1.1.0b
$mail -> send() 型では、どうやるのでしょうか?
$mail -> text($body);
$mail -> toSeparate(true);
でも同じエラーになります。
$mail->to($data); でエラー。
$mail->to('hoge@example.com'); はOK.
$data = array(
array(
'name' => 'メールテスト',
'mail' => 'hoge@example.com',
)
);
この内容で、上記エラーを吐きます。何が問題でしょうか?
# 2008年09月14日(日) 午後4時21分
ほげおさん
このエラーは、メールアドレスがうまく受け渡しされていないために起きるエラーです。
こちらでは、再現しませんので、できましたら、うまくいかない場合の該当部分のソースコードをお教えいただければ幸いです。
# 2008年09月14日(日) 深夜0時26分
内容は変わっていますが、以下のような感じです。
$from = array( ML_FROM , 'MLメール');
$subject = 'メール';
$data = array(
array(
'name' => 'メール',
'mail' => $to,
'title' => $title,
'url' => $url,
)
);
$body = "%title%
なんとかかんとか
%url%
";
//NG
//$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
//$result = qd_send_mail( $option , $data , $subject , $body , $from );
$mail =& new Qdmail();
//$mail->to($options['to']); // OK
$mail->to($data); // NG
$mail->subject($subject);
$mail->text($body);
$mail->from($from);
$mail->toSeparate(true);
$mail->send();
# 2008年09月15日(月) 午前11時34分
ほげおさん
こちらで、$to,$title,$url,ML_FROM を適当に補完して送信したところ、特に異常なく送信できました。
--補完したコード--
$to = 'address@example.com';//実際は実在アドレスにしています。
$title ='test';
$url = 'http://exmaple.com';
$from = array( 'from@example.com' , 'MLメール');
--以上--
おそらく、ML_FROM が正しく定義されていないように思います(想像)。
php.iniのエラー表示に関して
error_reporting = E_ALL
とした上で、実行してみてください。または、ML_FROM が正しく定義されているかどうかご確認ください。
その上で、まだ正常送信できない場合、ML_FROM を 'from@example.com'などと、メールアドレスの形式で直接的に指定してみてください。
また、OOP方式の今回のようなことをやる場合は
$mail ->simpleReplace(true);
が必要ですので、お試し下さい。
その上で、まだ正常送信できない場合は、お手数ですが、今一度ご連絡ください。
# 2008年09月15日(月) 午前11時47分
あ、ひょっとしたら、原因は $to の指定のほうかも知れませんので、$toの内容もご確認ください。
なお、見る限り、ソースコードがちょっと足りないように思います。特に
//$mail->to($options['to']); // OK
について、$option の定義はありますが、$options の定義がありません。
次回ご連絡いただくときは、コードのコピペの方が原因を特定しやすいので、できましたら、コピペでお願いします。もちろん、支障あるメールアドレスは、例えば ***@example.com などと変えて下さい。または、非公開コメントにチェックをしていただくと、私以外にはみえませんので、メルアドがそのままでも、大丈夫です(絶対的な保証はできませんが)。
# 2008年09月16日(火) 午後6時03分
どうやら途中で、$dataに配列を追加しようとして、$data[]['added_data'] = $added_data;ってやったところ、$data の内容がなくなったためのようです。
初歩的なミスで申し訳ありません。
現在は、ちゃんとメールできているようです。
ちなみに、以前はSmartyのテンプレートファイルにメール内容を書いて送るということをしていました。そこでちょっと質問ですが
・ファイルから読み込むテンプレート機能(デコメの場合はあるようですが)
・ファイル内でのif文などの制御文を使う機能
というのは現状できないですよね?
・$body の中身をforeachで回したり、ifで回したりしたい。
・改行を入れると、改行前のスペースがそのままメールに。ソースの方でスペースをなくすと、ソースがぐちゃぐちゃに。
という点が少し気にはなっているので。
もし対処方法などあれば。
# 2008年09月16日(火) 午後11時17分
ほげおさん
メールが送れるようになってよかったです。
私の理解不足で申し訳ありませんが、以下の事は、何をしようとしているのか、ちょっとわからないので、とんちんかんなお応えかもしれませんが、回答しておきます。
>・ファイルから読み込むテンプレート機能(デコメの場合はあるようですが)
ファイルに%name%などと書いて、それをfile_get_contents( 'filename.txt' ); し、それをsimpleReplaceで置換する、
とか
ob_start http://php.morva.net/manual/ja/function.ob-start.php
などで、いったん画面バッファリングし、それを $mail -> text( $buffer ); とするのでは不十分でしょうか。
>・ファイル内でのif文などの制御文を使う機能
>・$body の中身をforeachで回したり、ifで回したりしたい。
eval http://jp.php.net/manual/ja/function.eval.php
を使用するのでは不足でしょうか。
smartyは使ったことありませんが、
fetch http://sunset.freespace.jp/smarty/SmartyManual_2-6-7J_html/api.fetch.html
などは、画面出力を変数に取り込めるようですので、これでは不足でしょうか。
>・改行を入れると、改行前のスペースがそのままメールに。ソースの方でスペースをなくすと、ソースがぐちゃぐちゃに。
すいませんが、どのような現象を示しているのかわかりませんので、実例で説明していただければ幸いです。
# 2008年10月01日(水) 午前10時44分
データベースから一気に差し込む場合、BCCやCCの設定はどうすればいいのでしょうか?
「mail」の箇所をCC・BCC用のメールアドレスにすれば送信出来ますが、TO形式で送信されます。
送信方法はqd_send_mail方式で、バージョンは1.1.5bを利用しています。
# 2008年10月01日(水) 午前11時41分
ktさん
確認ですが、「どのtoの宛先でも同じcc,bcc」をご希望ですか?
それとも「それぞれのtoの宛先に合わせて、それぞれ異なるcc,bcc」をご希望ですか?
# 2008年10月01日(水) 午前11時49分
つまり、ccやbccもデータベースから突っ込みたいのか、それとも、常に管理者にbccするような機能がいいのか、ということです。現行バージョンで、できることできないことがあり、ちょっとした改造で、できること、できないことがあります。
# 2008年10月01日(水) 午後0時05分
「どのtoの宛先でも同じcc,bcc」です。
用途として「管理者にコピーメールを送信」みたいな事に使いたいと思いまして。
bccは常に管理者に連絡する方法でいけるかと思いますが、
ccは転送先のメールアドレスがメールソフトで表示されて欲しいので、
cc送信も出来ればと表います。
# 2008年10月01日(水) 午後2時19分
ktさん
現行バージョンでは、simpleReplace時に、できるのは、常にあるアドレスにBccだけです。
CCについては、現行バージョンでは対応していません。ただ需要があることがわかりましたので、次回更新時には、ちょっと考えてみます。
常にbccは以下を参考にしてください。
通常のbcc,ccメソッドは、simpleReplace時にはセキュリティ上、効かなくなるようになっていますが、allwaysBccメソッドは使用可能です。
$option = array('type'=>'text',
'option'=>array(
'simpleReplace'=>true,
'allwaysBcc'=>'admin@example.com'
)
);
ただし、試してみるとわかりますが、simpleReplaceを使って、allwasyBccすると、差し込んだすべてのパターンのメールをbccで受けますので、多くの通数の差し込みメールを一気に送ると、かなりの数のメールを受け取ることになることにご留意ください。
# 2008年10月01日(水) 午後9時50分
ktさん
1.1.7b 以降にて修正しました。
allwaysBcc の代わりに、cc,bccとしていただければ、大丈夫だと思います。
$option = array('type'=>'text',
'option'=>array(
'simpleReplace'=>true,
'bcc'=>'admin@example.com',
'cc'=>array('admin@example.com','日本語CC')
)
);
# 2008年10月01日(水) 午後9時50分
ps 今まで通り、allwaysBccも使用可能です。
# 2008年10月03日(金) 午後6時11分
動作テストさせていただきました。問題なく送信できました。
要望を実現していただき、ありがとうございます。
ただ、細かい事ですが、bccとcc両方入力していないと、エラーになります。
私はシステムと連動している為、以下のように記述しています。
'bcc'=>$bcc_mail,
'cc'=>array($cc_mail,$cc_name)
これらはメール送信前に入力値を確認して振り分ければいい事ですが、
もし出来たら「bccかccの入力値が無くても送信できる」という形であれば
より使い勝手が良くなると思いました。
# 2008年10月04日(土) 午後4時24分
ktさん
1.1.8b以降にバージョンアップした上で、下記をお試し下さい。
デフォルトでは、空文字やnullがアドレスに入力されると、不正なメールアドレスとして認識するようになっています。
それをユーザーの設定で変更する方法はいくつかありますが、推奨するのは、アドレスバリデーション(判定)の変更です。
http://hal456.net/qdmail/validation
のサンプル2を参考にしてください。
$option = array('type'=>'text',
'option'=>array(
'varidateAddressRegex'=>'/([^@]+@[^@]+)|(^$)/',
'simpleReplace'=>true,
)
);
ということです。これにccなり、bccを付け加えてみて下さい。
ただし、この方式はメールアドレス全般にかかる判定の変更ですので、toやfromに空文字、nullが入力された場合には、別のエラーがでることになります。お気を付け下さい。
# 2008年10月07日(火) 午後4時19分
返信が遅れましたが、、確認させていただきました。
希望通りの処理になりました。
また何かありましたら、よろしくお願いします。
# 2009年10月08日(木) 午後4時58分
メール送信するプログラムを組む時、Qdmailを使わせていただいております。
便利なライブラリ、有難うございます。
addressFieldメソッドに関してなのですが、OOPで利用する際、fromやtoの指定を行う前に指定しなければならない、
というルールに気がつくのに小一時間かかってしまいました。
もしよろしければマニュアルページに、記載していただけると幸いです。
# 2010年09月20日(月) 午後5時05分
はじめまして。
qdmail&qdsmtpを利用し、テンプレートファイルを読み込んで
差し込み送信を実装しようと考えているのですが、
下記のようなやり方で差し込み送信しようとした場合、
どのようなコーディングにすればよいかあれこれ悩んでしまっております。
初歩的なところでつまづいてしまい、申し訳ないのですが
アドバイスいただけないでしょうか。
/*メール送信ここから*/
$mail = & new Qdmail();
$mail -> smtp(true);
$param = array(
'host'=>'メールサーバー(外部サーバ)',
'port'=> 25 , //SendMail Port
'from'=>'abc@sample.com',
'protocol'=>'SMTP'
);
$mail -> smtpServer($param);
$message = @file_get_contents('../sample.txt');
$mail ->to('toアドレス(DBなどから取得)','●●様');
$mail ->subject('連絡ありがとうございました');
$mail ->from('abc@sample.com');
$mail ->text($message);
$replace_data = array(
array(
'xxxxx'=>'こんにちは',
)
);
$return_flag = $mail ->send();
/*メール送信ここまで*/
sample.txtの中身
-----------------------------------
ここにメール本文を書きます。
%xxxxx% ←差し込みたいところ
-----------------------------------
※ちなみに、上記の状態ではtoアドレス宛に
メール自体は送信されます。
差し込み部はそのままですが…
$dataの部分をどのように渡したらよいか、また
$option = array('type'=>'text','option'=>array('simpleReplace'=>true));
をそのまま書いておくだけでよいのか、
などがよくわかっていません…
あと、差し込みに必要なのはxxxxxだけでいいのですが
その場合でもmailやnameは必要になるのでしょうか?
- TB-URL http://hal456.net/qdmail/052/tb/
▼ テンプレート機能
■SimpleReplace
Qdmailでは、SimpleReplaceという機能があります。これは、件名や本文に「%name%」という置き換え記号を置いておくと、自動的に、送信先名の名前に置き換わるというものです。
この機能を利用すると、データベースから取ってきたデータを、送る相手によってカスタマイズしながら送信することができます。
■例えばQdmaiでは、以下のようなメールの一斉送信が簡単にできます。
こんにちは●●さん。シンプルリプレースのテストです。 きょうは、お得なお知らせです。 ●●さんは、前回、▲▲を■■■にお求めになりましたが、今回は、さらにパワーアップした商品のご紹介です。 配信解除はこちら http://example.com/store_mail/cancel?id=●●●&hash=××××
記事リスト
- 簡単な差し込み例 (2008-08-02)
- データベースから一気に差し込み (2008-08-02)
- 置き換え記号を変更する (2008-08-02)
- TB-URL http://hal456.net/qdmail/051/tb/
-
▼
個別アドレス分離機能(一斉送信時)
Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte 個別アドレス分離機能(一斉送信時)to,cc,bccに複数のアドレスを設定し、一斉配信をしても、To(宛先)1件ごとに分離し、改めてtoヘッダには、1件だけのメールアドレスを設定して送信する機能です。例$mail = & new Qdmail() ; *1...
▼ 関数型でSMTP送信
■SMTP送信のメリット
qd_send_mailの一番の特徴は、関数型なのに、SMTP送信できる点です。SMTP送信を選択すると、phpのmail関数は使いません。
外部SMTPサーバーを指定しておけば、開発環境と運用環境が異なる時にも、コード変更なしで対応できるほか、そもそもメール送信サーバーがない環境でメールを送信することができます。
- 可搬性がよい
- スピードが速い
- mail関数、送信サーバーのクセを排除できる(より安全なコードを書くことができる)
■サンプルコード
テキストメール&添付ファイルの場合
OP25制限があるプロバイダに、SMTP認証(Plain)で繋ぐ例です。通常の送信ポート25でも大丈夫ですし、POP Before SMTPもできます。
SMTPパラメーターの詳しい設定の仕方はQdsmtpの初期設定をご覧下さい。
qdmail.php と Qdsmtp.php をインクルードパスが通ったディレクトリに置いてください。QdmailはQdsmtpを自動的にインクルードしますが、この自動インクルードがうまくいかない場合は、ユーザーにて明示的にインクルードしてください。
require_once('qdmail.php'); $param = array( 'host'=>'smtp.example.com', 'port'=> 587 , 'from'=>'return_path_address@example.com', 'protocol'=>'SMTP_AUTH', 'user'=>'userID_for_SMTP_server', 'pass' => 'password', ); $to = array( 'address@mail456.com' , '宛先日本語名' ); $from = array( 'from@example.com' , '送り元日本語名' ); $subject = 'メールのテスト(テキスト)'; $body = "ここに本文を書きます。"; $attach = array( 'test.jpg' , '添付ファイル名.jpg' ); $option = array('type'=>'text','smtp'=>$param); $flag =qd_send_mail( $option , $to , $subject , $body , $from , $attach , $debug);$optionのキー'type'で、メールの種類を指定します。
HTMLメールを送信する場合は次のようにします。
$option = array('type'=>'html','smtp'=>$param);
デコメール(デコレーションメール)を送信する場合は次のようにします。
$option = array('type'=>'deco','smtp'=>$param);
その他の指定は、関数型の基本をご参照ください。
- TB-URL http://hal456.net/qdmail/050/tb/
▼ HTMLメール
■qd_send_mailでHTMLメール
基本的には、qd_send_mailでのテキストメールの送信方法と同じです。'text'という指定を'html'と変更するだけです。
ここでは、サンプルコードのみを記します。
■サンプルコード
添付ファイルを送る場合
$to = array( 'address@example.com' , '宛先日本語名' ); $from = array( 'from@example.com' , '送り元日本語名' ); $subject = 'HTMLメールのテスト(テキスト)'; $body = '<html><body bgcolor="#eeeeff"><p>ここに本文を書きます。 </p><span style="color:red;font-weight:bold;"> さまざまな装飾をすることが可能です。 </span></body></html>'; $attach = array( 'test.jpg' , '添付フィル.jpg'); qd_send_mail( 'html' , $to , $subject , $body , $from , $attach);
# 2008年10月16日(木) 午後3時15分
html 内での改行が <br> のみで、実際の \n が入っていない場合、1024 文字程度のところで文字化けが生じるようです。(メモ帳の横幅いっぱいのところ…多分 1024 だと思うけど違うかも)
自作プログラム中で、plain text の \n を <br> に変換して流し込んだら問題が出たため、<br>\n に変換するようにして回避しました。
回避可能なので大きな問題ではありませんが、とりあえず報告のみ行っておきます。
PHP 5.2.6
qdmail 1.2.0b
# 2008年10月18日(土) 午後1時26分
Qdmail1系では、強制改行は行っていません。
お使いのSMTPサーバーが強制的に改行を行っているものと思います。
(参考)http://www.deftrash.com/blog/archives/2005/11/sendmail.html
http://www.big.or.jp/~talk/t-club/soft/wwwboard/messages/504.html
- TB-URL http://hal456.net/qdmail/046/tb/
# 検証して 2010年03月11日(木) 午後9時34分
$attach = array('test2.jpg','test3.jpg');
$mail -> easyDeco(
$to ,
'デコメのテスト' ,
$body,
array( 'from@example.com' , '配信元(日本語OK)'),
$attach
);
だと送信できませんでした。ちなみにインライン添付は画像2枚です。
以下のようにすると、OKでした。
$attach[] = array( $file1 , 'mail.gif' );
$attach[] = array( $file2 , 'phone.gif' );
$mail2 -> easyDeco(
$to,
'デコメのテスト' ,
$body,
array( 'from@example.com' ,'配信元(日本語OK)'),
$attach
);
# meda 2012年06月13日(水) 午後5時47分
Qdmailのバグではないと思いますが、デコメが上手く行かない場合があります。
.(ドット)が消える現象が起きます。
HTMLパートで下記のような改行パターンになるとドットが消えて、URLにアクセスできません。
---------
<a href=3D"http://test.domain=
.com/contents/1234/
----------
パソコン、ドコモ、auで試しましたが、どれもダメでした。
※URLが「http://test.domaincom/contents/1234/」とドットが消えます。
メール受取側の問題のようですが、何か対策はないでしょうか・・・
# meda 2012年06月13日(水) 午後6時26分
受取側の問題かと思いましたが、OutlookExpressでHTMLメールを作成し、同じ状況でメールを送ってもURLに問題が出ませんでした。
Qdmail側のバグっぽいです。
ただ、なぜそのバグが出ているのかが分かりません。。
# meda 2012年06月20日(水) 午前11時53分
↑のコメントを書いたものです。
どうやらQdsmtpのバグっぽいです。
Qdsmtpを使わなければこの現象は起きませんでした。
# irozak 2013年12月12日(木) 午後7時57分
qdsmtpの「smtpEscape()」関数に次のように1行足すことで解決出来るかと思いますよ。
-------------------------
function smtpEscape( $mes ){
$mes = preg_replace( '/\r?\n\.\r?\n/is' , $this->smtpLFC . '..' . $this->smtpLFC , $mes );
$mes = preg_replace( '/^\./m' , '..' , $mes );
if( 0 !== preg_match( '/\r?\n[^\r\n]{'.$this->smtp_limit.',}\r?\n/is' , $mes ) ){
return $this->errorGather('SMTP Overfllow '.$this->smtp_limit.' chars in one line.',__LINE__);
}
return $mes;
}
-------------------------
SMTPのDATAで改行する時は、行頭に「.」ドットが来るときにエスケープしなければなりません。