ようこそゲストさん

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

ヘッダ、本文に別々のCharsetを指定する

かなり特殊な状況ですが、本文とヘッダーに別々の文字コードを使用したいときがあります。
その時は次のようにします。

ユーザーソースコードで対応する方法

ヘッダISO-2022-JP7bit
本文UTF-8base64
$mail = & Qdmail();

$mail -> charsetHeader( 'iso-2022-jp' , '7bit' ) ;
$mail -> charsetBody( 'utf-8' , 'base64' ) ;
Qdmailは、iso-2022-jpがデフォルトなので、上記の例でいうと$mail -> charsetHeaderはなくても、意図の通りに動作しますが、説明のために明示しています。

Qdmailのソースコード改変で対応する方法(UTF-8,BASE64)

$charset_content と$content_transfer_enc_text、$content_transfer_enc_htmlを定義している以下の部分をテキストエディタなどで検索して、以下のように修正してください。
var $charset_content = 'utf-8';
var $content_transfer_enc_text	= 'base64';
var $content_transfer_enc_html	= 'base64';

#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/011/tb/
  • 特殊文字を送りたい(丸数字、はしご高など) Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    はしご高(髙)や機種依存文字の①などの丸数値を送りたい時は、以下の設定が一番お薦めです。丸数字、機種依存文字などを送る文字セット:UTF-8文字エンコード:Base64具体的な手続としては、QdmailでのUTF-8,BASE64の指定方法をご参照下さい。...

改版履歴

Qdmaiのダウンロードページはこちら
  • 2008-08-20
    • 1.0.5b , qdmail.0.9.4.002
添付ファイル送信時の不具合を修正
Content-Disposition: attachment; とすべきところを、Content-Disposition: attachement;となっていた。
  • 2008-08-18
    • 1.0.4b
qd_send_mail での第1引数が配列でない場合にエラーが出るバグの修正
  • 2008-08-13
    • 1.0.3b
sizeメソッド新設
smtpDataメソッド新設
render_mode 新設
  • 2008-08-09
    • 0.9.4.001
mime_stringメソッドの修正(1系と同じにした)
  • 2008-08-08
    • 1.0.2b , 0.9.4
decoJudgeメソッド不具合の修正。d.vodafone.ne.jpなどが正しく判定できなかった点を修正。
thanks to nnnnnnさん!
  • 2008-08-05
    • 1.0.1b , 0.9.3
デコメのディズニー携帯への仮対応(テストしていないので、正しく送信できるかどうか不明)
  • 2008-08-02
    • 1.0.0b
1.0.0のベータ版公開。前より高機能、前より軽め
  • 2008-07-26
    • 0.9.2
アルファー版からベータ版を飛び越えて、正式版へ移行
gmail.comにデコメを送信する時はDocomoバージョンとした。
attach()の一部変更。
  • 2008-07-24
    • 0.9.1a
CakePHPでのSMTP送信時にエラーがでていた点の修正
Special Thanks to Sさん!
  • 2008-07-19
    • 0.9.0a
setSmtpObject()メソッドの追加
Qdsmtpとの連携関係を修正(smtpObject()他)
  • 2008-06-28
    • 0.8.9a
addHeaderメソッドのバグ修正
$this->other_headerプロパティ追加
  • 2008-06-25
    • 0.8.8a
mb_convert_kana の Vオプション追加
easyモードで、$this->body_build_onceがtrueになっていたのをfalseになるよう変更。
デコメールのauto_decoモード時に、PCアドレスに対してはMHTML形式で送るように変更。
  • 2008-06-23
    • 0.8.7a
メンバ変数 language = 'ja' 追加
メンバ変数 kana = false 追加
半角カナを全角カナに変換するルーチンを追加(mime_string , makeContent )
  • 2008-06-18
    • 0.8.6a
qmailを自動判定し、その場合には、改行コードをLFのみにするようにした。
isQmail(),lineFeed()関数の増設。
  • 2008-06-16
    • 0.8.5a
ISO-2022-JP時のMIMEエンコーディングの不具合修正。エスケープシーケンスが2重になってたのを回避するようにした。
Thanks to kei さん!
  • 2008-06-01-2
    • 0.8.4a
