ようこそゲストさん

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

メッセージ欄

2008年4月の日記

使い方 CakePHPでのメール送信

QdmailはCakePHPのコンポーネントとしても動作します(バージョン0.7.6.a以降)。
自分自身でCakePHP内から呼ばれているのか、通常のPHPアプリケーションから呼ばれているのか判別しますので、ユーザーはファイルを使い分けたりする必要はありません。
2008-10-01追記
下記、サイトにてスマートなCakePHPでのQdmailの使い方を紹介していただいております。ぜひご参照下さい。
cakePHP メール送信はもうこれでいいでしょ -LoveIT - 安江ブログ

使い方(初期設定)

通常のCakePHPコンポーネントと同じです。
次のディレクトリに qdmail.php ファイルをコピーしてください。
app/controllers/components/
使用したいコントローラーで、以下のプロパティの宣言を行ってください。
var $components=array( "Qdmail" );

具体的なメール送信の方法

コントローラーのアクションで、次のように記述します。
$this->Qdmail->to( 'address@example.com' , '日本語名' );
$this->Qdmail->subject('Qdmail on CakePHP メールのテスト');
$this->Qdmail->from('from@example.com' , '配信元日本語名' );
$this->Qdmail -> text( '本文をここにかきます' );
$this->Qdmail -> send();
宛先などの指定は、Qdmail通常の使い方と同じです。
通常の使い方で例として挙げている「$mail->」を「$this->Qdmail」と置き換えて読んでくだ
さい。
CakePHPをお使いの方であれば、easyよりも、通常のオブジェクト指向型でパラメータを指定したほうがやりやすいと思います。

CakePHPのビューを使用する方法

CakePHP用に、2つの特別なメソッドを用意しました。
$this->Qdmail -> cakeText( '本文(テキスト)' );
or
$this->Qdmail -> cakeHtml( '本文(HTML)' );
見て直感的におわかりのように、通常のテキストの場合は、cakeText,HTMLメールの場合は、cakeHtmlメソッドを使います。

ビューの指定の方法

textもhtmlも同じ書式なので、textをもとに説明します。
$this->Qdmail -> cakeText( '本文' ,'エレメント名','レイアウト名');
フルスペック
cakeText( $content , $template  , $layout  , $org_charset , $target_charset, $enc , $wordwrap_length )

第1引数から、本文、テンプレート名、レイアウト名、テンプレートの文字コード(省略可、またはnull),送信時の文字コード(省略可、またはnull)、本文のエンコード形式(7bit,base64等)、ワードラップの文字数(マルチバイト換算)

※エレメント名とレイアウト名は省略可能です。その場合は「default」を指定したことになります。

上記のように書くと次のような感じになります。
'本文'エレメントの中で、
$content変数として使用可能
エレメントからの出力レイアウトの中で、
$content_for_layout変数として使用可能
cakeview.jpg

エレメントとレイアウトのディレクトリ

エレメントの既定のディレクトリ
app/views/elements/email/text/
app/views/elements/email/html/
レイアウトの既定のディレクトリ
app/views/layouts/email/text/
app/views/layouts/email/html/

# spok 『CakePHPはShellの場合、コンポーネントを使えないと認識しております。 他のコンポーネントは使えますか? 参考:http...』 (2009/01/29 7:37)

# にょろ 『申し訳ありません、すばやい御返答ありがとうございました。 えぇぇぇ゛~~(゜-゜) そ・・・そうだったのですか・・・(´Д⊂ 他...』 (2009/01/29 10:54)

# coco 『CakePHPのコンポーネントとして利用させてもらっています。 HTMLメールを試してみようと思い、 $this->Qdmai...』 (2009/02/15 26:54)

# tomotomo 『大変便利で重宝しています。ありがとうございます。 一点、気になったことがあったのでコメントさせていただきます。 $this->...』 (2009/08/03 9:42)

