6

電子メール サーバーから任意の電子メールを取得する必要がある PHP アプリケーションを開発しています。次に、メッセージは完全に解析され、データベースに格納されます。

もちろん、このタスクは太陽の下でさまざまなメール形式を扱うのは簡単ではないため、多くのテストを行う必要があります。そのため、特定のクライアントからさまざまな内容のメールを「収集」し始めました。

これらの電子メールをアプリケーションに自動的に送信して、メール処理をテストできるスクリプトが必要です。

したがって、生の電子メールを送信する方法が必要です。これにより、構造がそれぞれのクライアントから送信されるのとまったく同じになります。メールを .eml ファイルとして保存しています。

生の本文を提供してメールを送信する方法を知っている人はいますか?

編集: より具体的には:ソースコードを使用してマルチパートメールを送信する方法を探しています。たとえば、そのようなものを使用できるようにしたいと思います (プレーンと HTML 部分を含む電子メール、HTML 部分には 1 つのインライン添付ファイルがあります)。

 --Apple-Mail-159-396126150
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;

The plain text email!

--=20    

=20
=20

--Apple-Mail-159-396126150
Content-Type: multipart/related;
    type="text/html";
    boundary=Apple-Mail-160-396126150


--Apple-Mail-160-396126150
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
    charset=iso-8859-1

<html><head>
    <title>Daisies</title>=20
</head><body style=3D"background-attachment: initial; background-origin: =
initial; background-image: =
url(cid:4BFF075A-09D1-4118-9AE5-2DA8295BDF33/bg_pattern.jpg); =
background-position: 50% 0px; ">

[ - snip - the html email content ]


</body></html>=

--Apple-Mail-160-396126150
Content-Transfer-Encoding: base64
Content-Disposition: inline;
    filename=bg_pattern.jpg
Content-Type: image/jpg;
    x-apple-mail-type=stationery;
    name="bg_pattern.jpg"
Content-Id: <4BFF075A-09D1-4118-9AE5-2DA8295BDF33/tbg.jpg>

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAASAAA/+IFOElDQ19QUk9GSUxFAAEB
[ - snip - the image content ]
nU4IGsoTr47IczxmCMvPypi6XZOWKYz/AB42mcaD/9k=

--Apple-Mail-159-396126150--
4

5 に答える 5

0

PHPMailerを使用すると、メッセージの本文を直接設定できます。

$mail->Body = 'the contents of one of your .eml files here'

メールに MIME 添付ファイルが含まれている場合、MIME の一部をメールのヘッダーに入れる必要があるため、これは正しく機能しない可能性があります。これらの特定のヘッダーを抽出し、カスタムヘッダーとして PHPMailer メールに追加するには、.eml をマッサージする必要があります。

于 2011-02-18T17:06:58.110 に答える
0

プログラムを使用して、telnetこれらのメールを送信できます。

$ telnet <host> <port>                  // execute telnet
HELO my.domain.com                      // enter HELO command
MAIL FROM: sender@address.com           // enter MAIL FROM command
RCPT TO: recipient@address.com          // enter RCPT TO command
<past here, without adding a newline>   // enter the raw content of the message
[ctrl]+d                                // hit [ctrl] and d simultaneously to end the message

本当に PHP でこれを行いたい場合は、fsockopen()またはstream_socket_client()ファミリを使用できます。基本的に同じことを行います: メールサーバーと直接通信します。

// open connection
$stream = @stream_socket_client($host . ':' . $port);

// write HELO command
fwrite($stream, "HELO my.domain.com\r\n");

// read response
$data = '';
while (!feof($stream)) {
    $data += fgets($stream, 1024);
}

// repeat for other steps
// ...

// close connection
fclose($stream);
于 2014-05-14T21:17:18.680 に答える
0

build in PHP 関数を使用するだけmailです。bodyパーツは単なるテキストである必要はなく、混合パーツ データを含めることもできます。

これは概念実証であることを覚えておいてください。関数は、sendEmlFile「ファイルが存在するか」や「境界セットを持っているか」など、さらにチェックを使用できます。あなたが言ったように、それはテスト/開発用であり、私はそれを含めませんでした.

<?php
function sendmail($body,$subject,$to, $boundry='') {
  define ("CRLF", "\r\n");

  //basic settings
  $from = "Example mail<info@example.com>";

  //define headers
  $sHeaders  = "From: ".$from.CRLF;
  $sHeaders .= "X-Mailer: PHP/".phpversion().CRLF;
  $sHeaders .= "MIME-Version: 1.0".CRLF;


  //if you supply a boundry, it will be send with your own data
  //else it will be send as regular html email
    if (strlen($boundry)>0)
        $sHeaders .= "Content-Type: multipart/mixed; boundary=\"".$boundry."\"".CRLF;
    else
    {
      $sHeaders .= "Content-type: text/html;".CRLF."\tcharset=\"iso-8859-1\"".CRLF;
      $sHeaders .= "Content-Transfer-Encoding: 7bit".CRLF."Content-Disposition: inline";
    }

  mail($to,$subject,$body,$sHeaders);
}

function sendEmlFile($subject, $to, $filename) {
  $body = file_get_contents($filename);
  //get first line "--Apple-Mail-159-396126150"
  $boundry = $str = strtok($body, "\n");

  sendmail($body,$subject,$to, $boundry);
}
?>

アップデート:

.emlさらにテストした結果、すべてのファイルが異なることがわかりました。規格はあるかもしれませんが、エクスポートする際にはたくさんのオプションがありました.eml.emlデフォルトではOutlookを使用して保存できないため、別のツールを使用してファイルを作成する必要がありました。

メール スクリプトの例をダウンロードできます。2 つのバージョンが含まれています。

簡易版には2つのファイルがあり、1つはindex.phpファイルを送信するtest.emlファイルです。これは、質問に投稿したサンプル コードを貼り付けたファイルです。

上級版は実際.emlに作成したファイルを使ってメールを送ります。ファイル自体から必要なヘッダーを取得します。これにより、メールの一部も設定Toされることに注意してください。そのため、独自のサーバー設定に合わせて変更してください。From

高度なコードは次のように機能します。

<?php
function sendEmlFile($filename) {
    //define a clear line
    define ("CRLF", "\r\n");

    //eml content to array.
    $file = file($filename);

    //var to store the headers
    $headers = "";
    $to = "";
    $subject = "";

    //loop trough each line
    //the first part are the headers, until you reach a white line
    while(true) {
        //get the first line and remove it from the file
        $line = array_shift($file);
        if (strlen(trim($line))==0) {
            //headers are complete
            break;
        }

        //is it the To header
        if (substr(strtolower($line), 0,3)=="to:") {
            $to = trim(substr($line, 3));
            continue;
        }

        //Is it the subject header
        if (substr(strtolower($line), 0,8)=="subject:") {
            $subject = trim(substr($line, 8));
            continue;
        }

        $headers .= $line . CRLF;
    }

    //implode the remaining content into the body and trim it, incase the headers where seperated with multiple white lines
    $body = trim(implode('', $file));

    //echo content for debugging
    /*
    echo $headers;
    echo '<hr>';
    echo $to;
    echo '<hr>';
    echo $subject;
    echo '<hr>';
    echo $body;
    */

  //send the email
  mail($to,$subject,$body,$headers);
}


//initiate a test with the test file
sendEmlFile("Test.eml");
?>
于 2014-05-15T09:41:31.507 に答える