インテリジェントワードラップの不具合を修正。
0.8.0aにバージョンアップした際の修正ミスでした。
(mail関数に渡す時には本文LFなのに、その後の処理をCRLF前提で行っていた)
その他、デバッグルーチン一部変更。
  • 2008-06-01
    • 0.8.3a
ライセンスをMIT Liceseに変更。(CakePHPと同じです。)
AGPLv3に比べ緩いライセンスにしました。もちろん、個人、企業、商用、すべて無料です。
  • 2008-05-27
    • 0.8.2a
base64エンコード + textメールの時に htmlメールになってしまう不具合を修正。
thanks Kumaさん!
  • 2008-05-15
    • 0.8.1a
MIMEエンコーディングの不具合を修正。
(マルチバイト文字単位&エンコード)
  • 2008-5-08
    • 0.8.0a
添付ファイル名(日本語)が処理されない不具合を修正。
本文の改行コードにつき、mail関数の時はLFコード、SMTP送信の時はシステム設定に従うように変更
  • 2008-4-28
    • 0.7.9a
ウィルコム(Willcom)のデコメ(デコラティブメール)にも対応しました。
  • 2008-4-28
    • 0.7.8a
CakePHPでレイアウト、エレメントを指定しても、正しく動作しなかった不具合を修正。
(Thanks to 通りすがりさん!)
  • 2008-4-25
    • 0.7.7a
分割送信時に不要な際ビルド(添付ファイル)をしないように修正(速度対策)。
分割送信時に、本文をキャッシュする機能追加(デフォルトはOFF)
一般関数 qd_send_mail を追加(ベタ書き対処)(CakePHPオプション付き)
  • 2008-4-24
    • 0.7.6a
CakePHP対応 1.1 & 1.2 (コンポーネントとして動作)
SMTP送信のための布石をいくつか
Noticeエラー修正。$this->contentを初期化から配列型に変更
文末の改行は削除するように仕様変更
  • 2008-4-23
    • 0.7.5a
Noticeエラーがでていた部分の修正
  • 2008-4-23
    • 0.7.4a
連続してメールを送信した場合に、ヘッダーとボディが更新されない問題を修正
連続してメール送信した場合に、ログがおかしくなる問題を修正
SMTP送信へ向けてのソース整理
  • 2008-4-21
    • 0.7.3a 
ワードラップユーザーインタフェイスのバグ修正
ワードラップの改行処理修正
ユーザーが入れた改行が削除されてしまう不具合を修正
禁則処理の追加
  • 2008-4-16
    • 0.7.2a 
inlineMode()メソッド追加
OOPでのデコメ指定時の不具合を修正
  • 2008-4-16
    • 0.7.1a 
本文最初に余分の改行が入っていたのを修正。
charsetAttach()を追加。
  • 2008-4-16
    • 0.7.0a 初版アップロード

記事リスト

# spok 2008年04月23日(水) 午後8時09分

コメントありがとうございます。たいへんはげみになります。
SMTP対応が終わったら、CakePHP対応を考えたいと思います。

# spok 2008年04月24日(木) 午後11時53分

意外に早くCakePHP対応ができました。よろしければお使いくださいませませ。

# suzuki 2008年04月28日(月) 午前11時38分

この間こちらにコメントさせていただきました、「通りすがりのものですが」改めsuzukiです。

こんなに早くcakeに対応していただけるなんて…感謝感激です!
spokさん、本当にありがとう!
今日から早速使わせていただいております。

諸事情からsmtpを利用しているのですが、ソースを拝見しながら何とか送信できるところまでこぎつけました(汗)
(いくつか気づいた点がありましたので別途メールさせていただきますね^^/)

お仕事がお忙しいとのことですが、ご無理なさらぬようご自愛くださいませ。
これからもQdmailの開発を楽しみに見守らせていただきます。

# yoshi 2008年06月01日(日) 午前7時33分

本メールはXRMSトライアル期間中
のメール配信テストメッセージです。

spokさん