# junsei 『Coolなライブラリありがとうございます! CakePHPのコンポーネントとして使わせて頂いてます。 cakeText(cak...』 (2009/08/07 11:41)

# アルガー 『cakeTextでViewを指定する際、renderElementメソッドがないといわれますが、 CakePHP1.3からren...』 (2010/12/06 13:14)

# coban 『> tomotomoさん 僕も同じ現象です。 $this->Qdmail->content['TEXT'] = ""; にすれ...』 (2011/01/31 24:44)

# sai 『コンポーネントとして活用させていただいております。 cakephpにてqdmailをコンポーネントとして使用しているのですが、...』 (2012/04/20 15:19)

CakePHPメールコンポーネントとして送信する

概要

Qdmailは、バージョン0.7.6a(アルファ)から、CakePHPのコンポーネントとしても、動作するようになりました。

CakePHPコンポーネントとしての動作のさせ方は、ver0,ver1共通です。

Semailよりも高機能になりました。
CakePHPのテンプレート、ビュー機能を利用することができます。
TEXTメールはもちろん、添付ファイル、HTMLメール、デコメもCakePHPから簡単に送信できます。

使い方:
CakePHPでの使い方
CakePHPでのSMTP送信

関連記事:
CakePHPコントローラーをメール受信をきっかけに起動する
さくらインターネットでリアルタイムメール処理

特徴

  • CakePHP1.1 , 1.2 の両方に対応
  • 同じファイルで、通常の使い方もOK,CakePHPもOK(自動判別)
  • CakePHPの強力なrender機能を使用可能

ライセンス

CakePHPと同じMITライセンスです。かなり自由に使えると思います。
詳しくはダウンロードページをご覧下さい。

記事リスト

# sandman 『QdmailをCake1.2RC1で使用しています。 基本的には、とても満足していますが、cakeText()とcakeHtml...』 (2008/06/26 18:58)

# spok 『sandmanさん ご面倒をおかけします。 こちらでは再現しませんので、下記の情報をお教え下さい。 ■PHPのバージョン ■Q...』 (2008/06/26 26:00)

# sandman 『spokさん 素早くて丁寧なお返事ありがとうございます。 下記のサーバでエラーが出ました。 ■PHPのバージョン サー...』 (2008/06/27 16:08)

# spok 『sandmanさん お手数をおかけします。。。。 >pr($this->Controller) のダンプは表示されます。 である...』 (2008/06/27 17:46)

# 赤石 『sandmanさん spokは自分のブログに技術的記事を無断転載しまくるので気をつけて下さい 』 (2008/06/27 19:27)

# sandman 『spok さん こんばんは。お世話になってます。 > $this->Qdmail->to($to[0], $to[1]); >...』 (2008/06/27 22:32)

# spok 『sandmanさん 解決してよかったです。原因はわかりませんが。。。。 なお、Return-Path ですが、現在、$mai...』 (2008/06/28 15:44)

# spok 『$mail->addHeader()のバグを修正しました。0.8.9a以降へのアップグレードをお願いいたします。』 (2008/06/28 16:17)

# tommyt 『とても簡単で助かっています。 cakePHP1.1で使いたいのですが、データベース連動が上手くできないので教えていただけないでし...』 (2009/01/16 16:52)

# spok 『Toヘッダの指定方法は以下のとおりです。 http://hal456.net/qdmail/oopbase 』 (2009/01/16 25:23)

# tommyt 『すぐの対応ありがとうございます。 データ構造が違うということだと解釈し、findAll()のあと、モデル名のない配列に直し$th...』 (2009/01/19 16:19)

# coco 『CakePHP 1.2.1.8004 Stableで使っています。 $this->Qdmail->errorDisplay(f...』 (2009/02/18 16:41)

# t-sato 『私もcakeText()を使用した際、同じ内容のエラーが発生しました。 Notice (8): Undefined prope...』 (2009/03/03 12:56)

