Отправить почту из необработанного тела в целях тестирования - PullRequest
6 голосов
/ 18 февраля 2011

Я занимаюсь разработкой приложения PHP, которое должно извлекать произвольные электронные письма с почтового сервера. Затем сообщение полностью анализируется и сохраняется в базе данных.

Конечно, мне нужно сделать много тестов, так как эта задача на самом деле не тривиальна со всеми различными форматами почты под солнцем. Поэтому я начал «собирать» электронные письма от определенных клиентов и с разным содержанием.

Я хотел бы иметь сценарий, чтобы я мог автоматически отправлять эти электронные письма в свое приложение для проверки обработки почты.

Поэтому мне нужен способ отправки необработанных электронных писем - чтобы структура была точно такой же, как они поступили бы от соответствующего клиента. Я храню электронные письма в виде файлов .eml.

Кто-нибудь знает, как отправлять электронные письма, предоставляя необработанное тело?

Edit: Чтобы быть более конкретным: я ищу способ рассылки составных писем с использованием их исходного кода. Например, я хотел бы иметь возможность использовать что-то подобное (электронное письмо с простой и HTML-частью, HTML-часть имеет одно встроенное вложение).

 --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--

Ответы [ 5 ]

0 голосов
/ 21 мая 2014

Просто создайте быстрый сценарий оболочки, который обрабатывает каталог и вызывает его, когда вы хотите, например, используя at crontab и т. Д.

для I в ls /mydir/ do cat I | awk .. | sendmail -options

http://www.manpagez.com/man/1/awk/

Вы также можете просто поговорить с почтовым сервером, используя скрипт для отправки emls с шаблонным телом ..

0 голосов
/ 21 мая 2014

Вы можете начать здесь

http://www.dreamincode.net/forums/topic/36108-send-emails-using-php-smtp-direct/

Я понятия не имею, насколько хорош этот код, но он станет отправной точкой.

То, что вы делаете, - это подключение напрямую к порту 25 на удаленной машине, как это было бы с telnet, и выдача команд smtp. Смотрите, например, http://www.yuki -onna.co.uk / email / smtp.html (или см. Ответ Джаспера Н. Брауэра).

0 голосов
/ 15 мая 2014

Вы можете просто использовать программу 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 () family. По сути, вы делаете то же самое: общаетесь с почтовым сервером напрямую.

// 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);
0 голосов
/ 15 мая 2014

Вы можете просто использовать функцию сборки в 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.

Вы можете загрузить пример почтового скрипта . Содержит две версии.

Простая версия имеет два файла, один из них - файл 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");
?>
0 голосов
/ 18 февраля 2011

Используя PHPMailer , вы можете установить тело сообщения напрямую:

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

Если ваши письма содержат вложения mime, это, скорее всего, не будет работать должным образом, так как некоторые изматериал MIME должен идти в заголовки почты.Вам нужно помассировать .eml, чтобы извлечь эти конкретные заголовки и добавить их в почту PHPMailer как пользовательский заголовок

...