おせわになっております。0.8.3aを早速つかわせていただきました。
文字化けでなやんでいたものとしては大変ありがたくおもっております。

ひとつ、easyTextで送信した際、(破線以下の)本文に余分な改行が入る(下記 <- 部分)
のですが、チェックしてみていただけますでしょうか?

文字コードはUTF-8にしています。

よろしくおねがいします。


-----------------------------------------------------
本メールはABCDトライアル期間中
のメール配信テストメッセージです。

本メールはABCDトライア<-

ル期間中のメール配信テストメッセージです。

本メールはABCDトライアル期間中
のメール配信テ<-

ストメッセージです。

ご協力ありがとうございます。

# spok 2008年06月01日(日) 午後1時58分

yoshiさん

スポックです。重要な不具合のご報告ありがとうございます。
こちらでも再現いたしました。
0.8.0aにバージョンアップした際の修正不足でした。
インテリジェントワードラップのルーチンで、1行毎に分解するのですが、その改行コードにつき、全文をCRLF->LFと直前に変更していたのに、CRFL前提でその後の処理が走っていました。

修正バージョンをアップロードしてみましたので、0.8.4a を試してみて下さい。

# yoshi 2008年06月01日(日) 午後6時27分

スポックさん

すばやい対応ありがとうございます。
早速試したところ、前回の現象は解消していました!!

これは質問ですが、1行あたりの最大文字数とかの設定
があるのでしょうか。日本語で49文字前後のところで
予期せぬ改行をする場合がありましたので、
ご参考まで。

# spok 2008年06月01日(日) 午後8時34分

yoshiさん
スポックです。
デフォルトでは、日本語45文字で折り返しをするようになっています(インテリジェントワードラップ)。
この文字数を変更するには、下記URLをご参照下さい。
http://hal456.net/qdmail/wordwrap#p1.4

また折り返し処理そのものを無効化するには、下記URLをご参照下さい。
http://hal456.net/qdmail/wordwrap#p1.5

上記を試してみても、予期せぬ改行が入る場合は、お手数ですが、再度ご連絡ください。


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/013/tb/

文字コードについて

日本語メールでもっとも文字化けが少ない文字コードは、
キャラクタセット:ISO-2022-JP
エンコード   :7bit
です。

Qdmailは、Quicklyにメールを作成するために、ユーザーから特に指示がない限り、iso-2022-jp,7bitに変換して送ります。

ただし、Qdmailは、Dteiledに指定を変えることができます。
例えば、以下のような組み合わせも、日本語メールでよく使われます。
キャラクタセットエンコードメリットデメリット
UTF-8Base64多言語対応。丸数字など多彩な文字を送付可能base64に対応していないWEBメールなどでは文字化けすることもある。base64は、通常エンコードに比べて、約1.3倍に容量が増える
Shift-JIS7bit機種依存文字を送付可能。日本語以外対応できない。文字化けがでることもある
UTF-8Qauted-Printableんーどうなんでしょ。ヨーロッパではQPエンコードが多いそうだ対応していないメーラーも多い
他にも様々な組み合わせが考えられます。
今後はUTF-8のメールが増えると私は予想しています。
ここでは、文字コードに関係する様々なQdmailのオプションの設定方法をみてみましょう。

#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/09/tb/

添付ファイルの指定(OOP)

添付ファイルのOOP的指定方法です。

オブジェクトの生成や他のアドレスの指定は省略します。それらは、基本的な使い方-OOP編をみてください。
Qdmailでは、いくつでもファイルを添付することが出来ます。

簡単な指定方法

$mail -> attach( 'test.jpg' );
ファイル名は、呼びだしもとのスクリプトからの相対パスでしていします。
絶対パスでも指定できます。

例)
/home/hogehoge/images/test.jpg //絶対パス方式
./images/test.jpg //相対パス方式

簡単な指定方法2(日本語ファイル名)

$mail -> attach( array('test.jpg' , '添付ファイル名(日本語OK)' ) );

複数ファイルの指定方法(その1)

