Отправить почту из необработанного тела для целей тестирования

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

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

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

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

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

Изменить: Чтобы быть более конкретным: я ищу способ отправить многостраничные электронные письма, используя их исходный код. Например, я хотел бы иметь возможность использовать что-то вроде этого (электронная почта с простой и 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-- 

Related of "Отправить почту из необработанного тела для целей тестирования"

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

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

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

Вы можете просто использовать программу 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); 

Вы можете просто использовать встроенную в 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"); ?> 

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

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, что происходит (или см. Ответ Джаспера Н. Брауэра).

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

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

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

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