Autor Zpráva
Kubas
Profil *
Zdravím,

párkrát se to tu už sice řešilo, nicméně nic to neřešilo můj problém. Jde o to, že na např. seznam.cz mi emaily ze skriptu chodí v pořádku, akurát na gmail ten email někdy dojde a někdy ne (nevidím v tom žádnou pravidelnost) a když už dojde, tak dojde jenom příloha ale text k té zprávě chybí. Nejspíš bude chyba asi někde v hlavičce.
Neví někdo prosím co s tím?

Na odesílání používám následující script -

$ppn = "muj@email.cz";
$zprava = "Toto je zpráva";
$target = "prilohy/".basename($_FILES['uploaded']['name']) ;
$m = move_uploaded_file($_FILES['uploaded']['tmp_name'],$target);

$attachment_name = $target;
$fp = FOpen ($attachment_name, 'r');
$contents = FRead ($fp, FileSize($attachment_name));
$contents = Chunk_Split(Base64_Encode($contents));
FClose ($fp);



$headers = "From:  Ahoj <$ppn>\n";
$headers .= "Reply-To: <$ppn>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\""
           ."----=MIME_BOUNDRY_main_message\"\n";
$headers .= "X-Sender: Odesilatel <$ppn>\n";
$headers .= "X-Mailer: PHP4\n";
$headers .= "X-Priority: 3\n";
$headers .= "Return-Path: <$ppn>\n";
$headers .= "This is a multi-part message in MIME format.\n";
$headers .= "------=MIME_BOUNDRY_main_message \n";
$headers .= "Content-Type: multipart/mixed; boundary=\""
           ."----=MIME_BOUNDRY_message_parts\"\n";

$message = "------=MIME_BOUNDRY_message_parts\n";
$message .= "Content-Type: text/html; charset=\"UTF-8\"\n";
$message .= "Content-Transfer-Encoding: quoted-printable\n";
$message .= "$zprava\n";
$message .= "------=MIME_BOUNDRY_main_message\n";
$message .= "Content-Type: application/octet-stream;\n\tname=\"" . $attachment_name . "\"\n";
$message .= "Content-Transfer-Encoding: base64\n";
$message .= "Content-Disposition: attachment;\n\tfilename=\"" . $attachment_name . "\"\n\n";
$message .= $contents; //Zakodovana priloha
$message .= "\n";
$message .= "------=MIME_BOUNDRY_main_message--\n";

//ODESLÁNÍ EMAILU
if (mail($address, $subject, $message, $headers))
{
  print 'Email byl úspěšně odeslán.';
}
else
{
  print 'Došlo k chybě!';
}

Děkuji
Davex
Profil
1) Tyto řádky nepatří do hlavičky, ale do těla zprávy
$headers .= "This is a multi-part message in MIME format.\n";
$headers .= "------=MIME_BOUNDRY_main_message \n";
$headers .= "Content-Type: multipart/mixed; boundary=\""
           ."----=MIME_BOUNDRY_message_parts\"\n";

2) Vložená část oddělená ----=MIME_BOUNDRY_message_parts mi připadá zbytečná. Kdyby tam měla zůstat, tak není ukončená.

3) Budu-li předpokládat, že v příloze zprávy není její alternativa v jiném formátu, tak není vhodné použití typu multipart/related; type="multipart/alternative". Pro obyčejnou zprávu s přílohou je vhodnější typ multipart/mixed.

4) Za všemi hlavičkami by měl být prázdný řádek.
Kubas
Profil *
Děkuju za reakci,

nicméně asi jsem buď natvrdlý, nebo mi to dneska už prostě nemyslí. Nemohl by jste mi prosím ukázat, jak by to ve výsledku mělo vypadat? Protože -

Davex:
1) Tyto řádky nepatří do hlavičky, ale do těla zprávy
Když jsem u všech tří řádků změnil z $headers na $message, text emailu se nezobrazoval už ani na seznamu, když jsem změnil jenom třetí řádek

$headers .= "Content-Type: multipart/mixed; boundary=\""
           ."----=MIME_BOUNDRY_message_parts\"\n";
na

$message .= "Content-Type: multipart/mixed; boundary=\"\"".PHP_EOL;

tak mi začal chodit text emailu i na gmail, akurát v tomto tvaru

------=MIME_BOUNDRY_message_parts
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<p>A toto je text u přílohy, který bude zobrazen</p>


Když jsem zkusil odmazat ty tři řádky (přepsání na $headers místo $message sice částečně pomohlo, na gmail ale zase bez textu), tak mi to přišlo jako

Content-Type: text/html; boundary=""
<p>ZprĂĄvička Ä›ÄĹĄĹ™Ă˝ĹžĂĄuĂ­ĂŠ</p>


Děkuju za rady