現在、この方法は指定できません。
$attachPath = array( 'test.jpg' , 'test2.gif' );
$attachName = array( '添付ファイル名1' , '添付ファイル名2' );

$mail -> attach ( $attachPath , $attachName );

1.1.0bより復活させました。ただし、制限事項があります。
$attachPath = array( 'test.jpg' , 'test2.gif' );
$mail -> attach ( $attachPath , $attachName );
この方式で添付ファイル名は指定できません。

この指定ができるのは、インラインモードtrue or シンプルアタッチモードtrueの時だけです。
インラインモードは、
$mail ->inlineMode(true);
ただし、qd_send_mailでデコメ送信時は自動的にインラインモードになります。

シンプルアタッチモードは、
$mail->simpleAttach(true);
です。

シンプルアタッチモード、インラインモードであっても、他の指定方法を併用できます。
ただし、 $attach = array( filename , attach_name );だけは併用できませんので、その場合は、$attach = array( array(filename , attach_name) );と入れ子にしてください。

複数ファイルの指定方法(その2)

$attach[] = array( 'test.jpg' , '添付ファイル名1' );
$attach[] = array( 'test2.gif' , '添付ファイル名2' );

$mail -> attach ( $attach );

複雑な添付ファイルの指定方法(MIMEタイプとContent-IDを独自指定)

$attach = array(
    'PATH' => 'test.jpg' ,
    'NAME' => '添付ファイル名1',
    'CONTENT-TYPE'=>'anything/mimetype',
    'CONTENT-ID'=>'image_0001',
 );

$mail -> attach ( $attach );

# あきよし 2008年10月16日(木) 午後4時46分

CONTEN-ID の独自指定方法、現状ライブラリ(ver 1.2.0b) と食い違うように思います。(以前はわかりませんが…)

説明にある CONTENT_ID ではなく、CONTENT-ID としなくてはうまくいきません。
MIME_TYPE も CONTENT-TYPE が正しいようです。

また、inline mode の場合(deco メール送信時含む)、attach($attach) ではなく、
attach(array($attach)) と、array の入れ子をひとつ多くしなくては駄目でした。

とりあえず、deco メール送信で自分がハマッたので、管理人さんがマニュアル整備するまでの「つなぎ」程度に情報を書かせてもらいました。

# spok 2008年10月18日(土) 午後1時20分

あきよし さん

ご指摘ありがとうございました。CONTENT-ID,CONTENT-TYPEにつきまして、マニュアルを修正いたしました。

# han 2011年06月25日(土) 午後6時16分

動的に生成した文字列を ファイルとしてサーバに保存することなく添付ファイルとして(任意のファイル名を指定して)送信することはできないのでしょうか?

動的な文字列がHTMLなので HTMLで送信していますが 添付の方が都合が良い(ブラウザで開きやすい・一通で複数のHTMLファイルを送れる)ですし 文字列内に個人情報があるのでサーバに保存はしたく無いと言う思いがあります

おそらく仕様外なのだとは思いますが 念のため…と思い質問させていただきました


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/012/tb/

キャラクタセット、エンコードの指定方法UTF-8,BASE64等

通常、日本語はISO-2022-JPで送ることがもっとも安全ですが、UTF-8 + base64 もよく使われます。ここでは、ユーザーが自分でキャラクタセットやエンコード方法を指定する方法をみてみましょう。
$mail = & new Qdmail( 'UTF-8' , 'base64' );
これで、ヘッダー、本文、添付ファイルの添付名のすべてが、UTF-8になります。
特殊ですが、Quoteod-Printableで設定したい人は、base64の代わりに、「Quoteod-Printable」または「QP」と指定してください。

$mail = new Qdmail(); としてあとに、次のような指定もできます。
$mail -> charset( 'UTF-8' , 'base64' );
簡単ですね。

Qdmailは、自在にcharsetを変更することができるのです。

ちなみに、引数は配列にして
$mail -> charset( array('UTF-8' , 'base64') );
と書くこともできます。

# 2010年06月30日(水) 午後6時18分

