ようこそゲストさん

Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

メッセージ欄

2008年7月の日記

デコメール

qd_send_mailでデコメール(デコレーションメール)

qd_send_mailは日本の携帯端末に向けてデコレーションメール(デコメ)を送信することができます。
デコメは、特殊なHTMLメール形式なので、基本的な送信方法はHTMLメールと同じですが、HTMLの中身に注意が必要です。

デコメは、キャリアによってマルチパート構成が異なりますが、Qdmailは送り先によって自動的に本文構成を変更するため、ユーザーはどこのキャリアに送信するのかを意識しなくても大丈夫です。

サンプルコード


$body = '<html><body bgcolor="#aabbff">
<h1>HTMLメールテスト</h1>
<b>太字</b>
<font color="red">文字色を変えてみます。</font>
<div>画像はこのように</div>
<img src="cid:test1.jpg">
<div>文章中に置くことができます。</div>
<img src="cid:test2.jpg">
<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>';


qd_send_mail(
      'deco',
      array('address@exaple.com' , '宛先(日本語OK)' ) ,
      'デコメのテスト' ,
      $body,
      array ( 'from@example.com' , '配信元(日本語OK)'),
      array(array('test1.jpg'),array(test2.jpg))
 );

# spok 『(非公開コメントだったので公開コメントに移し替えました) # fujiyou 2008年11月27日(木) 午前9時27分 ...』 (2008/11/28 6:58)

# spok 『OOPモードを使って、htmlとtextを別々に設定すれば、可能です。 または qd_send_mailであれば、$option...』 (2008/11/28 7:05)

# fujiyou 『ありがとうございます。 試してみたいと思います。』 (2008/11/28 24:37)

  • デコメールまとめ Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    Qdmailのデコメールに関する情報をまとめました。■Qdmailの特徴(デコメ関連) Dcomo,au,Softbank,イーモバイル,Willcomの各キャリアを自動判別して最適なデコメを送信 qd_send_mail()という関数型で簡単送信 プロに...

textメール

qd_send_mailでテキストメール

オブジェクト指向がわからない方でも、mb_send_mailライクに日本語を送信できます。また、オブジェクト指向がわかっている方でも、より簡単にコードを書くことができます。
関数型であるのに、オプションでSMTP送信ができるのも、qd_send_mailの特徴です。

基本形

qd_send_mail( 'text', 宛先, 件名, 本文, From情報(&追加ヘッダー), 添付ファイル指定 );

サンプルコード

単純なテキストメール

標準型
メールアドレス関係で名前表示をする場合は、配列で指定します。
原則として、配列添え字0がメールアドレス、配列添え字1が表示名となります。
(これは変更することもできます。)

$to = array( 'address@example.com' , '宛先日本語名' );
$from = array( 'from@example.com' , '送り元日本語名' );
$subject = 'メールのテスト(テキスト)';
$body = "ここに本文を書きます。";

qd_send_mail( 'text' , $to , $subject , $body , $from);
宛先日本語名などが必要ない場合
メールアドレス関係で名前表示が必要ない場合は、配列にする必要はありません。
$to = 'address@example.com' ;
$from = 'from@example.com' ;
(以下、省略)
添付ファイルを送る場合
$to = array( 'address@example.com' , '宛先日本語名' );
$from = array( 'from@example.com' , '送り元日本語名' );
$subject = 'メールのテスト(テキスト)';
$body = "ここに本文を書きます。";
$attach = array( 'test.jpg' , '添付フィル.jpg');

qd_send_mail( 'text' , $to , $subject , $body , $from , $attach);
添付ファイルのファイル名は、相対指定です。
0系の指定の仕方も参考にしてください。

添付ファイルで、日本語ファイル名は必要ない場合

$attach = array( 'test.jpg');
(他省略)

添付ファイルで、MIMEタイプを明示的に指定する場合

QdmailではContent-typeヘッダにつけるMIMEタイプは、ファイル名の拡張子から自動判別します。
しかし、拡張子のないファイルや、明示的にMIMEタイプを変更したい場合は下記のようにしてください。
$attach = array( 'test.jpg' , '添付フィル.jpg' , 'test/mime' );
(他省略)
これで
 --__Next-1-......__
Content-Type: test/mime;
 name="=?iso-2022-jp?B?GyRCRTpJVSVVJSMlaxsoQi5qcGc=?="
というヘッダになります。
添付ファイルを複数指定する場合
複数の添付ファイルを指定したいときはネストしてください。
$attach1 = array( 'test.jpg' , '添付1' );
$attach2 = array( 'test2.jpg' , '添付2' );
$attach = array($attach1,$attach2);

(他省略)

qd_send_mail( 'text' , $to , $subject , $body , $from , $attach);
他の任意のヘッダーを追加したい場合
任意のヘッダーは、配列で指定します。
From以外のヘッダーを指定する時は、必ずFromも明示的に設定してください。Fromは、必須のヘッダーです。
必ずフロムヘッダーが入る関係上、複数のヘッダーを指定することになるので、配列はネストすることになります。

配列のキー(添え字)が、ヘッダー名となり、配列の値が、ヘッダーの値となります。
Qdmailがヘッダー名に「:」(コロン)を自動的につけますので、ここでのキーは「:」は抜いた形で指定してください。
 $add_header = array( 
    'From' => array('from@example.com','FROM表示名'),
    'header-name' => 'parameter',
  );

(他省略)

qd_send_mail( 'text' , $to , $subject , $body , $add_header , $attach);
(FROM表示名が必要なく、メールアドレスだけでいい場合は'From'=>'from@example.com'でも構いません。

他の任意のヘッダーを複数追加したい場合
複数の追加ヘッダーを設定したい場合です。
$from = array( 'From' => array('from@example.com','FROM表示名' ));
$add_header1 = array( 'header-name' => 'parameter' );
$add_header2 = array( 'header-name2' => 'parameter2' );
$add_header = array( $from , $add_header1 , $add_header2 );

(他省略)

qd_send_mail( 'text' , $to , $subject , $body , $add_header , $attach);

# kt 『ver1.1.2bを利用させていただいております。 ヘッダーの追加で「Return-path」を追加したいと思い、 以下のよう...』 (2008/09/25 14:40)

# spok 『ktさん せっかく使っていただいているのにご不便おかけして申し訳ないです。 当方では再現しませんので、以下の情報をお知らせ下さ...』 (2008/09/25 16:16)

# spok 『あ、原因がわかりました。 mail関数をお使いの場合は、MTAが勝手にreturn-pathを設定するので、ヘッダーでretur...』 (2008/09/25 16:23)

# kt 『コメントありがとうございます。 mtaOption()メソッドの指定をしたのですが、上手くいきません。 $option = ...』 (2008/09/25 19:29)

# kt 『追記です。 試しに存在しないメールアドレスにメールを送信したのですが、 Fromで指定したメールアドレスに返信されました。 引...』 (2008/09/25 19:48)

# spok 『PHPのmail関数自体の制限で、windowsでは、fromとreturn-pathは、強制的に一致となります。 (参考) h...』 (2008/09/25 21:49)

# spok 『あ、ちなみに添付ファイルがない、というエラーがでていらっしゃいますね。』 (2008/09/25 21:50)

# spok 『不十分ですが、マニュアルも修正、追加しておきました。 http://hal456.net/qdmail/return_path ...』 (2008/09/25 22:01)

# kt 『こちらのテスト環境の問題でしたか‥。 知識不足でした。調べていただき、感謝しております。 』 (2008/09/26 9:34)

# fuku 『関数qd_send_mailについての使い方、もしくは仕様上対応しているのか質問させてください。 複数宛にTO(BCC,CC)...』 (2008/11/02 13:38)

# spok 『以下をご覧下さい。 http://hal456.net/qdmail/oopbase』 (2008/11/02 24:15)

# spok 『OOPと同じように、$toに複数宛先のデータを入れて、qd_send_mailに渡せばよろしいかと思います。』 (2008/11/02 24:16)

# ふじさん 『ふじさんです qd_send_mail の関数型を使っています クラス型の複数To,複数Cc,複数Bccは, $addres...』 (2010/06/16 11:56)

  • qd_send_mailでHTMLメールを送る Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    基本的には、qd_send_mailでのテキストメールの送信方法と同じです。'text'という指定を'html'と変更するだけです。ここでは、サンプルコードのみを記します。添付ファイルを送る場合$to = array( 'address@example.c...
  • Optionの指定方法 Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    qd_send_mailでは、第1引数に $option を指定することで、様々な設定をすることができます。通常のテキストメールを送るだけであれば、次のように、第1引数には'text'を指定するだけでした。 qd_send_mail( 'text' , $...

関数型qd_send_mailの基本

関数型qd_send_mail()

mb_send_mail()ライクに指定できます。

基本構文
qd_send_mail(  'メールタイプ' ,
               'address@example.com',
               '件名',
               '本文',
               'from@example.com'
            );

'メールタイプ'

'メールタイプ'には、'text,'html,'deco'が入ります。
また、この第1引数を配列してオプションを渡すことができます。
オプションの詳しい方法については、オプションの指定方法をご覧下さい。

宛先、フロムに日本語を入れる場合

$to = array('address@example.com','宛先日本語');
$from = array('from@example.com','フロム日本語');

qd_send_mail( 'text' , $to , '題名ですsubject' , '本文' , $from );

添付ファイルを添付する場合

$to = array('address@example.com','宛先日本語');
$from = array('from@example.com','フロム日本語');
$attach = array('test.jpg','添付ファイル日本語名');

qd_send_mail( 'text' , $to , '題名ですsubject' , '本文' , $from , $attach);

複数の添付ファイルを添付する場合

$to = array('address@example.com','宛先日本語');
$from = array('from@example.com','フロム日本語');
$attach1 = array('test1.jpg','添付ファイル日本語名');
$attach2 = array('test2.jpg','添付ファイル日本語名');
$attach = array($attach1,$attach2);

qd_send_mail( 'text' , $to , '題名ですsubject' , '本文' , $from , $attach);

添付ファイルのMIMEタイプを明示的に指定する場合

(デフォルトでは拡張子から、適切なものが自動的につけられます)
$to = array('address@example.com','宛先日本語');
$from = array('from@example.com','フロム日本語');
$attach = array('test.jpg','添付ファイル日本語名',true,'image/jpeg');

qd_send_mail( 'text' , $to , '題名ですsubject' , '本文' , $from , $attach);

記事リスト

# kado 『半角カナ文字をメール送信したところ、??????? となってしまいます。 以下の構成です。 $r_text = "カタカナカ...』 (2009/01/06 17:20)

# kado 『半角カナ文字をメール送信したところ、??????? となってしまいます。 以下の構成です。 $r_text = "カタカナカ...』 (2009/01/06 17:24)

# spok 『Qdmailをお使いいただきありがとうございます。 日本語メールで一般的であり、Qdmailデフォルトのキャラクタセットである...』 (2009/01/06 25:18)

# spok 『これもおいておきます。 http://www.google.com/search?&num=100&hl=ja&q=%E3%83...』 (2009/01/06 25:21)

# kado 『Qdmail error: Qdmail Version 1.2.6b ,PHP Version 5.1.6 Qdmail er...』 (2009/05/09 9:56)

# t 『いまさら返信ですが、 >Empty Body do not allowed. 本文が空ですよ。 >If you want ...』 (2009/09/10 13:33)

# popoc 『以下のソースを実行するとTimeoutが発生します。 <?php require_once('qdmail.php'); qd...』 (2009/09/26 23:26)

特殊文字を送りたい(丸数字、はしご高など)

特殊文字、拡張文字と文字コードセット

はしご高(髙)や機種依存文字の①などの丸数値を送りたい時があるでしょう。
まずは、特殊文字と対応文字オードを示します。

参考:
文字コードの基本-IT Pro
文字コード規格の基礎-IT Pro
使ってはいけない文字(β版)
PHPで「髙(はしごたか)」「﨑(たつさき)」が文字化ける(2)-yossy.blog
文字コードの話
以下はあくまでもPHPの文字コードセット指定の場合です。
7bit8bit
iso-2022-jputf-8shift_JISsjis-wineuc-jpeucJP-win
IBM拡張文字(髙﨑黑神福など)××××
NEC拡張文字(①②㈱㌍ⅠⅡ伹侚など)×××
半角カナ×
ただし、上記で○だからといって文字化けしない訳ではなく、例えば、OutlookExpressは、eucJP-winのメールは正しく表示できないようです。gmail,秀丸メールはOKでした。このようにインターネットの中は正しく通っても、最後のメーラーで文字化けすることもあるようです。
また、-winとついている文字コードセットは、基本的にwindows用なので、Macでは文字化けすると思います(ただし、私はMacを持っていないのでテストしていません。Macにも-winの文字フォントが入っていればたぶん表示できるでしょう)。

特殊文字をメールで送信する時の文字コードセットと本文エンコード

文字コードセット :UTF-8
本文エンコード指定:Base64
具体的な手続としては、QdmailでのUTF-8,BASE64の指定方法をご参照下さい。

ただし、au携帯の一部では、UTF-8のヘッダーをデコードできない場合があります。
その時は、ヘッダーはiso-2022-jp(特殊文字は使えないけど)、本文はUTF-8(特殊文字が使える)というのはいかがでしょう。

このヘッダーと本文の文字セットを変える方法は、「ヘッダ、本文に別々のCharsetを指定する 」をご参照ください。

どうして本文エンコードは、base64なのか?

そして、UTF-8 + 8bit という指定もあり得るのですが、現状では、 8bit を受け付けないSMTPサーバーもある以上、文字化けのリスクは残ります。貴方の環境でうまくいっても、他の人に送信した場合に文字化けするかも知れません。

一方で、base64エンコードであれば、SMTPサーバーはもちろん大丈夫、クライアントであるメーラーも、対応していないメーラーは珍しい部類かと思います。

単純に言いましょう
組み合わせ規格(RFC1652-MIME)*1的にSMTPサーバー対応メーラー
文字コードセット :UTF-8
本文エンコード指定:7bit
間違っている*2--
文字コードセット :UTF-8
本文エンコード指定:8bit
正しい対応していないサーバーもあるauの古い携帯では未対応らしい
文字コードセット :UTF-8
本文エンコード指定:Base64
正しいすべて大丈夫auの古い携帯では未対応らしい

特殊文字を送るのは UTF-8 + Base64 が最もお薦めです。

インターネットメールの世界はまだまだ7bit

7bitである、iso-2022-jp,utf-7などは、本文エンコードを7bitにして送信することができますが、本文エンコード8bitで送らなければならない8bit文字コードセットは、まだまだ対応していないSMTPサーバーがあるようで、そのまま送信するのは、お薦めできません。
8bit文字コードセットを送信する場合には、本文をbase64エンコードして送るのがよいでしょう。
Base64エンコードとは、8bitの文字コードセット*3を、6bitにするエンコード方式なので、インターネット経路上は絶対に安全なのです。

インターネット経路上は安全であっても、受け取った人のメーラーがBase64に未対応の場合には、文字化けしますが、古いau端末以外はまず大丈夫だと思います。

それにしても、auは、デコメも特殊だし、utf-8対応は不完全だし、どうにもわがまま?なキャリアですね。

UTF-8 か Shift-JISか

私としては、国内ローカルのShift-JISよりも、全世界共通のUTF-8がいいと思います。海外在住の日本人の人が、Shift-JIS対応の端末を入手できるかどうかわからないからです。
一方で、国内の携帯端末のほんの一部は、UTF-8に対応していないのもあるようなので、難しいところです。

特殊文字は使わないのが一番

確かに、特殊文字を使わないのが一番いいです。しかし、WEBサービスではそうも言ってられない場合もあるでしょうね。。。。
でも、現状ではやっぱり、特殊文字を送らない方策を探るのが、もっともトラブルが少ないような気がします。

*1 : RFC1428等も

*2 : CakePHP1.2RC2はこれなんだよな~

*3 : 別に8bitでなくても、文字コードセットでなくてもいいのだけれど

SMTPの玄人的操作法

必ずバージョン0.9.0a以降でご使用ください。

QdSmtpをQdmailから操作する。

QdSMTPを利用して、Qdmailからメールを送る基本的な方法は、QdSmtpでのSMTP送信をご覧ください。

ここでは、メールを送るだけではなくて、QdSmtpの機能をフル活用したいという人のためのコーナーです。

QdSmtpオブジェクトの取得方法

Qdmail&QdSmtpで、SMTP送信する場合は、インクルードできる場所にqdsmtp.phpファイルさえ置いてあれば、Qdmail側で勝手にインクルードして、勝手にオブジェクト生成(インスタンス)を行います。
これはこれで便利だと思うのですが、QdSmtpオブジェクトは、Qdmailによって隠蔽されているので、QdSmtpの機能を余すことなく利用するのが若干難しくなります。

Qdmailでは、SMTPオブジェクトの明示的取り扱いについて、以下の2つの方法があります。
  1. Qdmailが内部生成したQdSmtpインスタンスをユーザーに渡す。
  2. QdSmtpインスタンスをユーザー側でnewし、それをQdmailに渡す。
(※ ここではあくまでもQdSmtpオブジェクト(インスタンス)を明示的に扱いたい場合であって、簡単にsmtp送信するだけならQdSmtpでのSMTP送信の方法の方が簡単かと思います。)


まず、1の方法を説明します。
(ここではPOP BEFORE関連のみを記しますが、他のQdSmtpメソッドに応用可能です。)

1. Qdmailが内部生成したQdSmtpインスタンスをユーザーに渡す。

サンプルコード
必ずバージョン0.9.0a以降でご使用ください。
$param = array(
    'host'=>'smtp.example.com',
    'pop_host'=>'pop.example.com',
    'port'=> 25 ,
    'from'=>'from@example.com',
    'protocol'=>'POP_BEFORE',
    'pop_user'=>'pop_user_id',
    'pop_pass' => 'pop_password',
);

$mail -> smtp(true);
$mail -> smtpServer($param);

$smtp=& $mail->smtpObject();                        // QdSmtpのオブジェクトを取得
$smtp -> pop3TimeFilename( 'henkou_filename.txt' ); // POP制御のためのファイル名変更
$smtp -> pop3ValidMinute( 5 );                      // POP間隔の変更


$message=$itsme.$sender_mess."ここに本文を書きます。";

$flag=$mail ->easyText('address@example.com','宛先','タイトル',$message,'from@example.com');
(PHP5の場合は、& は必要ありません。)

これで、$smtpには、Qdsmtpのオブジェクト(インスタンス)が代入されておりますので、Qdsmtpのメソッドを使用することができます。
この
$smtp=& $mail->smtpObject();                        // QdSmtpのオブジェクトを取得
$smtp -> pop3TimeFilename( 'henkou_filename.txt' ); // POP制御のためのファイル名変更
$smtp -> pop3ValidMinute( 5 );                      // POP間隔の変更
の部分が、QdSmtpを操作している部分ですが、PHP5の場合は、わざわざ、$smtpという変数にいったん代入しなくても、以下のようにすることもできます。
$smtp -> $mail->smtpObject() -> pop3TimeFilename( 'henkou_filename.txt' ); 
$smtp -> $mail->smtpObject() -> pop3ValidMinute( 5 );
続いて、2の方法を説明します。

2. QdSmtpインスタンスをユーザー側でnewし、それをQdmailに渡す。

require_once('qdmail.php');
$message='<font color="red">メールの中身を書きます。</font>';
$mail ->to('address@example.com');
$mail ->subject('メールのテスト');
$mail ->from('from@example.com');
$mail ->html($message);
//ここまでは通常のQdmailの操作

//ここからQdSmtpの操作
require_once('qdsmtp.php');
$smtp = & new qdsmtp;
$param = array(
    'host'=>'smtp.example.com',
    'pop_host'=>'pop.example.com',
    'port'=> 25 ,
    'from'=>'from@example.com',
    'protocol'=>'POP_BEFORE',
    'pop_user'=>'pop_user_id',
    'pop_pass' => 'pop_password',
);
$smtp -> server($param);
$smtp -> pop3TimeFilename( 'henkou_pop_file.txt' );
$smtp -> pop3ValidMinute( 5 ); 

$mail->setSmtpObject($smtp);//QdmailにQdSmtpのインスタンスを渡す

$flag=$mail ->send();    
なお、
$mail->setSmtpObject($smtp);//QdmailにQdSmtpのインスタンスを渡す

$flag=$mail ->send();    
の部分は、PHP5であれば、以下のように書くこともできます。
$flag=$mail -> send($smtp);
このsend($smtp)式は、PHP4でも送信できますが、$smtpインスタンスがディープコピー(clone copy)されるので、若干メモリの無駄使いとなります。

# KUNO 『PHP5以上でqdmailとqdsmtpの連携をしようとすると、以下のソースのところでオブジェクトが渡されずにSMTPで送信でき...』 (2010/01/26 15:29)