-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp-mail.html
182 lines (177 loc) · 7.86 KB
/
app-mail.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Ethnamドキュメント</title>
<link href="css/style.css" media="all" rel="stylesheet" />
<link href="css/github.css" media="all" rel="stylesheet" />
</head>
<body>
<p><a href=".">目次</a></p>
<div class="blob instapaper_body">
<article class="markdown-body entry-content">
<h1>Ethnaを使ってメールを送信する</h1>
<ul>
<li>テンプレートファイルの作成 </li>
<li>MailSenderの実行
<ul>
<li>Ethna_MailSenderを拡張する </li>
</ul></li>
<li>(1) Ethna_MailSenderをextendsしたクラスの作成 </li>
<li>(2) メールテンプレートの設置 </li>
<li>(3) 送信処理
<ul>
<li>添付ファイル </li>
<li>メール送信のトラブルシューティング </li>
</ul></li>
<li>文字化けの対応 </li>
<li>送信できない、メール本体が空になる場合(2.5.0以降) </li>
</ul>
<p>| halt | 2006-11-06 17:53 | メールを送信する最短のサンプルを追加 |
| psuke | 2006-12-07 09:53 | 最短のサンプルを修正してみました。 |
| ichii386 | 2007-01-18 | Ethna_MailSender.php,vの1.9にあわせて修正 |
| mumumu | 2009-10-18 | 「メール送信がうまくいかない場合」のセクションを追加 |</p>
<h2>Ethnaを使ってメールを送信する</h2>
<h3>テンプレートファイルの作成</h3>
<p>project_dirの/template/jaにmailフォルダを作成、そこにテンプレートを配置します。</p>
<p>テンプレートはこんな感じで書きます。</p>
<p>welcome.tpl</p>
<pre><code>From: [email protected]
Subject: 入会に成功しました。
ようこそ{$username}さん。
うんたらかんたらほげほげ。</code></pre>
<h3>MailSenderの実行</h3>
<p>テンプレートを書いたら送信したい時に</p>
<pre><code>$ethna_mail =& new Ethna_MailSender($this->backend);
$ethna_mail->send('[email protected]',
'welcome.tpl',
array('username' => $regist_user));</code></pre>
<p>とすれば送信できます。</p>
<h2>Ethna_MailSenderを拡張する</h2>
<h3>(1) Ethna_MailSenderをextendsしたクラスの作成</h3>
<p>PATH_TO_PROJECT_ROOT/lib/Sample_MailSender.php<br />
テンプレートの指定は、$defメンバに定義します。(0は使われてるので1から)</p>
<pre><code><?php
// {{{ Sample_MailSender
class Sample_MailSender extends Ethna_MailSender
{
/** @var array メールテンプレート定義 */
var $def = array(
'1' => 'user_resign' ,
'2' => 'user_register'
);
/**
* アプリケーション固有のマクロを設定する(なにか共通で使うのがあれば)
*/
function _setDefaultMacro($macro)
{
return $macro;
}
}
?></code></pre>
<p>app/Sample_Controller.php で include します。</p>
<pre><code>+ include_once('Sample_MailSender.php');</code></pre>
<h3>(2) メールテンプレートの設置</h3>
<p>テンプレートのディレクトリはデフォルトでは PATH_TO_PROJECT_ROOT/template/ja/mail になります。このディレクトリに user_resign と user_register というファイルを設置します。</p>
<p>メールのテンプレートもHTMLのテンプレートと同じ要領でアサインされた変数を使えます。(使える Smarty 変数は _setDefaultMacro とか後で Ethna_MailSender::send で引数で与えられます)普通のメールと同じように <strong>最初の空行でメールヘッダとメール本文を区別します</strong> ので、入れたいヘッダがあれば以下のように記述します。</p>
<pre><code>From: [email protected]
Subject: ユーザが退会しました
Bcc: [email protected]
X-Mailer: Ethna-{$smarty.const.ETHNA_VERSION}/Ethna_MailSender
{$username}さんが退会しました。
処理してください
-- example.com</code></pre>
<h3>(3) 送信処理</h3>
<p>ActionClassとかで</p>
<pre><code>$ethna_mail =& new Sample_MailSender($this->backend);
$ethna_mail->send('[email protected]',
'1',
array('username'=>$resign_user));</code></pre>
<p>とすれば、Smarty変数usernameに$resign_userがアサインされてメールが <a href="mailto:[email protected]">[email protected]</a> 宛に送信されます。</p>
<h2>添付ファイル</h2>
<p>send()の4つめの引数に添付ファイル(multipart)を指定することができます。</p>
<ul>
<li>
<p>アプリのtmpディレクトリにあるファイルを添付</p>
<p>$dir = $this->ctl->getDirectory('tmp');
$mail = &new Ethna_MailSender($this->backend);
$mail->send(
array('[email protected]', '[email protected]'), // 配列でも指定できます
'himitu.tpl',
null,
array(
'filename' => $dir.'/himitu.xls',
'content-type' => 'vnd/ms-excel',
)
);</p>
</li>
<li>
<p>文字列を複数のパートに添付</p>
<p>$mail = &new Ethna_MailSender($this->backend);
$mail->send(
'report/daily.tpl',
array(
'date' => date('Y/m/d'),
),
array(
array(
'name' => 'one.txt',
'content' => $report[0],
'content-type' => 'text/plain; charset=euc-jp',
),
array(
'name' => 'two.txt',
'content' => $report[1],
'content-type' => 'text/plain; charset=euc-jp',
),
array(
'name' => 'three.txt',
'content' => $report[2],
'content-type' => 'text/plain; charset=euc-jp',
),
)
);</p>
</li>
</ul>
<h2>メール送信のトラブルシューティング</h2>
<h3>文字化けの対応</h3>
<p>Ethna_MailSender は php の <a href="http://jp.php.net/manual/ja/function.mail.php">mail()</a>関数を使っています。ほかのライブラリに依存しないメリットがあるものの、 Ethna のデフォルトである euc-jp 以外で運用すると文字化けしやすいかもしれません。</p>
<p>届いたメールの subject などが文字化けする場合、次のことを確認してください。</p>
<ul>
<li>mb_language()
<ul>
<li>'Japanese' にすると直るかもしれません。</li>
</ul></li>
<li>mb_internal_encoding()
<ul>
<li>'euc-jp' にすると直るかもしれません。</li>
</ul></li>
<li>
<p>添付ファイルの 'content-type'</p>
<ul>
<li>本文をテンプレートから読み込むときは、内部エンコーディングから iso-2022-jp に自動で変換します。添付ファイルについては適切なエンコーディングを自分で指定しなければなりません。</li>
<li>上の例のように、添付を指定する配列で</li>
</ul>
<p>'content-type' => 'text/html; charset=utf-8'</p>
</li>
</ul>
<p>のようなかんじでうまいこと指定してあげてください。</p>
<h3>送信できない、メール本体が空になる場合(2.5.0以降)</h3>
<p>Ethna ではメール送信の処理に、内部で <a href="http://www.php.net/manual/ja/function.mail.php">mail() 関数</a>を使っています。ですので、使用するMTA(特にqmail等) によっては、メールに対する改行コードの扱いによって以下のような挙動をすることがあります。</p>
<ul>
<li>メール本体が空で送信される</li>
<li>Ethna_MailSender自体はエラーを吐かないのに、メールが送信されない</li>
</ul>
<p>こういった場合、[appid]-ini.php に以下の設定を行って再度メール送信を行ってみてください。この設定を行うと、mail() 関数で発生する問題の大半の原因となる 「改行コード CRLF を一律にメールに付加する動き」を回避するようになります。</p>
<p>ただし、これは最後の手段にしてください。というのも、この設定はRFCに違反する動きを強制するものだからです。</p>
<pre><code>$config = array(
// mail
'mail_func_workaround' => true,
);</code></pre> </article>
</div>
<div class="site-footer">
@2015 <a href="https://twitter.com/DQNEO">DQNEO</a>
</div>
</body>
</html>