Django オンラインドキュメント和訳 更新しました。 Revision 5583 (2007/07/02). 「ドキュメントの形式」「EmailMessageクラス」「拡張コンテンツ形式のメールを送信する」「フィールドの照合 - regex, iregex」「フィールドのオプション - db_tablespace」についての記述が更新されています。
以下、 diff -r 5519:5583 の主な変更分です。
私達は,ドキュメントの一貫性と読みやすさをとても重視しています (なんといっ ても, Django はジャーナリズムの中で生まれましたからね!)
私達は、 ReST ドキュメントを作成するときに、以下のガイドラインに従っていま す:
- 章や節の題名では、最初の文字と適切な名前のみ大文字で書きます.
- ドキュメントは幅 80 文字以内で折り返します.ただし,コード例を示す際に 複数行に分けると著しく読みにくくなる場合や,その他妥当な理由がある場合 は例外です.
ドキュメント中でよく使われる用語の書き方を以下に示します:
- Django -- フレームワークそのものを指す場合には,頭文字を大文字にし ます. Python コード中や djangoproject.com のロゴでは小文字です.
- e-mail -- ハイフンを入れます.(和訳では「メール」と書いています)
- MySQL
- PostgreSQL
- Python -- 言語そのものを指す場合には頭文字を大文字にします.
- realize, customize, initialize, etc. -- "-ise" ではなく,ア メリカ語表記です.
- SQLite
- subclass -- 動詞,名詞を問わず,ハイフンを入れず一つの単語で表しま す.
- Web, World Wide Web, the Web -- ワールドワイドウェブを指す 場合には,常に Web の W は大文字です.
- Web site -- Web を大文字にして,二つの単語を繋げません.
- model -- 頭文字は小文字です.
- template -- 頭文字は小文字です.
- URLconf -- "URL" は大文字, "conf" は小文字です.
- view -- 頭文字は小文字です.
send_mail() をはじめとしたラッパ関数から利用できる機能は, EmailMessage クラスで提供している全ての機能をカバーしているわけでは ありません.BCC への宛先を指定やファイルの添付,マルチパート形式メール の送信を行いたい場合には, EmailMessage インスタンスを直接生成する 必要があります.
send_mail() がこのようないささかややこしい仕様なのは,設計上の事情 によるものです. send_mail() などの関数はもともと単なる Django 向け の単純なメールインタフェースでしかありませんでした.その後, send_mail() に指定できるパラメタが少しづつふえてきたのです.今となっ ては,メールメッセージを扱うためのよりオブジェクト指向の設計に移行して, send_mail() は互換性のためだけにおいておく方が有意義でしょう.
EmailMessage クラスは以下のパラメタ (固定引数を使う場合には以下に示す順 番に指定します) で初期化します.パラメタは全て省略可能で, send() メソッ ドを呼び出す前であればいつでも設定しなおせます.
- subject: メールの題名です.
- body: メール本文です.平文テキストのメッセージでなければなりませ ん.
- from_email: 送信者のアドレスです. fred@example.com 形式でも Fred <fred@example.com> 形式でもかまいません.省略すると, DEFAULT_FROM_EMAIL の設定値を使います.
- to: 受信者アドレスのリストまたはタプルです.
- bcc: メールを送信する際に "Bcc" ヘッダに指定するアドレスのリスト またはタプルです.
- connection: SMTPConnection のインスタンスです.一つの SMTP 接 続を使い回して複数のメッセージを送信したい場合に指定します.省略する と, send() を呼び出す瞬間に新しい接続を生成します.
- attachments: メールに添付するデータのリストです.リストの各要素は, email.MIMEBase.MIMEBase のインスタンスか, (filename, content, mimetype) からなるタプルです.
- headers: メッセージに追加するヘッダの辞書です.ヘッダ名をキーに, ヘッダ値を値にします.このパラメタを使うのなら,指定したヘッダがメー ルメッセージ中で正しいヘッダとして扱われるように気をつけねばなりませ ん.
例を示します
email = EmailMessage('Hello', 'Body goes here', 'from@example.com',
['to1@example.com', 'to2@example.com'], ['bcc@example.com'],
headers = {'Reply-To': 'another@example.com'})
EmailMessage クラスのインスタンスには以下のようなメソッドがあります:
message() は django.core.mail.SafeMIMEText クラス (Python の email.MIMEText.MIMEText クラスのサブクラス) または ``django.core.mail.SafeMIMEMultipart`` クラスのインスタンスを生成します. このオブジェクトには送信するメッセージが入っています. EmailMessage クラスを拡張する必要がある場合,おそらくこのメソッドを オーバライドして,所望の内容を MIME オブジェクト内に配置することになるで しょう.
attach() を呼び出すと,新たなファイル添付用パートを生成してメッセー ジに追加します. attach() の呼び出しかたは 2 通りあります:
attach() に引数を一つだけ指定し, email.MIMBase.MIMEBase のインスタンスを渡します.このインスタンスの内容は最終的なメッセージ に直接挿入されます.
別の方法として, attach() に 3 つの引数, filename, content および mimetype を渡します. filename は添付する ファイルの名前で,これはメール中で表示される添付ファイルの名前になり ます. content は添付パート中に入るデータで, mimetype は添 付内容の MIME タイプです. mimetype を省略すると,ファイル名を元 に推測を行います.
例を示します
message.attach('design.png', img_data, 'image/png')attach_file() を呼び出すと,ファイルシステム上のファイルから添付パー トを生成します. attach_file() の引数には添付したいファイルのパスを 指定します.オプションとして,添付ファイルの MIME タイプも指定できます. MIME タイプを省略すると,ファイル名をもとに推測を行います.簡単な使い方 を示すと,以下のようになります
message.attach_file('/images/weather_map.png')
メールの内容をいくつかのバージョンに分けて送信すると便利な場合があります. 古典的な例でいえば,テキスト形式と HTML 形式の両方でメールを送信するような 場合です. 複数バージョンのメールを同時に送るには, EmailMultiAlternatives クラス を使います.このクラスは EmailMessage のサブクラスで, attach_alternative() メソッドを使ってメールのメッセージ本文に別のバージョ ンの本文を追加できます. attach_alternative() 以外は,(クラスをインスタ ンス化するときの初期化メソッドも含めて) EmailMessage と全く同じです.
テキストと HTML を組み合わせて送信したければ,以下のように書けます
from django.core.mail import EmailMultiAlternatives
subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.'
msg = EmailMultiAlternatives(subject, text_content, from_email, to)
msg.attach_alternative(html_content, "text/html")
msg.send()
デフォルトでは, EmailMessage の body パラメタの MIME タイプは "text/plain" です.実践的には,このパラメタは変更せずにおいた方がよいで しょう.なぜなら,メールを受信した人が使っているメールクライアントソフトに 関係なくメッセージを読めるよう保証できるからです.とはいえ,メールの読み手 が拡張コンテンツ形式 (alternative content type) のメッセージを扱えると分かっ ている場合には, EmailMessage の content_subtype 属性を使って,主メッ セージのコンテンツタイプを変更できます.メールのメジャーコンテンツタイプは 常に "text" ですが,サブタイプは以下のように変更できます
msg = EmailMessage(subject, html_content, from_email, to)
msg.content_subtype = "html" # Main content is now text/html
msg.send()
開発版の Django で新たに追加された機能です
正規表現による大小文字を区別した検索を行います.
正規表現の構文は各データベースバックエンドで使われているものと同じです. 正規表現による照合をサポートしない sqlite バックエンドの場合に,Python の re モジュールと同じ構文を使います.
使い方の例を示します
Entry.objects.get(title__regex=r'^(An?|The) +')
同じ意味の SQL 文は以下のようになります:
SELECT ... WHERE title REGEXP BINARY '^(An?|The) +'; -- MySQL SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'c'); -- Oracle SELECT ... WHERE title ~ '^(An?|The) +'; -- PostgreSQL SELECT ... WHERE title REGEXP '^(An?|The) +'; -- SQLite
正規表現を指定する場合には raw 文字列を使う ('foo' でなく r'foo' を 使う)よう勧めます.
正規表現によるマッチングは ado_mssql バックエンドではサポートされていま せん. ado_mssql で regex を使おうとすると NotImplementedError を送出します.
開発版の Django で新たに追加された機能です
正規表現による大小文字を区別しない検索を行います.
使い方の例を示します
Entry.objects.get(title__iregex=r'^(an?|the) +')
同じ意味の SQL 文は以下のようになります:
SELECT ... WHERE title REGEXP '^(an?|the) +'; -- MySQL SELECT ... WHERE REGEXP_LIKE(title, '^(an?|the) +', 'i'); -- Oracle SELECT ... WHERE title ~* '^(an?|the) +'; -- PostgreSQL SELECT ... WHERE title REGEXP '(?i)^(an?|the) +'; -- SQLite
開発版の Django で新たに追加された機能です
このフィールドをインデクス化する際に,データベースのテーブルスペース上での フィールドのインデクスの名前に使います.デフォルトの値は,モデルの db_tablespace です.テーブルスペースをサポートしていないバックエンドで は,このオプションは無視されます.
