Autor Zpráva
Lubomír Žaloudek
Profil
Poraďte:
Vytvořím mailovou zprávu s přílohou, např. "priloha.xyz" (je to čistě textový soubor).
Email se normálně zpracuje a normálně doručí, jen v příloze je soubor "priloha.xyz.dat" se správným obsahem. Jak na to?
Díky Luboš
Davex
Profil
Před připojením přílohy k emailu soubor přejmenuješ a přidáš příponu .dat.
Lubomír Žaloudek
Profil
Asi jsem se špatně vyjádřil.
Potřebuju, aby daná příloha u příjemce měla požadovanou přílohu, protože je na její zpracování zaregistrovaná moje aplikace, která se spustí prostým poklepáním na přílohu.
Při používání MAPI klienta z windowsovské aplikace to není problém. Teď bych ale potřeboval totéž zajistit z webovské aplikace.
Luboš.


Oprava - požadovanou příponu.
Davex
Profil
Takže je problém z webové aplikace odeslat e-mailem přílohu s určitým jménem nebo je problém pouze s přejmenováním toho přiloženého souboru? Co je to za webovou aplikaci a v jakém jazyku je naprogramovaná?
Lubomír Žaloudek
Profil
Aplikace je v PHP. Slouží ke konfiguraci objednávaného výrobku. Výsledná data má předat výrobci.
Tam už léta existuje windowsovská aplikace v Delphi, která přijímá data tak, že uživatel poklepe na přílohu mailu.
Proto je potřeba, aby přijatý soubor měl definovaný typ přípony. Na jméně přílohy tudíž nezáleží, jen na příponě.
Doposud to funguje tak, že zákazníci musí vždy dostat CD s novou verzí windowsovské aplikace s novými daty.
Nová webovská aplikace má tento způsob nahradit. Všechno už v zásadě funguje, jen ta přípona mi dělá problém.
Luboš


Ještě poznámka. Postřehl jsem, že musím oddělit jméno souboru a příponu a "vylepšil parametry".
Takže momentálně není doručen soubor "příloha.xyz.dat", ale "příloha.txt", zřejmě proto, že je to typ "text/plain".
Luboš.
Davex
Profil
Myslím, že potom není problém změnit příponu přílohy během generování e-mailu.

Například při použití třídy PHPMailer je to úplně jednoduché:

<?php

require '../PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->setFrom('odkoho@example.com', 'Od koho');
$mail->addAddress('komu@example.com', 'Komu');
$mail->Subject = 'Předmět';

$mail->addAttachment('./data/priloha.xyz', 'priloha.xyz.txt');

if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
Lubomír Žaloudek
Profil
Vidím, že budu muset být úplně detailní.
Ta příloha jako soubor vůbec neexistuje a ani nechci soubor zakládat. Předávám prostě funkci mail název souboru a jeho data, která jsem nikam nezapsal (musel bych např. vymýšlet náhodně generované jméno pro dočasný soubor).
Potřebuju jen nějak donutit systém (MIME?), aby to doručil se mnou definovanou extenzí. Domnival jsem se, že postačí nějaká finta v poli parametrů, tj. v Part2 of body, něco jako třeba "Content.type". Nikde totiž nemůžu najít úplný popis volání funkce mail.

Jiná možnost, která mě napadá, je, že někde funguje to záhadné MIME, které se samo rozhodne, jakou příponu příloze přidělí (momentálně txt) a že by stačilo doplnit mu tu moji do definic.

Je mi jasné, že třída PHPmailer to asi nějak dělá, ale nechce se mi ji používat jen kvůli "maličkosti".
_es
Profil
Lubomír Žaloudek:
To by ale chcelo aj napísať, ako to v PHP odosielaš. Bez toho asi ťažko niekto vyveští, čo robíš zle.
Martin2
Profil *
Lubomír Žaloudek:
Budeš nás dlouho napínat, jakým způsobem ten mail odesíláš, nebo ještě máme chvíli hádat?

PHP funkce mail() přílohy a celkově multipart/related maily nijak neřeší, takže to nebude tvůj případ, jinak bys věděl, jaký typ a název souboru dáváš. Projdi si RFC 2387, především popis hlavičky Content-Type. Soudím, že když dáš příloze generický typ Application/octet-stream, měly by všechny zúčastněné strany nechat ten soubor na pokoji tak jak je.
Lubomír Žaloudek
Profil
Tak jsem na to přišel:
"type" => "application/mojeapplikace; \r\n filename=\"jmeno.pripona\"",
"disposition.type" => "attachment; \r\n filename=\"jmeno.pripona\"",
Luboš
Davex
Profil
Lubomír Žaloudek:
Ta příloha jako soubor vůbec neexistuje a ani nechci soubor zakládat.
Pokud soubor neexistuje, tak se k vložení přílohy v PHPMaileru dá použít metoda addStringAttachment.

Domnival jsem se, že postačí nějaká finta v poli parametrů, tj. v Part2 of body, něco jako třeba "Content.type".
Nemohl jsem tušit, že k sestavení e-mailu používáš imap_mail_compose.

Je mi jasné, že třída PHPmailer to asi nějak dělá, ale nechce se mi ji používat jen kvůli "maličkosti".
Obecně nepovažuji za dobrý nápad znovu vynalézat kolo a raději používám hotové třídy s jednoduchým rozhraním, které jsou schopné posílat e-maily správně dle specifikace s velkou nadějí, že se e-mail podaří doručit a příjemce nebude mít problémy s otevřením jeho obsahu.
Lubomír Žaloudek
Profil
Davexi,

vím, že máš pravdu a nechtěl jsem opravdu nic vynalézat. Ale domníval jsem se, že by mi měl postačit klasický mail a jak se ukázalo, měl jsem pravdu. Třídu PHPmailer použiju, až budu potřebovat funkce, které "klasicky" nejsou dosažitelné nebo by byly nepřiměřeně komplikované.

Jsem koneckonců v PHP začátečník a v takových případech vždycky postupuju podobně - nejdřív se snažím ovládnout základy jazyka a až potom použít nezbytné knihovny nebo si konstruuju vlastní jen s potřebnými funkcemi. Programuju ještě pořád od DOSu (Clipper) přes Windows (dvě verze Delphi současně) až nyní k PHP a HTML a rozsah všech možných knihoven mi poněkud přerůstá přes hlavu.

Mimoto i "vynalézání kola" může mít svůj význam, přinejmenším naučí přemýšlet. U dnešních aplikací mi občas připadá, že klasické "Hello, world" potřebuje aspoň 2 GB Ram, stovky MB na disku a nákup deseti third-party produktů. Programátor neprogramuje, ale kliká v nějakých knihovnách, kterým ani pořádně nerozumí (jak by mohl?). Názvy knihovních funkcí už zabírají celé řádky, aby se od sebe odlišily a bez pomoci prostředí nikdo nezná jejich parametry (to nemusí být vada). Ale nepostřehl jsem, že by to vedlo k vyšší produktivitě práce a i samotné aplikace jsou při použití leckdy úděsné a potřebují mnohadenní uživatelské školení, i když "samy od sebe" umí vytvořit tuto zprávu v PDF nebo v DOCX, což ovšem nikdo nepotřebuje. Tím ale nechci říct, že neexistují špičkoví programátoři a špičkové aplikace.

To pochopitelně není chyba vývojových prostředí, jenže to lidi svádí k tomu, aby problémy neřešili. Když si vzpomenu, co se mi kdysi vešlo do 16 KB RAM, už tomu ani sám nevěřím. Ale nejsem zase takový staromilec, jak to možná vypadá, i když chápu, že už jsem za zenitem. Nové možnosti mě fascinují a rád je používám, ale ne proto, že existují, nýbrž proto, že je potřebuje zákazník.

Zdravím a díky za rady, určitě se tu ještě objevím,
Luboš

A abych tu zanechal něco, co by se někomu mohlo hodit (možná by šlo ještě něco zjednodušit). Vytvořit z toho funkci už bude hračka a budu jí rozumět:
$objedn = 12345; // číslo objednávky
$odesilatel = "lubomir@zaloudek.cz";
$prijemce = "lubomir@zaloudek.cz";
$obsah = "tohle je text mailu žřčš Ž";
$soubor = "tohle jsou pokusná data přílohy žřčš Ž";
$envelope = array
(
"from" => "$odesilatel",
"to" => "$prijemce",
);
$part1 = array // rika, ze mail ma vic casti
(
"type" => TYPEMULTIPART,
"subtype" => "mixed",
);
$part2 = array // popis prilohy
(
"type" => "application/vptrend; \r\n filename=\"vptobj.vpt\"",
"encoding" => ENCBINARY,
"charset" => "utf-8",
"description" => "vptobj",
"disposition.type" => "attachment; \r\n filename=\"vptobj.vpt\"",
"contents.data" => $soubor,
);
$part3 = array // obsah zpravy
(
"type" => TYPETEXT,
"subtype" => "plain",
"charset" => "utf-8",
"description" => "text",
"contents.data" => $obsah,
);
$body = array($part1, $part2, $part3);
$zprava = imap_mail_compose($envelope, $body);
$pom = strpos($zprava, "\r\n\r\n");
$hlavicka = substr($zprava, 0, $pom+2);
$telo = substr($zprava, $pom, strlen($zprava)-$pom);
if (mail("$prijemce", 'objednavka:'.$objedn, $telo, $hlavicka))
print_r("Odeslano ok");
else
print_r("Mail se nepodařil!");

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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