1 Востаннє редагувалося igor.chornuha (28.07.2015 18:10:25)

Тема: [Вирішено]csv+mail()

Доброго вечора. На работі постало питання передачі csv файлів через e-mail (ну, так треба). Виникла проблема: файл створюється, все добре, але при надсиланні через mail в файлі відсутні дані з початку файлу. Код:

while(!feof($fp)){
$file .= fread($fp, filesize($filepath)); 
}
fclose($fp); 



$message_part = "\r\n--$boundary\r\n"; 
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";


$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);

Можливо, хтось мав таку ж або схожу проблему, відгукніться =)

2

Re: [Вирішено]csv+mail()

А якщо приготувати файл як для відправки через пошту, але замість відправки просто зберегти цей файл, він теж буде пустий на початку?

3

Re: [Вирішено]csv+mail()

ktretyak написав:

А якщо приготувати файл як для відправки через пошту, але замість відправки просто зберегти цей файл, він теж буде пустий на початку?

файл створюється, все добре

Спочатку просто генерується файл і в ньому все на місцях.

4

Re: [Вирішено]csv+mail()

Ну те що ви написали "файл створюється, все добре" не однозначно говорить, що він був створений саме при надсиланні пошти.

А якщо замінити рядок

"Content-Type: application/octet-stream; name=\"$filename\"\r\n"

на рядок

"Content-Type: text/plain"

Проблема не зникає? Ви ж текст відправляєте?

Подякували: igor.chornuha1

5

Re: [Вирішено]csv+mail()

ktretyak написав:

А якщо замінити рядок

"Content-Type: application/octet-stream; name=\"$filename\"\r\n"

на рядок

"Content-Type: text/plain"

Проблема не зникає? Ви ж текст відправляєте?

Надсилаю текст (?)
Має бути (і є в файлі) виду

Прізвище Ім"я По-батькові стать    +38(123)45-67-891    mail@ukr.net    Київська  обл.    Святошинський     Садова 4    1    5

А маємо (в листі)

123)45-67-891 gospay@ukr.net Дніпропетровська обл. Святошинський Садова 4 1 5

6 Востаннє редагувалося ktretyak (28.07.2015 10:09:27)

Re: [Вирішено]csv+mail()

Ок, а якщо так

$file = file_get_contents($filepath);
 
$multipart = "\r\n--$boundary\r\n"; 
$multipart .= "Content-Type: text/plain\r\n";  
$multipart .= "Content-Transfer-Encoding: base64\r\n"; 
$multipart .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode($file));
$multipart .= "\r\n--$boundary--\r\n";
 
mail($to,$subject, $multipart, $mailheaders);
Подякували: igor.chornuha1

7

Re: [Вирішено]csv+mail()

Той же результат

8

Re: [Вирішено]csv+mail()

Ну остання спроба =), спробуйте ось так ще (виправив мітку boundary)

$file = file_get_contents($filepath);
 
$multipart = "\r\n--$boundary--\r\n"; 
$multipart .= "Content-Type: text/plain\r\n";  
$multipart .= "Content-Transfer-Encoding: base64\r\n"; 
$multipart .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode($file));
$multipart .= "\r\n--$boundary--\r\n";
 
mail($to, $subject, $multipart, $mailheaders);

9

Re: [Вирішено]csv+mail()

0 байт noname файл =(
Можливо так краще буде, весь код, що стосується надсилання листа(без запропонованих виправлень):

$boundary = "--".md5(uniqid(time())); 


$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 


$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 

$multipart = "--$boundary\r\n"; 
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));

    $fp = fopen($filepath,"r"); 
        if (!$fp) 
        { 
            exit("Can't open file $filepath"); 
        } 
        $file;
while(!feof($fp)){
$file .= fread($fp, filesize($filepath)); 
}
fclose($fp); 
$message_part = "\r\n--$boundary\r\n"; 
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";

$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);

10

Re: [Вирішено]csv+mail()

Суть мого попереднього виправлення: мітка boundary відмежовує файл від решти частин листа, причому ця мітка повинна бути унікальною та однаковою на початку і на кінці тієї частини, що ви нею відмічаєте.

Тобто якщо ви на початку її зробили

$boundary = "--".md5(uniqid(time())); 

то далі в коді не дописуйте до неї нічого взагалі (можливо окрім символів переносу рядків).

Таким чином ваш повний код має бути мабуть

таким

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "\r\n$boundary\r\n"; 
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
    $fp = fopen($filepath,"r"); 
        if (!$fp) 
        { 
            exit("Can't open file $filepath"); 
        } 
        $file;
while(!feof($fp)){
$file .= fread($fp, filesize($filepath)); 
}
fclose($fp); 
$message_part = "\r\n$boundary\r\n"; 
$message_part .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to,$subject,$multipart,$mailheaders);

11 Востаннє редагувалося igor.chornuha (28.07.2015 11:17:40)

Re: [Вирішено]csv+mail()

--182b84986e4804d6d55f99a6e9635c60
Content-Type: text/html; charset=windows-1251
Content-Transfer-Encoding: base64
\r\n

--182b84986e4804d6d55f99a6e9635c60
Content-Type: application/octet-stream; name="280715105256.csv"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="280715105256.csv"
\r\nItCn0L7RgNC90YPRhdCwINCG0LPQvtGAINCe0LvQtdC60YHQsNC90LTRgNC+0LLQuNGHIiwrMzgo
MDYzKTQ3LTA3LTc5MCxpZ29yLmNob3JudWhhQGdtYWlsLmNvbSzQmtC40ZfQsizQodCy0Y/RgtC+
0YjQuNC90YHRjNC60LjQuSwi0KbRg9GA0Y7Qv9C40L3RgdGM0LrQsCAyIiwyLDIK

--182b84986e4804d6d55f99a6e9635c60

не виправив file_get_contents на fread.
Ситуація та ж

12

Re: [Вирішено]csv+mail()

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part = "\r\n$boundary\r\n"; 
$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);

13

Re: [Вирішено]csv+mail()

ktretyak написав:
Прихований текст

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part = "\r\n$boundary\r\n"; 
$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);

Отримав дещо, що гуглтранслейт в листі визначив як монгольську
®r- } н Э = ] m = н н Ѕ ]  Э M н - Ќ r"Ві3‚ѓ c2“CrУ rУs“ Ж–vч"ж6†ч&зV† vЦ –Вж6цТН  Ќ } "Н - э - н Ќ Ќ Э Н  Ќ ’В- m = н э Ќ Э Н  ""Г"Г

14

Re: [Вирішено]csv+mail()

О, так це вже "ранено" =), має вже скоро бути "убито"

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "\r\n$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);

15 Востаннє редагувалося igor.chornuha (28.07.2015 11:29:21)

Re: [Вирішено]csv+mail()

ktretyak написав:

О, так це вже "ранено" =), має вже скоро бути "убито"

Прихований текст

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "\r\n$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= '\r\n';
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= '\r\n';
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);

--de373e75e7ed43d5f326e279e3b981df
Content-Type: text/html; charset=windows-1251
Content-Transfer-Encoding: base64
\r\n
Content-Type: text/plain
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="280715112727.csv"
\r\nItCn0L7RgNC90YPRhdCwINCG0LPQvtGAINCe0LvQtdC60YHQsNC90LTRgNC+0LLQuNGHIiwrMzgo
MDYzKTQ3LTA3LTc5MCxpZ29yLmNob3JudWhhQGdtYWlsLmNvbSzQmtC40ZfQsizQodCy0Y/RgtC+
0YjQuNC90YHRjNC60LjQuSwi0KbRg9GA0Y7Qv9C40L3RgdGM0LrQsCAyIiwyLDIK

--de373e75e7ed43d5f326e279e3b981df

P.S. файлу в листі, зрозуміло, нема

16

Re: [Вирішено]csv+mail()

Що це таке? Це сирі дані з листа, чи це показується користувачу, навіть якщо він не просить показати заголовки?

17

Re: [Вирішено]csv+mail()

Це приходить на пошту замість файлу

18

Re: [Вирішено]csv+mail()

Короше навіть в мене вже терпіння закінчилось, це вже точно останній варіант (виправив переноси рядків)

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "\r\n$boundary\r\n";
$multipart .= "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= "\r\n";
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= "\r\n";
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);
Подякували: igor.chornuha1

19

Re: [Вирішено]csv+mail()

igor.chornuha написав:

Це приходить на пошту замість файлу

А ні ще виявляється не закінчилось, тоді в мене є ще один варіант =), якщо попередній не спрацює (відмежував міткою строго вміст файла)

$boundary = "--".md5(uniqid(time())); 
 
 
$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
 
 
$mailheaders .= "From: Gospay Україна <info@gospay.com.ua>\r\n"; 
$mailheaders .= "Reply-To: info@gospay.com.ua\r\n"; 
 
$multipart = "Content-Type: text/html; charset=windows-1251\r\n";
$multipart .= "Content-Transfer-Encoding: base64\r\n";    
$multipart .= "\r\n";
$multipart .= chunk_split(base64_encode(iconv("utf8", "windows-1251", $message)));
 
$file = file_get_contents($filepath);

if (empty($file)) 
{
  exit("Can't open file $filepath"); 
}

$message_part .= "Content-Type: text/plain\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= "\r\n";
$message_part .= "\r\n$boundary\r\n";
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n$boundary\r\n";
 
$multipart .= $message_part;
 
mail($to, $subject, $multipart, $mailheaders);
Подякували: igor.chornuha1

20 Востаннє редагувалося igor.chornuha (28.07.2015 11:52:02)

Re: [Вирішено]csv+mail()

Те ж саме. Дякую за допомогу, піду вішатись хз взагалі, буду розбирати все по рядках детально =(
Момент, зараз останній варіант спробую
UPD

Видало текст с файлу, здається, але в дикому кодуванні символів. Розгрібаю
UPD

Так, видало рядок тексту з файлу в WIN-1251