P.S.: Text zprávy potřebuju posílat jako text/html, kvůli wysiwyg editoru a nikoli jako text/plain
Davex
Profil
ad 1) Přepsat $headers na $message nestačí, protože si pak tu proměnnou přepíšeš. Mělo by to být nějak takto pohromadě:
$message = "This is a multi-part message in MIME format.\n";
$message .= "------=MIME_BOUNDRY_main_message\n";
$message .= "Content-Type: multipart/mixed; boundary=\""
           ."----=MIME_BOUNDRY_message_parts\"\n\n";
$message .= "------=MIME_BOUNDRY_message_parts\n";
// atd.
Kubas
Profil *
Děkuji, ale to je to co sem říkal.. To řešení je vlastně jenom přepsané $headers na $message.. V emailu sice příloha přijde, ale bez textu.

Když řádek $message .= "------=MIME_BOUNDRY_main_message\n"; přepíšu jako $headers .= "------=MIME_BOUNDRY_main_message\n";, tak mi email už přijde, ale s obsahem

------=MIME_BOUNDRY_message_parts
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<p>Toto je textĂ­k zprĂĄvičky Ä›ĹĄÄĹ™ĹžĂ˝ĂĄĂ­ĂŠ</p>
abc
Profil
Kubas:
Myslím, že by bylo asi nejlepší, kdybys přidal aktuální kód...
Kubas
Profil *
$ppn = "muj@email.cz";
$zprava = "Toto je zpráva s diakritikou ěščřžýáíé";
$target = "prilohy/".basename($_FILES['uploaded']['name']) ;
$m = move_uploaded_file($_FILES['uploaded']['tmp_name'],$target);

$attachment_name = $target;
$fp = FOpen ($attachment_name, 'r');
$contents = FRead ($fp, FileSize($attachment_name));
$contents = Chunk_Split(Base64_Encode($contents));
FClose ($fp);

$headers = "From: Zdraví <$ppn>".PHP_EOL;
$headers .= "Reply-To: <$ppn>".PHP_EOL;
$headers .= "MIME-Version: 1.0".PHP_EOL;
$headers .= "Content-Type: multipart/related; type=\"multipart/alternative\"; boundary=\""
           ."----=MIME_BOUNDRY_main_message\"".PHP_EOL;
$headers .= "X-Sender: Odesilatel <$ppn>".PHP_EOL;
$headers .= "X-Mailer: PHP4".PHP_EOL;
$headers .= "X-Priority: 3".PHP_EOL; 
$headers .= "Return-Path: <$ppn>".PHP_EOL;


$message .= "------=MIME_BOUNDRY_main_message".PHP_EOL;
$message .= "Content-Type: multipart/mixed; boundary=\""
           ."----=MIME_BOUNDRY_message_parts\"\n\n";
$message .= "------=MIME_BOUNDRY_message_parts".PHP_EOL;

$message = "------=MIME_BOUNDRY_message_parts".PHP_EOL;
$message .= "Content-Type: text/html; charset=\"UTF-8\"".PHP_EOL;
$message .= "Content-Transfer-Encoding: quoted-printable".PHP_EOL;
$message .= "$zprava".PHP_EOL;
$message .= "------=MIME_BOUNDRY_main_message".PHP_EOL;
$message .= "Content-Type: application/octet-stream;\n\tname=\"" . $attachment_name . "\"".PHP_EOL;
$message .= "Content-Transfer-Encoding: base64".PHP_EOL;
$message .= "Content-Disposition: attachment;\n\tfilename=\"" . $attachment_name . "\"".PHP_EOL;
$message .= $contents; //Zakodovana priloha
$message .= "------=MIME_BOUNDRY_main_message--".PHP_EOL;

//ODESLANI EMAILU
if (mail($address, $subject, $message, $headers))
{
  print 'Email byl úspěšně odeslán.';
}
else
{
  print 'Došlo k chybě!';
}
abc
Profil
Kubas:
Řádek 28 změň na $message .= "------=MIME_BOUNDRY_message_parts".PHP_EOL;
Už ti to radil [#4] Davex
Kubas
Profil *
P.S.: Aktuální kód (s úpravou od Davexe)


Jejda tak tu tečku sem přehlídnul. Toto vyřešilo problém s gmailem - tam už zpráva chodí normálně s diakritikou, akurát na seznamu text zprávy je v "noname" souboru v příloze.. V čem je teda ještě zakopaný pes?
Davex
Profil
Kubas:
Asi ignoruješ mé zbylé rady z [#2].

Navíc těď kombinuješ různé konce řádků \n a PHP_EOL - vyber si jen jednu variantu a tu používej. Také by tam neměly být těsně za sebou dva stejné řádky
$message .= "------=MIME_BOUNDRY_message_parts".PHP_EOL;
Kubas
Profil *
Už to jede, děkuju

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: