Я разрабатываю 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--
Используя 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
с шаблоном тела.