login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Dynamisch bestand toevoegen als bijlage

Offline Jointjeff - 17/07/2014 14:32 (laatste wijziging 17/07/2014 14:47)
Avatar van JointjeffHTML interesse Hallo iedereen,

In ical.php (Plaatscode: 142360) genereer ik een .ics-bestand. Dit gaat helemaal goed en naar wens. De volgende stap is echter om dit bestand als bijlage te mailen.

Ik moet dit uiteindelijk via een filter doen (is een uitbreiding voor een WordPress plugin - WooCommerce). Zie ook; Plaatscode: 142361.

Voor nu zou ik graag weten hoe ik dat realiseer d.m.v. van de mail() functie (tenzij jullie al meer weten m.b.t. de filter hierboven).

Natuurlijk heb ik al gezocht, maar krijg vaak antwoorden als: gebruik phpmailer want dat werkt beter. Zoals je ziet heb ik met de filter beperkte mogelijkheden.

Hopende op een reactie.

5 antwoorden

Gesponsorde links
Offline Thomas - 17/07/2014 15:55 (laatste wijziging 17/07/2014 15:55)
Avatar van Thomas Moderator Je kunt dit misschien wel via de headers regelen, maar dit lijkt mij niet de goede plaats. Ik weet niet of je ooit van MIME-mail hebt gehoord? Hiermee kun je een e-mailbericht meer structuur geven en opdelen in partjes met elke een eigen Content-Type en -encoding. In je headers zet je de meta-data die een e-mailbericht markeert als een MIME-bericht, in de body zet je vervolgens je stukjes content. Je headers zijn dus bedoeld om e-mailapplicaties te instrueren hoe deze met de mailbody om zouden moeten gaan.

Je kunt wel gebruik maken van de "hack" dat je in je headers zowel je headers ALS je body zet, en de daadwerkelijke body zelf leeg laat, maar dat lijkt mij niet de bedoeling.

Classes/libraries zoals PHPMailer maken je leven wel eenvoudiger in die zin dat die (waarschijnlijk) voorgeprepareerde stukjes code hebben die je helpen bij het bouwen van een MIME e-mailbericht.

Als je toch (en misschien tegen beter weten in) zelf zo'n mail wilt bouwen... Je bent vast niet de eerste die dit probeert. Ik zie trouwens ook dat Wordpress zijn eigen mailfunctie heeft waarmee attachments verstuurd kunnen worden?
Offline Jointjeff - 17/07/2014 16:02 (laatste wijziging 17/07/2014 16:06)
Avatar van Jointjeff HTML interesse Hey FangorN,

Ik heb zeker van de wp_mail() functie gehoord. Echter, dit is een aanpassing/toevoeging op een plugin genaamd WooCommerce - ik weet niet zeker (denk het wel) of de plugin van wp_mail() gebruik maakt.

Er zijn wel actions en filters toe te voegen, maar ik kwam tot nu niet verder dan deze filter. Ik dacht daarom misschien via de headers de ics toe te kunnen voegen.

Toch heb ik al aardig wat afgezocht, maar kom maar niet bij een correct antwoord.

Bedankt voor je reactie.
Offline Thomas - 17/07/2014 16:14
Avatar van Thomas Moderator :)

In je headers vertel je hoe je e-mailbericht er uit gaat zien. In je body vertel je wat er in zit. Je stopt een attachment dus normaliter niet in je headers.

Ik kan wel een voorbeeld in elkaar zetten waarin ik laat zien hoe een MIME e-mailbericht opgebouwd is (of doe eens View Source in een e-mailbericht van Thunderbird of doe View Original Message (of iets dergelijks) in GMail), maar dan ben je haast op (MIME) protocol-niveau bezig met het opstellen van je e-mail. Het kan wel, maar als je dat dan vervolgens een beetje gaat structureren zodat het herbruikbaar wordt ben je dus al min of meer bezig met het bouwen van een MIME-mail lib, waar er al tig van zijn. Het is natuurlijk wel leerzaam .

Als je wilt zet ik een eenvoudig voorbeeld in elkaar. Anders/daarnaast zou ik gewoon in eerste instantie wp_mail proberen, en anders eens kijken naar bestaande libs zoals phpmailer.
Offline Jointjeff - 17/07/2014 16:17 (laatste wijziging 17/07/2014 16:53)
Avatar van Jointjeff HTML interesse Ik heb inmiddels gezien dat WooCommerce wp_mail gebruikt. Hoe ik daar een filter op kan toepassen is nog even de vraag.

Het zien van een voorbeeld MIME, voor text/calender zou dat dan zijn denk ik, zou ik zeer waarderen.
--

Edit:

Na wat grasduinen heb ik een filter gevonden om een attachment toe te voegen aan de email. Nu moet ik nog zorgen dat ik die ics kan toevoegen i.p.v. een statisch attachment.

  1. add_filter( 'woocommerce_email_attachments', 'add_ics_file_to_email', 1, 3);
  2.  
  3. function add_ics_file_to_email ( $attachments, $status , $order ) {
  4.  
  5. $allowed_statuses = array( 'customer_processing_order' );
  6.  
  7. if( isset( $status ) && in_array ( $status, $allowed_statuses ) ) {
  8.  
  9. $file_path = TEMPLATEPATH.'/images/headers/circle.png';
  10. $attachments[] = $file_path;
  11.  
  12. }
  13.  
  14. return $attachments;
  15.  
  16. }