便利ですね!


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/010/tb/
  • 文字コードについて Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    日本語メールでもっとも文字化けが少ない文字コードは、キャラクタセット:ISO-2022-JPエンコード   :7bitです。Qdmailは、Quicklyにメールを作成するために、ユーザーから特に指示がない限り、iso-2022-jp,7bitに変換して送...
  • 半角カナの送信 Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    インターネットの日本語メールでは半角カナは使わないのが一般的です。なぜなら、文字セットiso-2022-jpでは半角カナをサポートしていないからです。しかし、それでも半角カナを送りたい場合もあるでしょう。以下の方法を試して下さい。 本文を UTF-8 , ...
  • 特殊文字を送りたい(丸数字、はしご高など) Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    はしご高(髙)や機種依存文字の①などの丸数値を送りたい時は、以下の設定が一番お薦めです。丸数字、機種依存文字などを送る文字セット:UTF-8文字エンコード:Base64具体的な手続としては、QdmailでのUTF-8,BASE64の指定方法をご参照下さい。...

基本的な使い方-OOP編

$mail -> send() 型

簡単Qdmailのオブジェクト指向的送り方です。
OOPではない指定の仕方もありますが、出来る限りOOP方式をお薦めします。
文字コードは、Qdmailが自動判別します。

基本的な送り方( text メール)

$mail = & new Qdmail();

$mail -> to( 'address@example.com' , '宛先日本語名' );
$mail -> subject( 'タイトルも日本語で' );
$mail -> text( 'ここに内容をいれます' );
$mail -> from( 'from@example.com' , '配信元日本語名' );

$mail ->send();
文字コードは、Qdmailが自動判別し、デフォルトでもっとも文字化けが起こりにくいiso-2022-jpで送ります。
「日本語名」は省略できます。
PHP5では、newの前の & は必要ありません。

cc,bcc,reply-to

cc,bcc,reply-toは次のように指定します。
$mail -> cc( 'address2@example.com' , '宛先cc日本語名' );
$mail -> bcc( 'address3@example.com' );
$mail -> replyto( 'address4@example.com' , '返信先replyto日本語名' );
※bccでは、宛先表示名は意味がありませんので、指定できません。

この場合、reply-toは、ハイフンを抜いてreplytoで指定しますので、気をつけて下さい。

複数宛先の指定方法その1


$to = array( 'address1@example.com','address2@example.com','address3@example.com' );

$toName = array( '宛先1の日本語名','宛先2の日本語名','宛先3の日本語名' );

$mail -> to( $to , $toName );

cc,bccも同様です。from,reply-toは、ひとつしか設定できません。


複数宛先の指定方法その2


$to[] = array( 'address1@example.com' , '宛先1の日本語名' );
$to[] = array( 'address2@example.com' , '宛先2の日本語名' );
$to[] = array( 'address3@example.com' , '宛先3の日本語名' );

$mail -> to( $to );
cc,bccも同様です。from,reply-toは、ひとつしか設定できません。

複数宛先の指定方法その3

$to[] = array( 'address1@example.com' , '宛先1の日本語名' );
$to[] = array( 'address2@example.com' , '宛先2の日本語名' );
$to[] = array( 'address3@example.com' , '宛先3の日本語名' );

foreach( $to as $addr_and_name ){
  $mail -> to( $addr_and_name  , null , true );
}
point
$mail -> to()の第3引数を true にするのがポイントです。
この第2引数は、これまでに設定されていたメールアドレスに「追加するか、上書きするか」を指定しています。
$mail -> to()の第3引数
追加true
上書きfalse
cc,bccも同様です。

htmlメール

$mail ->text('内容');の代わりに
$mail ->html('htmlメールの内容を入れます。');
とするだけです。
Qbmailのデフォルトでは、自動的に代替テキストが作成されます。
これでhtmlメールを読むことができないメーラでも、内容を読むことができるようになります。
例えば、原則としてテキストメールしか読めない*1秀丸メールや、携帯メールなどに送るときに有効でしょう。

この自動テキスト生成機能は、OFFにすることもできます。
$mail->send();の前に
$mail -> autoBoth(false);
としてください。

*1 : そのようなポリシーのメーラー

