ようこそゲストさん

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

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

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

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 2009年03月21日(土) 午後3時08分

この機能を利用しようとするとaddress1にaddress2の差し出し人名でメールが届いてしまうのですが…

# naco 2009年03月22日(日) 深夜3時08分

差出人名ではなく、宛先(受取人)の表示名(日本語OK)ではないですか?
To: address2@example.com<address1@example.com>

http://hal456.net/qdmail/oopbase
上記ページにある複数宛先の指定方法で試してみてください。
その1とその2は大丈夫でした。(その3は試していません。)


※以下の書き方でも大丈夫です。(その2をまとめて書く形式)

$to = array(array('address1@example.com','表示名1'),array( 'address2@example.com','表示名2'));

$mail -> to( $to );

メールアドレスの指定方法は、easyモードと共通なのかもしれません。
http://hal456.net/qdmail/easytext_ver1

# naco 2009年03月22日(日) 深夜3時10分

管理人様
もしかしてサーバーの日付が1日ずれていないでしょうか?

P.S.
Qdmail非常に便利です。
ありがとうございます。

# yu-ri 2009年09月16日(水) 午後5時45分

大変有用なライブラリをご提供いただき、有難うございます。

早速ですが、記事において、
「一斉送信にもかかわらず、個別に送信しているようにみえる」
とありますが、同時に
「一斉配信をしても、To(宛先)1件ごとに分離し、改めてtoヘッダには、1件だけのメールアドレスを設定して送信する」
ともあります。
toSeparate機能は、結果として一斉配信をしているのか、アドレスごとに切り分けて個別配信をしているのか、どちらなのでしょうか。
個別配信ですと、サーバの関係上スパム扱いされる恐れがありますので、この機能が使えないのです。
ソースを読ませていただきましたが、PHPをいじって数ヶ月ゆえ、判断が付きませんでした。

単純なことかもしれませんが、ご教示いただければ幸いと存じます。

# sat 2010年07月14日(水) 午前10時40分

今回、Qdmailを利用させて頂いております。

メール本文の文字コードをUTF-8で一斉配信を行いたいのですが、

$mail -> toSeparate( true );

を指定すると、文字コードの指定が解除されてしまい、
デフォルトのISO-2022-JPにて送信されてしまいます。

もちろん、下記の1行は記載しております。

$mail -> charset('UTF-8', 'base64');

ご存知の方がいらっしゃいましたら、ご回答頂ければ幸いです。

# 1111 2012年03月15日(木) 午後5時15分

個人情報に関わることですので、訂正箇所を明確にご提示ください。


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/018/tb/
  • [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文字を指定しています。


#  非公開コメント   
  • TB-URL  http://hal456.net/qdmail/019/tb/
  • 日本語の折り返し処理 日々mnagaku
    ja_wordwrapメールで飛ばすコードを書いてる時、困った。メール本文は改行なしで1000bytesとか突っ込むとMTAが嫌がるらしい。70bytesぐらいが良いらしい。PHPでは、そーゆー時に使うためのword...