Offline Thomas - 17/07/2014 17:40
Avatar van Thomas Moderator Er komen ontzettend veel regels kijken bij MIME. Zo heb ik in onderstaand voorbeeld geen rekening gehouden met de regel dat de regellengtes van het e-mailbericht eigenlijk niet een zeker aantal karakters mag overschrijden (70 geloof ik). Meestal zit heel veel van deze kennis verwerkt in je library. Reden temeer (wellicht) om van een lib gebruik te maken.

Daarnaast kan een verkeerd gebruik van het opstellen van (MIME) mail leiden tot het markeren als spam van dergelijke berichten.

Tot slot is de mail() functie niet geschikt voor het versturen van bulkmail. Je moet dan gaan denken aan oplossingen die gebruik maken van SMTP. Meestal (je raad het misschien al) heeft een library een implementatie met SMTP.

Kijk ook eens op PHP.net: http://www.php.net/manual/en/function.mail.php

Dat gezegd hebbende, dit zou moeten werken (mits je een bestaand files/meeting.ics hebt en je verzender en ontvanger instelt).

  1. <?php
  2. // helper functions
  3. function get_attachment($filename) {
  4. if (file_exists($filename)) {
  5. $fp = fopen($filename, 'rb');
  6. $contents = fread($fp, filesize($filename)); // @todo remember to fix zero-length files
  7. // note that chunk_split also adds an "end" character sequence at the end of the string, hence rtrim
  8. return rtrim(chunk_split(base64_encode($contents), 76, "\n")); // @todo 3rd parameter might depend on platform
  9. } else {
  10. return false;
  11. }
  12. }
  13.  
  14. function generate_boundary() {
  15. return uniqid(php_uname('n'));
  16. }
  17.  
  18. // create boundaries
  19. $boundaries = array(
  20. generate_boundary(), // boundary for the mail itself (multipart/mixed)
  21. generate_boundary(), // boundary for the text content (multipart/alternative)
  22. );
  23.  
  24. // define sender/receiver
  25. // these MUST be filtered in order to avoid MIME header injection
  26. $from_name = 'your name';
  27. $from_email = 'your@email.address.com';
  28. $to_name = 'recipient name';
  29. $to_email = 'recipient@email.address.com';
  30.  
  31. // define headers
  32. // "To" is set in mail() itself
  33. $headers[] = 'From: "'.$from_name.'" <'.$from_email.'>';
  34. $headers[] = 'Return-Path: '.$from_email; // must be simple form?
  35. $headers[] = 'Reply-To: "'.$from_name.'" <'.$from_email.'>';
  36. $headers[] = 'Mime-Version: 1.0';
  37. $headers[] = 'Content-Type: multipart/mixed; boundary="'.$boundaries[0].'"';
  38.  
  39. // define body
  40. $body = array();
  41. $body[] = 'This is a multi-part message in MIME format.';
  42. $body[] = '';
  43.  
  44. $body[] = '--'.$boundaries[0]; // multipart mixed 1/2 - mail content
  45. $body[] = 'Content-Type: multipart/alternative; boundary="'.$boundaries[1].'"';
  46. $body[] = ''; // for extra linebreak
  47.  
  48. $body[] = '--'.$boundaries[1]; // multipart alternative 1/2 - mail content - plain text part
  49. $body[] = 'Content-Type: text/plain; charset="ISO-8859-1"';
  50. $body[] = 'Content-Transfer-Encoding: 7bit';
  51. $body[] = '';
  52.  
  53. ?>Hier komt de plaintext variant van je mail-body.<?php
  54. $body[] = ob_get_clean();
  55.  
  56. $body[] = '--'.$boundaries[1]; // multipart alternative 2/2 - mail content - html part
  57. $body[] = 'Content-Type: text/html; charset="ISO-8859-1"'; // charset needs to be linked with metatag below
  58. $body[] = 'Content-Transfer-Encoding: 7bit';
  59. $body[] = '';
  60.  
  61. ?><html>
  62. <head>
  63. <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
  64. <style type="text/css">
  65. <!--
  66. //-->
  67. </style>
  68. </head>
  69.  
  70. <body>
  71. <p>Hier komt de HTML variant van je mail-body.</p>
  72. </body>
  73. </html><?php
  74. $body[] = ob_get_clean();
  75. $body[] = '--'.$boundaries[1].'--'; // multipart/alternative end
  76.  
  77. $file = 'meeting.ics';
  78. $path = 'files/'.$file;
  79. $body[] = '--'.$boundaries[0]; // multipart/mixed 2/2 - mail attachment
  80. $body[] = 'Content-Type: text/calendar; name="'.$file.'"';
  81. $body[] = 'Content-Transfer-Encoding: base64';
  82. $body[] = 'Content-Disposition: attachment; filename="'.$file.'"';
  83. $body[] = '';
  84. $body[] = get_attachment($path);
  85. $body[] = '--'.$boundaries[0].'--'; // multipart/mixed end
  86.  
  87. // depending on platform the "to" argument must be simple form (Windows) or can be complex
  88. $success = mail($to_email, 'MIME test', implode("\r\n", $body), implode("\r\n", $headers));
  89. if ($success) {
  90. echo 'mail succesfully sent';
  91. } else {
  92. echo 'mail not sent :(';
  93. }
  94. ?>
Bedankt door: Jointjeff
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.197s