# K Fan 2008年05月02日(金) 深夜3時39分

はじめまして。
メールの文字化け対策に悩んでいたところ、発見しまして使用させていただきました。

一点だけ間違いを発見しました。
このページの基本的な送り方の

$mail = & new Qdmai();

new Qdmailのlが抜けています。

# spok 2008年05月07日(水) 深夜1時41分

K Fanさん

ご指摘ありがとうございます。
まさに基本的な部分でタイポしまして申し訳ありません。
修正しておきました。
バージョンアップもしましたので、ぜひご利用ください。(0.8.0a)

# LG23 2008年11月13日(木) 午前9時38分

はじめまして。
メール送信を簡単にしてくれるのでいつも使わせていただいてます (^^)

一つ困ってしまったことがあるのですが、cakePHPで使用する際、
$Qdmail->ccや$Qdmail->bccとして指定したcc、bccのクリアは
どのようにしたらよろしいのでしょうか?

$Qdmail->cc('')としてもバリデートエラーが返ってきてしまいます。
教えていただけたら幸いです。

# spok 2008年11月13日(木) 午後8時38分

こちらをご参照ください。

http://hal456.net/qdmail/reset

# custar 2008年12月20日(土) 午前11時30分

function subject() で設定したサブジェクトの文字列は、
下記 (2)-(4) において、$this->subject['CONTENT'] に格納されます。

引数をもたずに呼び出される subject() の返り値は、(1) において、
$this->subject が返されています。

しかし、期待される subject() の返り値は、$this->subject['CONTENT']
ではないでしょうか?

そうであれば (1) は、

return $this->subject['CONTENT'];

が宜しいと思いますが、いかがでしょうか?



function subject($subj = null)
{
 if (is_null($subj))
 {
  return $this->subject; ................................. (1)
 }
 
 if (is_string( $subj ) || is_numeric( $subj ))
 {
  $this->subject['CONTENT'] = (string) $subj; ............ (2)
  return ...
 }
 elseif (is_array($subj))
 {
  $subj = array_change_key_case( $subj , CASE_UPPER );

  if (isset($subj['CONTENT']))
  {
   $this->subject = $subj; .............................. (3)
  }
  else
  {
   $this->subject['CONTENT'] = (string) $subj[0]; ....... (4)
   ...
  }

  return ...
 }
 else
 {
  return ...
 }
}

# spok 2008年12月20日(土) 午後10時27分

ご指摘ありがとうございます。検討させていただきます。

# tkm 2013年04月09日(火) 午後5時08分

はじめまして。
下記の件で悩んでおります。

「複数宛先の指定方法その2」の方法で宛先、CCを指定しています。
toは大丈夫なのですが、
ccは、初めの1件目しか送信されません。
(アドレスを変更しても同様です。)

なにかお気づきの点などありましたらご指摘、ご教授お願いいたします。

以下記述-----------------------------------------
$to[] = array($toAddress1,$toName1);
$to[] = array($toAddress2,$toName2);
$cc[] = array($ccAddress1,$ccName1);
$cc[] = array($ccAddress2,$ccName2);

require_once('/qdmail.php');
$mail = new Qdmail( 'UTF-8' , 'base64' );
$mail -> errorDisplay( false );
$mail -> to( $to );
$mail -> cc( $cc );
$mail -> subject($subject);
$mail -> text( $body );
$mail -> from($userAddress,$username);
$mail ->send();
-------------------------------------------------
//Qdmail ver 1.2.6b


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/08/tb/
  • 添付ファイルの指定 Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    添付ファイルのOOP的指定方法です。オブジェクトの生成や他のアドレスの指定は省略します。それらは、基本的な使い方-OOP編をみてください。Qdmailでは、いくつでもファイルを添付することが出来ます。簡単な指定方法$mail -> attach( '...
  • デコメの送り方(OOP) Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    ■デコレーションメール日本での携帯端末向けの機能です。(ver0.7.2a以降)デコメは、ここで紹介する以外に、簡単デコメ機能(easyDeco)を利用することもできます。 ひとつの宛先にデコメを送付する$mail = & new Qdmail()...