# アルガー 『Undefined property: Controllerとなる件、startup()が XxxControllerから自作の...』 (2010/12/06 13:02)

# iizuka 『お世話になります。飯塚と申します。QDmail出た時から使わせていただいています。CakePHPのコンポーネントとして利用したと...』 (2012/01/13 17:00)

# jetbee 『同じく cakephp 2系の2.0.5で Allowed memory size エラーになりました。 ちょっと見てみたのです...』 (2012/02/07 17:42)

個別アドレス分離機能(一斉送信時)

個別アドレス分離機能(一斉送信時)

to,cc,bccに複数のアドレスを設定し、一斉配信をしても、To(宛先)1件ごとに分離し、改めてtoヘッダには、1件だけのメールアドレスを設定して送信する機能です。

$mail = & new Qdmail() ; *1

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

$mail -> to( $to );

$mail -> subject( '個別アドレス分離機能テスト' );
$mail -> from('from@example.com','配信元表記');

$mail ->text( 'このメールは1通ずつ配信されています' );

$mail -> toSeparate( true );

$mail ->send();
通常であれば、toヘッダに複数人のヘッダーが表示されてしまいますが、このtoSeparate(個別アドレス分離)機能を使用すると、一斉送信にもかかわらず、個別に送信しているようにみえるのです。

一斉送信時に他のアドレスが見えないようにするには、bccを使用する手段もありますが、その場合、別途toヘッダの指定が必要になってしまいます。このtoSeparate機能は、そうしたわずらわしさをなくすことができます。

また、シンプルテンプレート(差し込み送信)機能と組み合わせると、宛先に応じてメッセージ内容を変更することも可能になります。

注意

個別アドレス分離機能をONにした場合、cc,bccにセットしたメールアドレスは無視されます。

*1 : PHP5の場合は、newの前の&は必要ありません。

# sage 『この機能を利用しようとするとaddress1にaddress2の差し出し人名でメールが届いてしまうのですが…』 (2009/03/21 15:08)

# naco 『差出人名ではなく、宛先(受取人)の表示名(日本語OK)ではないですか? To: address2@example.com<add...』 (2009/03/22 27:08)

# naco 『管理人様 もしかしてサーバーの日付が1日ずれていないでしょうか? P.S. Qdmail非常に便利です。 ありがとうございます...』 (2009/03/22 27:10)

# yu-ri 『大変有用なライブラリをご提供いただき、有難うございます。 早速ですが、記事において、 「一斉送信にもかかわらず、個別に送信して...』 (2009/09/16 17:45)

# sat 『今回、Qdmailを利用させて頂いております。 メール本文の文字コードをUTF-8で一斉配信を行いたいのですが、 $mail...』 (2010/07/14 10:40)

# 1111 『個人情報に関わることですので、訂正箇所を明確にご提示ください。』 (2012/03/15 17:15)

  • [CakePHP] Qdmail でメールの一斉送信 Sun Limited Mt.
    CakePHP のコンポーネントの Qdmail はメールを送るのに非常に便利なコンポーネントです。この Qdmail を使用してメールを一斉送信する方法です。本家の方に複数の宛先宛に個別にメールを送る方法が紹介されています。個別アドレス分離機能(一斉送信...

インテリジェント・ワードラップ

インテリジェント・ワードラップとは?

ワードラップとは、折り返し処理のことです。
1行の文字数が長くなると、Qdmailは自動的に改行コードを挿入します。
(デフォルトでは、全角45文字幅)

Qdmailのバージョン0系では、デフォルトで ON
バージョン1系では、デフォルトは OFF となっています。ご注意ください。

Qdmailはワードラップ処理として、主に3つの機能を持っています。
  • 特定行の折り返し禁止設定
    (http等の特定の文字列を含む列を自動判別し、その行は折り返さない機能)
  • 禁則処理(行頭、行末)
    句読点や括弧など、行頭や行末にふさわしくない文字の例外処理。
  • 「文字列の幅」での折り返し
    文字数でなく、全角1、半角0.5と計算して、幅を同じにする機能。

それぞれの機能はデフォルトでONですが、OFFにすることもできます。

Qdmailが改行しなくても、送信サーバーが強制的に改行することがある。

SMTPプロトコルは、1行1024文字と定められており、sendmail等のメール送信サーバーのデフォルト設定は、1024文字で強制的に改行が入ることが多いです。それは、Qdmailでは回避不可能なので、ユーザーにて適切に改行して送信するか、Qdmailのインテリジェントワードラップをお使いください。


特定行の折り返し禁止設定

デフォルトでは以下の文字列の行については、ワードラップをしない設定となっています。
http://を含む行
codeで始まる行
この機能がないと、長いURLやID番号などを記載する場合に、意図しない部分で改行コードが入ってしまいます。
http://example.com/hogehoge/user/hoge/?id=12345678&hash=ek53k8eHhi5kQxJ53LO(改行)
pejDrQC85KdeqpldgghjkRtyrwuy
このように、メールを受け取ったユーザーがURLをクリックしても思い通りのパラメータを送ることができません。
しかし、インテリジェント・ワードラップでは、
http://example.com/hogehoge/user/hoge/?id=12345678&hash=ek53k8eHhi5kQxJ53LOpejDrQC85KdeqpldgghjkRtyrwuy
となり、httpを含む行は折り返し処理を行いません。

「code」で始まる行も同じです。

これらの折り返し除外ワード(http,code)は、変更することができます。

書式
  $mail -> wrapExcept( array(
     '除外ワード'  => 行頭フラグ,
    ・・・・・
  ) );
行頭フラグが、true であれば、「行頭で始まる」場合にワードラップ除外となります。falseであれば「文字列中に含む」場合にワードラップ除外となります。

デフォルトの設定は以下のとおりです。ver0.7.0a
array(  'http://'  =>  false  ,  'code'  =>  true )
大文字と小文字は区別されますので、ご注意下さい。

このルールを無効にしたい場合は、次のように設定してください。
$mail -> wrapExcept( array() );

禁則処理

句読点や括弧など、行頭や行末にふさわしくない文字の例外処理を行います。
どの記号や文字を例外処理をするかどうかは、設定で変更することができます。
デフォルトの設定は以下の通りです。
$mail -> wrapProhibitTop('禁則文字');
行末の禁則文字の設定は、TopをEndに変えて下さい。

初期設定は次の通りです。
行頭
,.;:–?!‼、。.))]}}〕〉》」』】〙〗〟’”»ヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎ‐〜?!

行末
(([{{〔〈《「『【〘〖‘“« 
禁則処理そのものをしない場合は以下の設定をしてください。
$mail -> wrapProhibitAllow( false );

文字列の幅でのワードラップ(折り返し)

通常、ワードラップとは、長い1行の文字列を一定の文字数で区切って、無理矢理改行をする機能です。
ワードラップを行う理由は2つあります。
  1. インターネットメールでの文字数制限(半角75文字以内推奨、1,000文字以内絶対)
  2. 読みやすさの向上
しかし、マルチバイトの場合、一定の文字数だと不都合な場合があります。
それは、半角と全角が混ざった場合です。
また日本語以外でも、アルファベットに比べて文字の幅が違うものもあるかと思います。

例えば、全角45文字でワードラップすると以下のようになります。
wrapWidthOff2.jpg

見た目が不揃いですね。
半角も1文字、全角も1文字と数えるため、このようなブサイクな格好になります。

そこで、Qdmailでは、「文字列の幅」でワードラップします*1
wrapWidthOn2.jpg

全角2,半角1の割合で計算しています。
日本語以外の場合でこの割合は、変更したいときは、簡単に変更することができます。

QdmailはデフォルトでインテリジェントON、即ち、「文字列の幅」(半角は0.5文字)となっています。インテリジェントワードラップをOFF,即ち「文字の数」で折り返したい場合は、以下のように指定してください。
$mail -> wrapWidth( false ); *2

折り返し幅の変更

文字列の幅数(文字数)を変更したいときは、以下のように指定してください。
数は、全角文字(マルチバイト)の文字数で指定してください。
デフォルトは45文字です。
$mail -> wordwrapLength( 30 ); *3

ワードラップの無効化

全体的にワードラップそのものをしたくない場合は以下のように指定してください。
$mail -> wordwrapAllow( false );
半角と全角の比率を 1:n にしたい場合は、以下のように指定してください。
ただし、Qdmailでは、mb_strwidth()関数を使っていますので、この関数の数え方と整合性のある数値でないと正しく動作しません。これを変更するのは、かなり特殊な状況かと思います。
$mail -> mbStrwidthMagni( n );
n:は数値。

*1 : デフォルトで全角45文字分の幅

*2 : $mail -> & new Qdmail();は省略して例を記載しています。

*3 : この例は、全角30文字を指定しています。

  • 日本語の折り返し処理 日々mnagaku
    ja_wordwrapメールで飛ばすコードを書いてる時、困った。メール本文は改行なしで1000bytesとか突っ込むとMTAが嫌がるらしい。70bytesぐらいが良いらしい。PHPでは、そーゆー時に使うためのword...

簡単モード(EasyMode)

簡単モードとは

Qdmailは、PHP4,PHP5の両方に対応したクラスライブラリであり、基本的にオブジェクト指向*1的な使い方をします。
(オブジェクト指向についてわかっている方はOOP型の基本形での利用をお薦めします。)
一方で、PHPを使っている方の中には、オブジェクトって何?という方もいらっしゃるかと思います。そのような方のために、Qdmailでは簡単モードを搭載、easy~という関数名*2で利用できます。

特徴

全くオブジェクト指向型を抜きにしての指定はできませんが、オブジェクト指向独特の「->」演算子をなるべく使わずに、通常の関数のように使うのが特徴です。
一方で、e-mailは設定項目が多いので、関数の引数の数は多くなり、場合によっては多次元配列を使わなくてはならない場合もあります。


目次

  • easyText
    簡単テキストメール - 文字化けなしのテキストメールの送付。添付ファイル日本語名も簡単。
  • easyHtml
    簡単HTMLメール - easyTextのHTMLメール版。自動代替テキスト生成機能付き。
  • easyReplace
    簡単テンプレート - 名前、メールアドレスの他、送付先に適合したメッセージやIDを送る機能
  • easyDeco
    簡単デコメール - 日本の携帯端末向けデコレーションメールの送付
  • easyDecoRep
    簡単デコメール+簡単テンプレート

*1 : OOP-Object Oriented Program

*2 : 正しくはメソッド名

  • easyモード-テキストメール Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    ここはバージョン1系のeasyモードの解説です。バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。■単純なテキストメール推奨文字コードQdmailは、ソースコードや渡された文字コードを自動的に判別し、もっとも文字化けの少ない...
  • easy型の使い方(ver1系) Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    バージョン0系と1系では、easyモードの使い方が異なります。バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。easyモードの使い方(バージョン1系)easyモードは、オブジェクト指向型でなるべく簡単に、様々なメールを送信...
  • htmlメール Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    ここはバージョン1系のeasyモードの解説です。バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。■メールアドレスの指定の基本 メールアドレスだけの場合'address@example.com' 表示名もつける場合array...
  • デコメール Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte spok
    ここはバージョン1系のeasyモードの解説です。バージョン0系については、バージョン0系のeasyモードの使い方をご参照ください。ここでは、日本の携帯端末特有のデコメの送り方について説明します。前提として、テキストメールとHTMLメールの送り方は、知ってお...