Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webdesign (HTML, CSS, Flash)

[HTML/Email] Inline afbeeldingen in email embedden: probleem

BasHamar
2 antwoorden
  • LS,

    Ik heb een PHP-scriptje geschreven dat een mail verstuurt met plain text, html text en een drietal afbeeldingen die ik wil inline in de mail wil tonen. Waarom? Omdat afbeeldingen die je als attachment meestuurt niet automatisch getoond worden in de mail. En omdat links naar afbeeldingen op andere servers worden geblokkeerd uit privacy-overwegingen. Ik weet dat ik het vroeger deed met Thunderbird en dus heb ik het weer gedownload en een test gedaan, met succes. In GMail worden de afbeeldingen netjes inline getoond. Helaas blijken Live/Hotmail en Yahoo een stuk koppiger. Het rare is dat ik op internet verschillende referenties en opmerkingen zie waarin wordt gemeld dat het ook voor Yahoo en Hotmail mogelijk is, maar nergens een link naar een werkend voorbeeld of een stukje theorie. Dus nu reken ik op jullie inzicht: wie helpt?

    Ik doe het met PHP en wel als volgt:

    [code:1:92606e932e] // Standaard parameters instellen

    $to = "random@email.com";
    $subject = "Test";
    $message = "";

    // Random hash berekenen

    $random_hash = md5(date('r', time()));

    // Extra headers instellen

    $headers = 'From: random@email.com'."
    ".
    'MIME-Version: 1.0'."
    ".
    'Content-Type: multipart/alternative; boundary="PHP-alt-'.$random_hash.'"';

    // Attachments gereed maken voor inline embedding

    $attachment[0] = chunk_split(base64_encode(file_get_contents('afbeelding1.jpg')));
    $attachment[1] = chunk_split(base64_encode(file_get_contents('afbeelding2.jpg')));
    $attachment[2] = chunk_split(base64_encode(file_get_contents('afbeelding3.jpg')));
    [/code:1:92606e932e]
    Nu heb ik dus de benodigde headers voor het versturen van een email met mail() en een array met de afbeeldingen. Vervolgens bouw ik de mail:
    [code:1:92606e932e] // Header en stijloze tekst

    $message .= 'This is a multi-part message in MIME format.'."
    ";
    $message .= '–PHP-alt-'.$random_hash."
    ";

    $message .= 'Content-Type: text/plain; charset=UTF-8; format=flowed'."
    ";
    $message .= 'Content-Transfer-Encoding: 7bit'."


    ";
    $message .= 'Hier plain tekst praatje zonder opmaak'."

    ";
    $message .= '–PHP-alt-'.$random_hash."
    ";

    $message .= 'Content-Type: multipart
    elated; boundary="PHP-rel-'.$random_hash.'"'."

    ";
    $message .= '–PHP-rel-'.$random_hash."
    ";

    $message .= 'Content-Type: text/html; charset=UTF-8'."
    ";
    $message .= 'Content-Transfer-Encoding: 7bit'."

    ";

    // Opgemaakte tekst

    $message .= '<html>
    '; // Hier hoort een volledige doctype
    $message .= '<img src="cid:afbeelding1@email.com" alt=""><br>
    ';
    $message .= '<img src="cid:afbeelding2@email.com" alt=""><br>
    ';
    $message .= '<img src="cid:afbeelding3@email.com" alt=""><br>
    ';
    $message .= "</html>";

    // Afbeeldingen inladen uit extern bestand

    $message .= '–PHP-rel-'.$random_hash."
    ";

    $message .= 'Content-Type: image/jpeg; name="afbeelding1.jpg"'."
    ";
    $message .= 'Content-Transfer-Encoding: base64'."
    ";
    $message .= 'Content-Disposition: attachment; filename: afbeelding1.jpg'."
    ";
    $message .= 'Content-ID: <afbeelding1@email.com>'."

    ";
    $message .= $attachment[0]."
    ";

    $message .= '–PHP-rel-'.$random_hash."
    ";

    $message .= 'Content-Type: image/jpeg; name="afbeelding2.jpg"'."
    ";
    $message .= 'Content-Transfer-Encoding: base64'."
    ";
    $message .= 'Content-Disposition: attachment; filename: afbeelding2.jpg'."
    ";
    $message .= 'Content-ID: <afbeelding2@email.com>'."

    ";
    $message .= $attachment[1]."
    ";

    $message .= '–PHP-rel-'.$random_hash."
    ";

    $message .= 'Content-Type: image/jpeg; name="afbeelding3.jpg"'."
    ";
    $message .= 'Content-Transfer-Encoding: base64'."
    ";
    $message .= 'Content-Disposition: attachment; filename: afbeelding3.jpg'."
    ";
    $message .= 'Content-ID: <afbeelding3@email.com>'."

    ";
    $message .= $attachment[2]."
    ";

    $message .= '–PHP-rel-'.$random_hash."–";
    $message .= '–PHP-alt-'.$random_hash."–";
    [/code:1:92606e932e]
    Uiteindelijk verstuur je alles met een standaard mail()-functie. Sorry voor alle PHP, maar het draait hier natuurlijk eigenlijk om de html van de resulterende mail. Zoals gezegd: het werkt met Gmail en moeten werken met Hotmail en Yahoo, maar bij de laatsgenoemde bedrijven moet je de afbeeldingen eerst toestaan, iets dat ik juist probeer te vermijden door ze inline te embedden.

    Kortom: wie heeft hier ervaring mee of heeft een theorie hoe dit werkend te krijgen? Alle ideeën en ervaringen zijn welkom!

    - Bas

    [b:92606e932e]Instant update:[/b:92606e932e] Zie de comments hier voor opmerkingen dat het zou moeten kunnen, ondanks de bevindingen van de genoemde site.

    [b:92606e932e]Tweede update:[/b:92606e932e] Op basis van deze post vermoed ik dat ik mijn seperators niet helemaal op orde heb en dat GMail simpelweg vergevingsgezinder is dan anders webmailproviders. Ik laat nog weten of dit het was, maar andere suggesties zijn ook zeer welkom! (Moet naar werk toe)










































  • ik heb zelf ook wel eens zoiets gemaakt en toen ook lang zitten stoeien met de boundary's. Ik heb zelf de alternative binnen de related geplaatst, jij doet dat andersom. Ik kan het nu niet testen maar misschien kun je het zelf proberen.
    Dus, je hebt nu:

    [code:1:60341321a1]'Content-Type: multipart/alternative; boundary="PHP-alt-'.$random_hash.'"'
    '–PHP-alt-'.$random_hash
    'Content-Type: text/plain'
    // plain text
    '–PHP-alt-'.$random_hash
    'Content-Type: multipart
    elated; boundary="PHP-rel-'.$random_hash.'"'
    '–PHP-rel-'.$random_hash
    'Content-Type: text/html; charset=UTF-8'
    // html text
    '–PHP-rel-'.$random_hash
    Content-Type: image/jpeg'
    // plaatje
    '–PHP-rel-'.$random_hash."–"
    '–PHP-alt-'.$random_hash."–"[/code:1:60341321a1]
    en ik heb dat toen zo gedaan:
    [code:1:60341321a1]'Content-Type: multipart
    elated; boundary="PHP-rel-'.$random_hash.'"'
    '–PHP-rel-'.$random_hash
    'Content-Type: multipart/alternative; boundary="PHP-alt-'.$random_hash.'"'
    '–PHP-alt-'.$random_hash
    'Content-Type: text/plain'
    // plain text
    '–PHP-alt-'.$random_hash
    'Content-Type: text/html; charset=UTF-8'
    // html text
    '–PHP-alt-'.$random_hash
    '–PHP-rel-'.$random_hash
    Content-Type: image/jpeg'
    // plaatje
    '–PHP-rel-'.$random_hash."–"
    [/code:1:60341321a1]
    Hoop dat dit helpt

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.