「Web サイトから送信された契約書を持っています。フォームから送信されたメールに添付ファイルを追加するにはどうすればよいですか?」という質問をよく聞きます。
まず最初に言っておきますが、これを行うのは簡単なことではありません。方法。
PHP またはその他のサーバーサイド スクリプト言語について十分に理解している必要があります。
もちろん、実際に PHP をサポートする Web サイトのアカウントも必要です。
この前提条件を満たしている場合は、この章を読んだ後に PHP を使用して添付ファイル付きの電子メールを送信できます。
1. 添付ファイルの仕組み
PHP マニュアルで「添付ファイル」関数を検索したことがある場合、結果は何も表示されないかもしれません (少なくともこの記事を書いている時点ではまだ)。
この知識を理解するには、後で多くの時間を費やす必要があります。
添付ファイル付きの電子メールを誰かに送信すると、その添付ファイルは電子メールと一緒に受信者のメールボックスに置かれると思うかもしれません (たとえば、PNG 画像ファイルを送信すると、受信者のメールボックスにはtxt ファイル (電子メール) と .png ファイル (添付ファイル) ですが、それは機能しません
添付ファイルを追加すると、電子メール プログラムは添付ファイルをプレーン テキスト ファイルに変換し、このテキスト ブロックを入力したファイルの後に挿入します。このようにして、すべてを送信すると、受信者のメールボックスには、添付ファイルと実際のメールの内容を含むファイルが 1 つだけ存在します。添付ファイル付きの電子メールの例 (HTML ファイル)
Return-Path: Date: Mon, 22 May 2000 19:17:29 +0000 From: Someone: person Message-id: <83729KI93LI9214@example.com> ; コンテンツ タイプ: multipart/mixed; border="396d983d6b89a" 件名: これが件名です --396d983d6b89a コンテンツ タイプ: text/plain; コンテンツ転送エンコーディング: 8bit --396d983d6b89a Content-type: text/html; name=attachment.html Content-disposition: inline; filename=attachment.html Content-transfer-encoding: 8bit これは添付された HTML ファイルです --396d983d6b89a--最初の 7 行は電子メールのヘッダーであり、Content-type ヘッダー部分によって、電子メールが複数の部分で構成されていることがメール プログラムに通知されることに注意してください。 . 添付ファイル付きのメールは、通常、メッセージと添付ファイルの 2 つの部分で構成されます。このように、2 つの添付ファイルのあるメールは、メッセージ、1 つ目の添付ファイル、2 つ目の添付ファイルで構成されます。
添付ファイルのあるメールのさまざまな部分は分割線で区切られます。 境界線は 2 つのハイフン (--) で始まる Content--type ヘッダーで定義されます。 最後の分割線の後にも 2 つのハイフンがあり、電子メールに他の部分がないことを示しています。 各分割線の後には、この部分のコンテンツの種類をメール プログラムに伝える行がいくつかあります。 たとえば、上の例の最初の分割線の後の 2 行、つまり Content-type: text/plain で始まる行に注目してください。 これらの行は、次の部分が ISO-8859-1 文字セットのプレーン テキストであることを示します。 2 番目の分割線に続く行は、現在の部分が HTML ファイルであり、その名前が「attachment.html」であることをメール プログラムに伝えます。 Content-disposition は、可能であれば添付ファイルをインラインで表示するように電子メール プログラムに指示します。 これで、新しいメール プログラムはメッセージの後に HTML コンテンツを表示します。 Content-disposition が添付ファイルに設定されている場合、メール プログラムは HTML ファイルのコンテンツを表示しませんが、ファイルに接続されたアイコン (または類似のもの) を表示します。 添付ファイルの内容を表示するには、受信者はこのアイコンをクリックする必要があります。通常の状況では、添付ファイルがテキスト (HTML を含む) の場合、Content-disposition はインラインに設定されます。これは、ほとんどの電子メール プログラムが他のブラウザを使用せずに添付ファイル (テキスト) のコンテンツを直接表示できるためです。添付ファイルがテキスト (画像やその他の同様のコンテンツなど) ではない場合、Content-disposition は添付ファイルに設定されます。 2. PHP を使用して添付ファイル付きの電子メールを生成します ここでは、定義された HTML ファイルを添付ファイルとして電子メールに追加する方法を示す例を示します: # 最初に実際のメッセージの内容を書き込みます $emailBody = "これは、は電子メールの本文に入ります。"; # 次に、添付ファイルとして添付する HTML ファイル $attachment = " これは添付された HTML ファイルです "; # 電子メールのさまざまな部分を区切る分割線を作成します。 # 基本的に分割線は任意の文字列で構いません。 # ただし、重要な点はメールを書いた人を特定することです。 # これはランダムな文字列を書き込むため、 # uniqid 関数を使用してランダムな文字列を生成します。 $boundary = uniqid( ""); # 次に、電子メール ヘッダーを作成する必要があります。このメールに 1 つ以上の添付ファイルが含まれていることを示す # Content-type ヘッダーを忘れずに挿入してください。 $headers = "From:someone@example.com Content-type:multipart/mixed;boundary="$boundary""; # OK、これでメールの内容がすべて揃いました。 # 次に、メールの本文を変更します。 $emailBody = "--$boundary コンテンツ タイプ: text/plain; charset=iso-8859-1 コンテンツ転送エンコーディング: 8 ビット $emailBody --$boundary コンテンツ タイプ: text/html; name=attachment.html コンテンツ-disposition: inline; filename=attachment.html Content-transfer-encoding: 8bit $attachment --$boundary--"; # これでメールを送信できるようになります mail( "person@eksempel.dk", "The subject", $ emailBody, $headers);
3. ユーザーがアップロードしたファイルを添付ファイルとして添付します
上記の例は理解しにくいかもしれませんが、以下は...以下の例では、フォームを使用してユーザーにファイルをアップロードさせ、送信する電子メールにそのファイルを添付しているため、状況はさらに困難になります。問題は、ファイルの MIME タイプが事前にわからないことです。
前の例では、それが HTML ファイルであることがすでにわかっているため、この添付ファイルの Content-type ヘッダーの設定は非常に簡単です。以下の例では、ユーザーが HTML ファイル、PNG ファイル、vCard ファイルなどをアップロードする可能性があるため、MIME タイプは任意である可能性があります。
例を見てみましょう: # 次に、フォームを生成しましょう。ファイルをアップロードできるフォームを生成する際、 # を忘れずに # ユーザーが「送信」ボタンを押した場合」 if ($send) { # 分割線を定義 $boundary = uniqid( ""); # 生成電子メールヘッダー $headers = "From: $from Content-type: multipart/mixed; border="$boundary""; # アップロードされたファイルの MIME タイプを決定する if ($attachment_type) $mimeType = $attachment_type; #ファイルの MIME タイプを指定しません。 # 「application/unknown」に設定できます。 $mimeType = "application/unknown"; # ファイルの名前を決定します $fileName = $attachment_name; fp = fopen($attachment, "r") ; #ファイル全体を変数に読み込みます $read = fread($fp, filesize($attachment)); #わかりました、変数 $read には内容を含むテキスト ブロックが保持されます#このテキストを使用して、メール プログラムが読み取れる形式に変換します。 #base64 メソッドを使用してエンコードします。 #read =base64_encode($read); Base64 メソッドを使用してエンコードされます
# 次に行うことは、この長い文字列を 1 行あたり 76 文字で構成される小さなチャンクに分割することです $read = chunk_split($read); # これでメールの本文を作成できます $body = "--$boundary コンテンツ タイプ: text/plain; charset=iso-8859-1 コンテンツ転送エンコーディング: 8 ビット $body --$boundary コンテンツ タイプ: $mimeType; name=$fileName コンテンツの配置: 添付ファイル; filename=$fileName Content-transfer-encoding:base64 $read --$boundary--"; # メール送信 mail($to, $subject, $body, $headers); } ?>
以上です。上記の例がよく理解できない場合は、添付ファイル付きの電子メールを何通か自分に送信し、その電子メールのソース コードを注意深く調べることをお勧めします。