Jump to content

Obchodní podmínky jako příloha emailu svépomocí za pár minut


zabza

Recommended Posts

Třeba to někomu pomůže.

 

Problém obchodních podmínek jako přílohy emailu jsem řešil již na konci roku, aby od 1.1.2014 bylo vše připraveno.

Vycházel jsem z toho, že nejideálnější je přiložit je do emailu potvrzujícího objednávku. Jako jejich přílohu jsem přidal na konec pro jistotu i vzorový formulář pro odstoupení od smlouvy do 14 dnů.

 

Celý dokument jsem vyhotovil v PDF a nahrál do kořenového adresáře obchodu. Odkaz na tento soubor ke stažení jsem přidal i na konec znení OP které jsou zveřejněny na stránkách obchodu.

 

Po tomto nahrání jsem šel do souboru ..classes/Mail.php a vyhledal řádek 304

/* Send mail */
$send = $swift->send($message, $to, new Swift_Address($from, $from_name));
$swift->disconnect();

a před něj jsem vložil následující:

if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("obchodni_podminky.pdf"), "Obchodní podmínky.pdf", "application/pdf"));

Pochopitelně pokud je soubor obchodních podmínek jinde než v kořenovém adresáři je nutné uvést cestu k souboru obchodni_podminky.pdf.

 

Platí pro v. 1.5.x

 

 

---

Pár dní jsem tu nebyl, tak doplňuji, že 100% vyzkoušené to mám na 1.5.6.2 Je skutečně možné, že v jiných verzích to nefunguje.

Edited by zabza (see edit history)
  • Like 6
Link to comment
Share on other sites

  • 2 weeks later...

Díky, ale bohužel mi to nefunguje na 1.5.2.0. Nakopíroval jsem obchodni_podminky.pdf do rootu, přidal kód do classes/Mail.php hned za /* Send mail */

 

Nemáte nějaký nápad proč se příloha neposílá? Nebo mám špatně cestu k souboru?

	/* Send mail */
			if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("obchodni_podminky.pdf"), "Obchodní_podmínky.pdf", "application/pdf"));	
			$send = $swift->send($message, $to, new Swift_Address($from, $from_name));
			$swift->disconnect();
			return $send;
		}
		catch (Swift_Exception $e) {
			return false;
		}
	}

Celý Mail.php zde:

<?php
/*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2012 PrestaShop SA
*  @version  Release: $Revision: 6844 $
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

include_once(_PS_SWIFT_DIR_.'Swift.php');
include_once(_PS_SWIFT_DIR_.'Swift/Connection/SMTP.php');
include_once(_PS_SWIFT_DIR_.'Swift/Connection/NativeMail.php');
include_once(_PS_SWIFT_DIR_.'Swift/Plugin/Decorator.php');

class MailCore
{
	const TYPE_HTML = 1;
	const TYPE_TEXT = 2;
	const TYPE_BOTH = 3;

	/**
	 * Send Email
	 * 
	 * @param int $id_lang Language of the email (to translate the template)
	 * @param string $template Template: the name of template not be a var but a string !
	 * @param string $subject
	 * @param string $template_vars
	 * @param string $to
	 * @param string $to_name
	 * @param string $from
	 * @param string $from_name
	 * @param array $file_attachment Array with three parameters (content, mime and name). You can use an array of array to attach multiple files
	 * @param bool $modeSMTP
	 * @param string $template_path
	 * @param bool $die
	 */
	public static function Send($id_lang, $template, $subject, $template_vars, $to,
		$to_name = null, $from = null, $from_name = null, $file_attachment = null, $mode_smtp = null, $template_path = _PS_MAIL_DIR_, $die = false, $id_shop = null)
	{
		$theme_path = _PS_THEME_DIR_;

		// Get the path of theme by id_shop if exist
		if (is_numeric($id_shop) && $id_shop)
		{
			$shop = new Shop((int)$id_shop);
			$theme_name = $shop->getTheme();

			if (_THEME_NAME_ != $theme_name)
				$theme_path = _PS_ROOT_DIR_.'/themes/'.$theme_name.'/';
		}

		$configuration = Configuration::getMultiple(array(
			'PS_SHOP_EMAIL',
			'PS_MAIL_METHOD',
			'PS_MAIL_SERVER',
			'PS_MAIL_USER',
			'PS_MAIL_PASSWD',
			'PS_SHOP_NAME',
			'PS_MAIL_SMTP_ENCRYPTION',
			'PS_MAIL_SMTP_PORT',
			'PS_MAIL_METHOD',
			'PS_MAIL_TYPE'
		));

		if (!isset($configuration['PS_MAIL_SMTP_ENCRYPTION']))
			$configuration['PS_MAIL_SMTP_ENCRYPTION'] = 'off';
		if (!isset($configuration['PS_MAIL_SMTP_PORT']))
			$configuration['PS_MAIL_SMTP_PORT'] = 'default';

		// Sending an e-mail can be of vital importance for the merchant, when his password is lost for example, so we must not die but do our best to send the e-mail
		if (!isset($from) || !Validate::isEmail($from))
			$from = $configuration['PS_SHOP_EMAIL'];
		if (!Validate::isEmail($from))
			$from = null;

		// $from_name is not that important, no need to die if it is not valid
		if (!isset($from_name) || !Validate::isMailName($from_name))
			$from_name = $configuration['PS_SHOP_NAME'];
		if (!Validate::isMailName($from_name))
			$from_name = null;

		// It would be difficult to send an e-mail if the e-mail is not valid, so this time we can die if there is a problem
		if (!is_array($to) && !Validate::isEmail($to))
		{
			Tools::dieOrLog(Tools::displayError('Error: parameter "to" is corrupted'), $die);
			return false;
		}

		if (!is_array($template_vars))
			$template_vars = array();

		// Do not crash for this error, that may be a complicated customer name
		if (is_string($to_name) && !empty($to_name) && !Validate::isMailName($to_name))
			$to_name = null;

		if (!Validate::isTplName($template))
		{
			Tools::dieOrLog(Tools::displayError('Error: invalid e-mail template'), $die);
			return false;
		}

		if (!Validate::isMailSubject($subject))
		{
			Tools::dieOrLog(Tools::displayError('Error: invalid e-mail subject'), $die);
			return false;
		}

		/* Construct multiple recipients list if needed */
		if (is_array($to) && isset($to))
		{
			$to_list = new Swift_RecipientList();
			foreach ($to as $key => $addr)
			{
				$to_name = null;
				$addr = trim($addr);
				if (!Validate::isEmail($addr))
				{
					Tools::dieOrLog(Tools::displayError('Error: invalid e-mail address'), $die);
					return false;
				}
				if (is_array($to_name))
				{
					if ($to_name && is_array($to_name) && Validate::isGenericName($to_name[$key]))
						$to_name = $to_name[$key];
				}
				if ($to_name == null)
					$to_name = $addr;
				/* Encode accentuated chars */
				$to_list->addTo($addr, '=?UTF-8?B?'.base64_encode($to_name).'?=');
			}
			$to_plugin = $to[0];
			$to = $to_list;
		} else {
			/* Simple recipient, one address */
			$to_plugin = $to;
			if ($to_name == null)
				$to_name = $to;
			$to = new Swift_Address($to, '=?UTF-8?B?'.base64_encode($to_name).'?=');
		}
		try {
			/* Connect with the appropriate configuration */
			if ($configuration['PS_MAIL_METHOD'] == 2)
			{
				if (empty($configuration['PS_MAIL_SERVER']) || empty($configuration['PS_MAIL_SMTP_PORT']))
				{
					Tools::dieOrLog(Tools::displayError('Error: invalid SMTP server or SMTP port'), $die);
					return false;
				}
				$connection = new Swift_Connection_SMTP($configuration['PS_MAIL_SERVER'], $configuration['PS_MAIL_SMTP_PORT'],
					($configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'ssl') ? Swift_Connection_SMTP::ENC_SSL :
					(($configuration['PS_MAIL_SMTP_ENCRYPTION'] == 'tls') ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_OFF));
				$connection->setTimeout(4);
				if (!$connection)
					return false;
				if (!empty($configuration['PS_MAIL_USER']))
					$connection->setUsername($configuration['PS_MAIL_USER']);
				if (!empty($configuration['PS_MAIL_PASSWD']))
					$connection->setPassword($configuration['PS_MAIL_PASSWD']);
			}
			else
				$connection = new Swift_Connection_NativeMail();

			if (!$connection)
				return false;
			$swift = new Swift($connection, Configuration::get('PS_MAIL_DOMAIN'));
			/* Get templates content */
			$iso = Language::getIsoById((int)$id_lang);
			if (!$iso)
			{
				Tools::dieOrLog(Tools::displayError('Error - No ISO code for email'), $die);
				return false;
			}
			$template = $iso.'/'.$template;

			$module_name = false;
			$override_mail = false;

			// get templatePath
			if (preg_match('#'.__PS_BASE_URI__.'modules/#', $template_path) && preg_match('#modules/([a-z0-9_-]+)/#ui', $template_path, $res))
				$module_name = $res[1];

			if ($module_name !== false && (file_exists($theme_path.'modules/'.$module_name.'/mails/'.$template.'.txt') ||
				file_exists($theme_path.'modules/'.$module_name.'/mails/'.$template.'.html')))
				$template_path = $theme_path.'modules/'.$module_name.'/mails/';
			else if (file_exists($theme_path.'mails/'.$template.'.txt') || file_exists($theme_path.'mails/'.$template.'.html'))
			{
				$template_path = $theme_path.'mails/';
				$override_mail  = true;
			}
			else if (!file_exists($template_path.$template.'.txt') || !file_exists($template_path.$template.'.html'))
			{
				Tools::dieOrLog(Tools::displayError('Error - The following e-mail template is missing:').' '.$template_path.$template.'.txt', $die);
				return false;
			}
			$template_html = file_get_contents($template_path.$template.'.html');
			$template_txt = strip_tags(html_entity_decode(file_get_contents($template_path.$template.'.txt'), null, 'utf-8'));

			if ($override_mail && file_exists($template_path.$iso.'/lang.php'))
					include_once($template_path.$iso.'/lang.php');
			else if ($module_name && file_exists($template_path.$iso.'/lang.php'))
				include_once($theme_path.'mails/'.$iso.'/lang.php');
			else
				include_once(dirname(__FILE__).'/../mails/'.$iso.'/lang.php');

			/* Create mail and attach differents parts */
			$message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME').'] '.$subject);
			$message->headers->setEncoding('Q');

			if (Configuration::get('PS_LOGO_MAIL') !== false && file_exists(_PS_IMG_DIR_.Configuration::get('PS_LOGO_MAIL')))
				$template_vars['{shop_logo}'] = $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.Configuration::get('PS_LOGO_MAIL'))));
			else
				if (file_exists(_PS_IMG_DIR_.'logo.jpg'))
					$template_vars['{shop_logo}'] = $message->attach(new Swift_Message_Image(new Swift_File(_PS_IMG_DIR_.Configuration::get('PS_LOGO'))));
				else
					$template_vars['{shop_logo}'] = '';

			$template_vars['{shop_name}'] = Tools::safeOutput(Configuration::get('PS_SHOP_NAME'));
			$template_vars['{shop_url}'] = Tools::getShopDomain(true, true).__PS_BASE_URI__.'index.php';
			$template_vars['{my_account_url}'] = Context::getContext()->link->getPageLink('my-account', true, Context::getContext()->language->id);
			$template_vars['{guest_tracking_url}'] = Context::getContext()->link->getPageLink('guest-tracking', true, Context::getContext()->language->id);
			$template_vars['{history_url}'] = Context::getContext()->link->getPageLink('history', true, Context::getContext()->language->id);
			$swift->attachPlugin(new Swift_Plugin_Decorator(array($to_plugin => $template_vars)), 'decorator');
			if ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_TEXT)
				$message->attach(new Swift_Message_Part($template_txt, 'text/plain', '8bit', 'utf-8'));
			if ($configuration['PS_MAIL_TYPE'] == Mail::TYPE_BOTH || $configuration['PS_MAIL_TYPE'] == Mail::TYPE_HTML)
				$message->attach(new Swift_Message_Part($template_html, 'text/html', '8bit', 'utf-8'));
			if ($file_attachment && !empty($file_attachment))
			{
				// Multiple attachments?
				if (!is_array(current($file_attachment)))
					$file_attachment = array($file_attachment);

				foreach ($file_attachment as $attachment)
					if (isset($attachment['content']) && isset($attachment['name']) && isset($attachment['mime']))
						$message->attach(new Swift_Message_Attachment($attachment['content'], $attachment['name'], $attachment['mime']));
			}
			/* Send mail */
			if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("obchodni_podminky.pdf"), "obchodni_podminky.pdf", "application/pdf"));	
			$send = $swift->send($message, $to, new Swift_Address($from, $from_name));
			$swift->disconnect();
			return $send;
		}
		catch (Swift_Exception $e) {
			return false;
		}
	}

	public static function sendMailTest($smtpChecked, $smtpServer, $content, $subject, $type, $to, $from, $smtpLogin, $smtpPassword, $smtpPort = 25, $smtpEncryption)
	{
		$swift = null;
		$result = false;
		try
		{
			if ($smtpChecked)
			{
				$smtp = new Swift_Connection_SMTP($smtpServer, $smtpPort, ($smtpEncryption == 'off') ? 
					Swift_Connection_SMTP::ENC_OFF : (($smtpEncryption == 'tls') ? Swift_Connection_SMTP::ENC_TLS : Swift_Connection_SMTP::ENC_SSL));
				$smtp->setUsername($smtpLogin);
				$smtp->setpassword($smtpPassword);
				$smtp->setTimeout(5);
				$swift = new Swift($smtp, Configuration::get('PS_MAIL_DOMAIN'));
			}
			else
				$swift = new Swift(new Swift_Connection_NativeMail(), Configuration::get('PS_MAIL_DOMAIN'));

			$message = new Swift_Message($subject, $content, $type);

			if ($swift->send($message, $to, $from))
				$result = true;

			$swift->disconnect();
		}
		catch (Swift_ConnectionException $e)
		{
			$result = $e->getMessage();
		}
		catch (Swift_Message_MimeException $e)
		{
			$result = $e->getMessage();
		}

		return $result;
	}

	/**
	 * This method is used to get the translation for email Object.
	 * For an object is forbidden to use htmlentities,
	 * we have to return a sentence with accents.
	 * 
	 * @param string $string raw sentence (write directly in file)
	 */
	public static function l($string, $id_lang = null, Context $context = null)
	{
		global $_LANGMAIL;
		if (!$context)
			$context = Context::getContext();

		$key = str_replace('\'', '\\\'', $string);
		if ($id_lang == null)
			$id_lang = (!isset($context->language) || !is_object($context->language)) ? (int)Configuration::get('PS_LANG_DEFAULT') : (int)$context->language->id;

		$iso_code = Language::getIsoById((int)$id_lang);

		$file_core = _PS_ROOT_DIR_.'/mails/'.$iso_code.'/lang.php';
		if (Tools::file_exists_cache($file_core) && empty($_LANGMAIL))
			include_once($file_core);

		$file_theme = _PS_THEME_DIR_.'mails/'.$iso_code.'/lang.php';
		if (Tools::file_exists_cache($file_theme))
			include_once($file_theme);

		if (!is_array($_LANGMAIL))
			return (str_replace('"', '"', $string));
		if (array_key_exists($key, $_LANGMAIL) && !empty($_LANGMAIL[$key]))
			$str = $_LANGMAIL[$key];
		else
			$str = $string;

		return str_replace('"', '"', stripslashes($str));
	}
}

Link to comment
Share on other sites

Já jsem to udělal jednodušeji, Obchodní podmínky(i s tím přiblým formulářem na odstoupení od smlouvy) jsem nakopíroval do potvrzujícího mailu. Práce na 2 minuty, je na zákazníkovi, jestli si to odroluje... ČOIka by měla být spokojená

Link to comment
Share on other sites

To je dobrá prasárna :D Mám to prozatím řešeno odkazem na pdf ke stažení. Doporučuji to i pokud máte přílohu. Už několikrát se mi stalo, že jsem měl zákazníka, který uvedl firemní email a jejich firewall nepustil žádné přílohy. Znáte zákazníky, můžou se otáčet na tom, že nic v emailu nebylo a tak požadují peníze za rok staré zařízení a ČOI se většinou moc obtěžuje s vyšetřováním kdo má pravdu :)

 

Ten formulář k odstoupení je taky povinný? Platí pro něj to samé co pro OP?

A ČOI spokojená? Jelikož každý právník si tento bod vykládá jinak, tak ani ČOI neví jak to má být správně :)

Link to comment
Share on other sites

To je dobrá prasárna :D Mám to prozatím řešeno odkazem na pdf ke stažení. Doporučuji to i pokud máte přílohu. Už několikrát se mi stalo, že jsem měl zákazníka, který uvedl firemní email a jejich firewall nepustil žádné přílohy. Znáte zákazníky, můžou se otáčet na tom, že nic v emailu nebylo a tak požadují peníze za rok staré zařízení a ČOI se většinou moc obtěžuje s vyšetřováním kdo má pravdu :)

 

Ten formulář k odstoupení je taky povinný? Platí pro něj to samé co pro OP?

A ČOI spokojená? Jelikož každý právník si tento bod vykládá jinak, tak ani ČOI neví jak to má být správně :)

 

Formulář povinný není, ale informace o odstoupení povinná je.

 

http://www.shoptet.cz/ke-stazeni/

Link to comment
Share on other sites

mello: Dokázal bys mi stručně vysvětlit, proč je nakopírování Obch. podmínek do mailu "Prasárna" ?

 

Mě to přijde jako jednoduché a funkční řešení. Ale prasárna? Není to trochu silné?

Link to comment
Share on other sites

mello: Dokázal bys mi stručně vysvětlit, proč je nakopírování Obch. podmínek do mailu "Prasárna" ?

 

Protože třeba já mám obchodní podmínky na 4 strany a to je hodně scrollování. Někteří zákazníci jsou schopni na tuto zprávu odpovídat a odpověď vložit doprostřed, nebo na konec... takže budeš scrollovat také.

 

Odkaz doporučuji mít zároveň s přílohou, z důvodu že firemní firewall zákazníkovi odstraní přílohu, nemůže tak říct, že neměl možnost pdf získat a uchovat. Prostě když chce zákazník eshopaře bít...

Link to comment
Share on other sites

Trochu se zamyslete ... 

myslíte si že od scrollování je to proč se toto zavádí?

 

Celá věc se má tak , člověk musí mít možnost ji buď stáhnout(nebo mu je zaslán) a  nebo by dle mého úsudku stačilo tlačítko PRINT .. důvod je jasný 

z důvodu ochrany spotřebitele aby někdo nemohl udělat po transakci změnu v obch. podm. pro případ sporu.

 

Pravda je že scrollovat 4x A4 ... to je celkem šílené 

Link to comment
Share on other sites

No jasně, ale když necháš jenom odkaz, tak to co je v odkazu můžeš libovolně měnit, to by asi nemělo jít. Resp. těžko budeš dokazovat, co přesně bylo tehdy a tehdy na onom odkazu ke stažení. Prostě je potřeba doložit, co jsi odeslal, takže příloha nebo mail... Já mám v každém notifikační mailu upozornění, že se jedná o notifikační mail, aby na něj příjemce neodpovídal. V potvrzení objednávky mám navíc formulku, že v souladu s novým Občanským zákoníkem jsou součástí potvrzení objednávky Obchodní podmínky a Formulář na odstoupení. Takže je na tom kterém zákazníkovi, jestli si ty podmínky přečte nebo ne, prostě je má v mailu. Já mám jasný důkaz, že jsem zákazníka s podmínkami seznámil.... Nevidím žádný problém.

Link to comment
Share on other sites

 

Díky, ale bohužel mi to nefunguje na 1.5.2.0. Nakopíroval jsem obchodni_podminky.pdf do rootu, přidal kód do classes/Mail.php hned za /* Send mail */

 

Nemáte nějaký nápad proč se příloha neposílá? Nebo mám špatně cestu k souboru?

 

 

Nejspíš to bude tím, jak jsem i dnes doplnil do původního příspěvku, že jsem to zkoušel na 1.5.6.2

A nebo tím, že jsem to vkládal PŘED /* Send mail */ :rolleyes:

 

 

 

 

zabza má v návodu drobnou chybu: "obchodni_podminky.pdf", "Obchodní podmínky.pdf". Název musí být stejný.  ;)

 

Pokud někdo bude chtít dát do přílohy více souborů nebo má multistore, tak návod je zde:

 

http://forum.c4.cz/prestashop-1-5-pdf-soubor-jako-priloha-v-odeslanem-emailu-t4680.html

 

Nemám. První obchodni_podminky.pdf je název souboru v rootu. Druhé, ty s českou interpunkcí, vytvoří to, že v příloze se zobrazuje název přílohy s interpunkcí a pokud si je příjemce stáhne tak se v počítači uloží s název s touto interpunkcí. Mě to tak alespoň funguje. (Win XP, SP3)

 

 

No jasně, ale když necháš jenom odkaz, tak to co je v odkazu můžeš libovolně měnit, to by asi nemělo jít. Resp. těžko budeš dokazovat, co přesně bylo tehdy a tehdy na onom odkazu ke stažení. Prostě je potřeba doložit, co jsi odeslal, takže příloha nebo mail... Já mám v každém notifikační mailu upozornění, že se jedná o notifikační mail, aby na něj příjemce neodpovídal. V potvrzení objednávky mám navíc formulku, že v souladu s novým Občanským zákoníkem jsou součástí potvrzení objednávky Obchodní podmínky a Formulář na odstoupení. Takže je na tom kterém zákazníkovi, jestli si ty podmínky přečte nebo ne, prostě je má v mailu. Já mám jasný důkaz, že jsem zákazníka s podmínkami seznámil.... Nevidím žádný problém.

 

V některých aplikacích, které provozuju je výslovně uvedeno, že na email nemají odpovídat, že nebude doručen a kolikpak jich asi odpoví? Ano, správně, je to víc než polovina. :angry:

 

jestliže jsi tvé OP  vytisknu tak si můžeš měnit co chceš, ( samozřejmě musí to mít náležitou hlavu a patu )

Ale , odeslání beru jako dobrou možnost. 

 

Pokud to vezmeme skutečně důsledně, je tištění i posílání obchodních podmínek je a jen obyčejná buzerace. Pokud si to lidi nepřečtou, tak jak to bylo dosud, tak jestli si někdo myslí, že si to nyní budou číst, tak se hodně plete.

 

Zákonná norma se změnou zákoníku zase tak moc obsahově nezměnila, ono posílání podmínek je výmysl, který vypotili samozvanci z organizace APEK. Problém je, že tahle samozvaná skupina zmxxů, která zastupuje jen nepatrné procento eshopářů (členů APEK je dle údajů z jejich webu 307, eshopů v ČR odhadem více než 35000) tvrdí, že to tak má být a lidi si to přečtou a myslí, že co APEK napíše je zákon. A to je to největší svinstvo.

  • Like 1
Link to comment
Share on other sites

Testuji nastavení na PS 1.5.6.2.
Kód:

                        /* Send mail */

    $message->attach(new Swift_Message_Attachment(file_get_contents("op.pdf"), "podminky.pdf", "application/pdf"));
    $send = $swift->send($message, $to, new Swift_Address($from, $from_name));
    $swift->disconnect();
    return $send;
    }
    catch (Swift_Exception $e) {
    return false;
    }
    }

 

odebral jsem podmínku na     if ($template == 'cs/order_conf') což by mělo zajistit odeslání přílohy vždy.

Email chodí bez problémů jen jaksi bez příloh :-(

Opravdu to někomu funguje?Dá se uvést příklad správná cesty pro vybrání souboru do přílohy?

Link to comment
Share on other sites

v souboru classes/Mail.php najděte tuto část kódu :

 

if ($file_attachment && !empty($file_attachment))
{
// Multiple attachments?
if (!is_array(current($file_attachment)))
$file_attachment = array($file_attachment);


foreach ($file_attachment as $attachment)
if (isset($attachment['content']) && isset($attachment['name']) && isset($attachment['mime']))
$message->attach(new Swift_Message_Attachment($attachment['content'], $attachment['name'], $attachment['mime']));
}

 

potom před řádek s if ($file_attachment && !empty($file_attachment)) dejte následujíci kod :

$message->attach(new Swift_Message_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/obchodni-podminky.pdf'), 'obchodni-podminky.pdf', 'application/pdf'));

do kořenového adresáře nahrajte vlastní soubor obchodni-podminky.pdf

 

 

nyní budete mít obchodní podmínky v příloze každého emailu, který zákaznikovi přijde. Mělo by to fungovat na všech verzích Prestashopu 1.5, ale jistý si jsem jen od verze 1.5.2 u starších myslím nebyla podpora více souborů v příloze.

 

samořejmě po odzkoušení doporučuji vše dát do override a před začátkem úprav zálohovat soubor classes/Mail.php

Edited by Ventos312 (see edit history)
Link to comment
Share on other sites

Viděl jsem, nastavil jsem, otestoval jsem  a stejně nic a nic nepřijde(tedy ta příloha) :(

 

Bylo by dobre vedet jakou verzi Prestashopu pouzivate. Kazdopadne ujistete se,ze trida Mail.php neni jiz prepsana v override nebo pokud jste upravu delal rovnou pres override tak jste vymazal soubor cache/class_index.php. Pokud mi poslete pristup mohu se podivat kde je problem.

Link to comment
Share on other sites

  • 2 weeks later...

Nakonec mi funguje na 1.5.3.1 návod z prvního postu. Bylo ale potřeba stejný kód vložit do override. Takže příloha se vloží jen do potvrzení. Více příloh jsem zatím nezkoušel.

 

Měl jsem ještě chybu v tom, že příloha se sice vložila, ale pdf bylo poškozené a nečitelné. Chyba byla v podtržítku v názvu přílohy. Ještě jsem musel vymazat application/pdf. Je důležité tomu říct, že jde o pdf? OS to snad pozná sám podle koncovky ne?

Link to comment
Share on other sites

  • 2 months later...

Třeba to někomu pomůže.

 

Problém obchodních podmínek jako přílohy emailu jsem řešil již na konci roku, aby od 1.1.2014 bylo vše připraveno.

Vycházel jsem z toho, že nejideálnější je přiložit je do emailu potvrzujícího objednávku. Jako jejich přílohu jsem přidal na konec pro jistotu i vzorový formulář pro odstoupení od smlouvy do 14 dnů.

 

Celý dokument jsem vyhotovil v PDF a nahrál do kořenového adresáře obchodu. Odkaz na tento soubor ke stažení jsem přidal i na konec znení OP které jsou zveřejněny na stránkách obchodu.

 

Po tomto nahrání jsem šel do souboru ..classes/Mail.php a vyhledal řádek 304

/* Send mail */
$send = $swift->send($message, $to, new Swift_Address($from, $from_name));
$swift->disconnect();

a před něj jsem vložil následující:

if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("obchodni_podminky.pdf"), "Obchodní podmínky.pdf", "application/pdf"));

Pochopitelně pokud je soubor obchodních podmínek jinde než v kořenovém adresáři je nutné uvést cestu k souboru obchodni_podminky.pdf.

 

Platí pro v. 1.5.x

 

 

---

Pár dní jsem tu nebyl, tak doplňuji, že 100% vyzkoušené to mám na 1.5.6.2 Je skutečně možné, že v jiných verzích to nefunguje.

Díky moc - funguje to skvěle a je to zdarma :-)

  • Like 1
Link to comment
Share on other sites

  • 1 month later...
  • 4 months later...

Díky za elegantní řešení jednoho z asi tisíce problémů při zprovozňování webu na prestě. Můžu odškrtnout.

Jen v tom vloženém kódu jsem u druhého názvu souboru (který se zobrazí v e-mailu) vynechal příponu, protože ta se vloží tou specifikací, že jde o pdf. Jinak tam byla přípona .pdf dvakrát.

 

Problém s nulovou velikostí přílohy a jejím neotevření spočívá v tom, že je ve vloženém kódu špatně specifikován zdrojový soubor, nebo cesta k němu a přílohou se nic neodešle. Já například jsem na začátku cesty měl zpětné lomítko /docs/dokumenty/VOP.pdf a mělo být docs/dokumenty/VOP.pdf

Link to comment
Share on other sites

  • 2 months later...

Ahoj, mám 1.6.0.14 a nejede :-(

 

/* Send mail */
if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("ObchodniPodminky.pdf"), "ObchodniPodminky.pdf", "application/pdf"));
if ($template == 'cs/order_conf')
$message->attach(new Swift_Message_Attachment(file_get_contents("OdstoupeniObjednavky.pdf"), "OdstoupeniObjednavky.pdf", "application/pdf"));
 
 
$send = $swift->send($message, $to_list, new Swift_Address($from, $from_name));
$swift->disconnect();
Link to comment
Share on other sites

Divné, jelikoz takhle funguje :-/

 

/* Send mail */

/*if ($template == 'cs/order_conf')*/
$message->attach(new Swift_Message_Attachment(file_get_contents('ObchodniPodminky.pdf'), 'ObchodniPodminky.pdf', 'application/pdf'));
/*if ($template == 'cs/order_conf')*/
$message->attach(new Swift_Message_Attachment(file_get_contents('OdstoupeniObjednavky.pdf'), 'OdstoupeniObjednavky.pdf', 'application/pdf'));
 
$send = $swift->send($message, $to_list, new Swift_Address($from, $from_name));
$swift->disconnect();
Edited by DandyK (see edit history)
Link to comment
Share on other sites

  • 5 months later...
  • 2 weeks later...

Pročetl jsem si zdejší diskuzi k problematice zasílání příloh k emailům, pokud se Vám nechce hrabat v kodu a ztrácet drahocenný čas řešením neustálých problémů pak mohu doporučit jeden z mých modulů a to [Modul] Přílohy v automaticky odesílaných e-mailech jedná se o komplexní modul, který umožňuje zaslat neomezené množství souborů v několika typech (*.pdf, *.csv, *.txt, *.xls, *.doc), a tyto přiřadit jen k určitým stavům objednávky, nebo do všech dle libosti

 

 

Modul lze využít i k zasílání reklamy nebo nabídkových listů, ceníků  atp....

  • Like 1
Link to comment
Share on other sites

  • 4 weeks later...
if ($template == 'order_conf'){
        $message->attach(new Swift_Message_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/obchodni_podminky.pdf'), 'obchodni_podminky.pdf', 'application/pdf'));
        $message->attach(new Swift_Message_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/podminky_vraceni_penez.pdf'), 'podminky_vraceni_penez.pdf', 'application/pdf'));
      }  

pro 1.6

Link to comment
Share on other sites

  • 7 months later...
if ($template == 'order_conf'){
        $message->attach(new Swift_Message_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/obchodni_podminky.pdf'), 'obchodni_podminky.pdf', 'application/pdf'));
        $message->attach(new Swift_Message_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/podminky_vraceni_penez.pdf'), 'podminky_vraceni_penez.pdf', 'application/pdf'));
      }  

pro 1.6

 

Dobrý den, tato úprava mi fungovala na verzi 1.6.1.2, bohužel po upgradu na 1.6.1.5  to nefunguje, po odeslání objednávky to skončí jen bílou stránkou. Je třeba na nejnovější verzi něakých změn v úpravě?

 

doplňuji:

v debug modu to vypisuje chybu

Fatal error: Class 'Swift_Message_Attachment' not found in /classes/Mail.php on line 361

 

kdy na tom řádku 361 je

$message->attach(new Swift_Message_Attachment(file_get_contents('ObchodniPodminky.pdf'), 'ObchodniPodminky.pdf', 'application/pdf'));
Edited by Evelina1 (see edit history)
Link to comment
Share on other sites

  • 1 month later...

 

Dobrý den, tato úprava mi fungovala na verzi 1.6.1.2, bohužel po upgradu na 1.6.1.5  to nefunguje, po odeslání objednávky to skončí jen bílou stránkou. Je třeba na nejnovější verzi něakých změn v úpravě?

 

doplňuji:

v debug modu to vypisuje chybu

Fatal error: Class 'Swift_Message_Attachment' not found in /classes/Mail.php on line 361

 

kdy na tom řádku 361 je

$message->attach(new Swift_Message_Attachment(file_get_contents('ObchodniPodminky.pdf'), 'ObchodniPodminky.pdf', 'application/pdf'));

Dobrý den,

 

vyřešil/la jste to prosím Vás? Mám stejný problém.

Edited by jkovac (see edit history)
Link to comment
Share on other sites

Dobrý den, bohužel nevyřešila. Dostala jsem radu zkopírovat z instalačního balíčku celý obsah složky tools/swift, ale to také nepomohlo.

Tak už jsem na to asi přišel. Ve verzi 1.6.1.5 přejmenovali funkci Swift_Message_Attachment na Swift_Attachment. Stačí změnit v původním funkčním kódu a mělo by to jít.

Link to comment
Share on other sites

  • 3 weeks later...

Tak nyní se soubory odešlou, ale mají nulovou hodnotu. To už bude jen chyba v umístění, nebo nějaká blbost. Mám to takto:

 

if ($template == 'order_conf'){
        $message->attach(new Swift_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/Obchodní_podmínky.pdf'), 'Obchodní_podmínky', 'application/pdf'));
        $message->attach(new Swift_Attachment(file_get_contents('._PS_ROOT_DIR_ '.'/Formulár_odstoupení_od_smlouvy.pdf'), 'Formulár_odstoupení_od_smlouvy', 'application/pdf'));
      }  
Link to comment
Share on other sites

VYŘEŠENO pro ostatní : použijte tento kód:

 

if ($template == 'order_conf'){
        $message->attach(new Swift_Attachment(file_get_contents('Obchodní_podmínky.pdf'), 'Obchodní podmínky', 'application/pdf'));
        $message->attach(new Swift_Attachment(file_get_contents('Formulár_odstoupení_od_smlouvy.pdf'), 'Odstoupení_od_smlouvy', 'application/pdf'));
      }  
Link to comment
Share on other sites

  • 1 month later...

 

VYŘEŠENO pro ostatní : použijte tento kód:

 

if ($template == 'order_conf'){
        $message->attach(new Swift_Attachment(file_get_contents('Obchodní_podmínky.pdf'), 'Obchodní podmínky', 'application/pdf'));
        $message->attach(new Swift_Attachment(file_get_contents('Formulár_odstoupení_od_smlouvy.pdf'), 'Odstoupení_od_smlouvy', 'application/pdf'));
      }  

,

 

zdravím,

dotaz - kam jste umístil soubor? protože dostávám taky nulový soubor. Případně jak jste to vyřešil?

 

UPDATE pro ostatní: 

vyřešil jsem to cestou... s lomitkem - "podminky" je adresar, kde je soubor uložen. (platí pro 1.6.1.6)

 

if ($template == 'order_conf'){

        $message->attach(new Swift_Attachment(file_get_contents('../podminky/soubor.pdf'), 'soubor.pdf', 'application/pdf'));

}

 

Jirka

Edited by jirka_malvin (see edit history)
Link to comment
Share on other sites

  • 3 weeks later...

Pokud byste to nechtěli řešit svépomocí a ztrácet tím čas, využijte můj modul :)

https://psmoduly.cz/obchodni-podminky-jako-priloha-do-e-mailu-potvrzeni-objednavky-38/prestashop-1-6-1-5.htm

Kompatibilní pro všechny verze PS s tím, že i pro nový typ odesílání v novějších PS. (otestováno i na 1.6.1.7)

Opravdu se to dalo vyřešit během pár minut ;) i bez modulu.

Link to comment
Share on other sites

Ano, o tom nepochybuji, ale jsou lidé, kteří s FTP pracovat neumí a pro ty je právě tento modul :) (a řekl bych, že takových lidí je celkem dost)

Kdo neumí s FTP tak si koupí modul a .......... Stačí na FTP do kořenové složky umístit soubor reklamacni_rad.pdf a/nebo obchodni_podminky.pdf a/nebo odstoupeni_od_smlouvy.pdf. Tyto soubory se poté automaticky připojí do potvrzovacího e-mailu. Je nutno zachovat přesně tyto názvy souborů.

 

Každého věc jak si to zařídí, ale tohle pobavilo :lol: 

Link to comment
Share on other sites

Já toto provádím klientům v rámci ceny. Víte? :)

 

(nutno podotknout, že z mojí zkušenosti klienti "vyššího levelu" zvládnou nahrát soubory na ftp, ale nechtějí zase editovat něco v kódu, aby něco nerozbili) 

 

Věřte mi, že kdyby se modul neprodával a nebyla po něm poptávka, nedělal bych ho. To platí o všech mých modulech...

no a já dokážu zadarmo komukoliv poradit jak to udělat bez modulu ;) ... o tom je toto forum. Sem by reklamy neměly patřit ... 

Link to comment
Share on other sites

Já to chápu, ale jak říkám, někdo si na to netroufne. Pokud Vás to pohoršuje, tak se omlouvám, nicméně, vidím statistiky prodeje a vidím, že zákazníci o tyto moduly prostě zájem mají... Proto si myslím, že jim to vyhovuje víc, než se hrabat v kódu (soudím i dle reakcí, co mi říkají klienti, když mi třeba telefonují).

 

 Většina klientů, pokud mají platbu kartou, podepisuje, že zajistí plnou bezpečnost přístupu na server. Upozornil jste je někdy, že přístup přes FTP je nebezpečný? Oni Vám dali přítup a tím porušili podmínky smlouvy?

 

Dominiku, a já vidím, že na eshopu nemáte např. reklamační řád a ani jsem se nikde nedočetl, jaké že je Vaše registrační číslo u UOOU.

To by také mohlo zajímat Vaše zákazníky (a nejen je).

 

... já myslím, že bychom tuto diskuzi mohli ukončit, co? ;) 

Link to comment
Share on other sites

Všichni, kteří Prestashop i jiné systémy dělají, tak vědí, že všechny práce se dělají přes FTP a každý klient samozřejmě dává přístupy na FTP. O tomlhe debatovat je naprosto mimo, spíše to uvádíte jen abyste si přihřál polívčičku. (popravdě netuším proč, jen jsem tu seriozne hodil neco, co jini klienti radi vyuzivaji).

Tak, ci tak, nejenom v pripade modulu, ale i beznych praci je samozrejme soucasti pristup na ftp, ale tak to má uplne kazdy realizator, at uz tvurce modulu, ci programator shopu, ci firma. Toto je vsude stejne, nechapu moc ten komentar v tomto smeru.

 

Moje klienty nezajímá reklamační řád, vše je uvedeno v obchodních podmínkách (https://psmoduly.cz/content/3-obchodni-podminky), nicméně, moje moduly fungují dobře a když nefungují, řeším to s klienty k jejich spokojenosti. Pokud je nějaký problém, který brání vyřešení, vracím peníze (stalo se to asi jen 2x zatím). Tím chci říci, že moji klienti nemají problémy s mými moduly, ani s mojí prací na Prestě.

 

Však já žádnou diskuzi nechtěl začínat, respektive, držel jsem se tématu, Vy jste začal řešit nějaké věci, které s tím vůbec nesouvisí, typu reklamacni rad, UOOU, nebezpecny FTP pristup atd. Já do těchto vod vůbec nešlápnul, já se držím tématu obchodní podmínky a jejich řešení. Nic víc.

 

Nechápu tento nepřátelský postoj :) Každopádně, opravdu nemám důvod se tu hádat o tom, jestli je správné dát FTP přístup, či nikoliv apod. (Každý, kdo je programátor, tak o tom ví své). Přijde mi to trošku zvláštní... Mám spoustu klientů a každý uděluje FTP přístup, jak mě, tak třeba i zahraničním vývojařům a nikdy s tím nebyl žádný problém.

 

To máte jako pravidlo, že ve městě je povolená rychlost většinou 50 kilometrů za hodinu, taky je to pravidlo, které se nedodržuje. Co víc k tomu napsat?

 

 

Mě zase štve, že dáváte do diskuze reklamu.To si dělejte jinde. Prostě to sem nepatří a basta. Mimochodem - reklamační řád sice nezajímá zákazníky, ale obchodní inspekci a UOOU. To byste zase měl vědět vy. 

A proč ten útočný tón? 

Děláte do eshopů a nemáte základní znalosti o tomto tématu. Mě štvou diletanti. Zůstaňte u kódování anebo eshopy dělejte pořádně, tak jak se má. 

Pokud Váš eshop nevyhovuje legislativě, tak nedávejte reklamu kam nepatří, protože se Vám to může vrátit jako bumerang.

A pokud to neumíte, najměte si na to ty, co to umí.

 

A do IT dělám už 30 let. Okolo eshopů se motám 15 let. Správný programátor přístup FTP ani na serveru nezřídí ;) A když už tam je, tak ho nedá nikomu jinému (na to je přece SFTP, SSH apod.). A správně udělaný modul nepotřebuje přístup FTP - na to je přeci admin rozhraní v Prestashopu, kde nahrajete zip soubor. 

Link to comment
Share on other sites

 

Pane, nehodlám se hádat, takže se již zdržím reakce, a to i přesto, že bych měl nějaké výhrady k tomu, co píšete. Ale nechci už tu spamovat diskuzi, takže pro dobro diskuze již tedy ode mě bez reakce, ať tu není flame z jedné strany na druhé.

 

EDIT:

Ale jo, prostě musím reagovat - Bodově jen stručně: (nic ve zlém, pouze na upřesnění)
Jsem programátor/kóder - pro klienty dělám moduly a shopy, neřeším pro klienty obsah, marketing, právo a nic faůšé, to si řeší klienti sami. Dělám "pouze" kódování a programování, nic víc, nic míň.
FTP - tak v tom případě jsem potkal zatím samé špatné programátory/majitele shopu. Co tak vím, tak z mých klientů ná SFTP/SSH tak 1%. Ostatních 99% má pouze FTP, protože na normálním hostingu to tak prostě je (a to je prostě fakt).

Modul FTP vs admin - modul by samozřejmě šel upravit, aby nebyl potřeba FTP přístup a aby to šlo nahrát z adminu, to je jasné, uznávám, ale zatím jsem neměl čas to předělávat, mám něco přes stovku modulů. Tato úprava je to na to todo listu. Btw, i přes adminsitraci se dá dostat na ftp... (takže nedávat FTP, ale dát admin je prakticky stejný "zločin").

 

 

Když uděláte dobře modul, nemusí Vám klient dát admin přístup a modul si může nahrát sám. 

 

Nechci abyste hlídal klientům marketing, nebo obsah - ale říkám Vám, že to máte VY ve svém eshopu špatně - opravte si to a zaregistrujte se na UOOU (je to zdarma). Opravdu nezveřejňujte, že máte přístup k jiným eshopům se špatným zabezpečením nebo k adminu, protože to může zajímat úřady, které si můžou vyžádat podrobnosti - tj. jestli jsou dodržovány pravidla UOOU. Moduly kódovat umíte - a pokud je chcete prodávat přes eshop, natudujte si problematiku. Zákony platí i pro Vás i pro Váš eshop. Pokud to neumíte, nebo nemáte čas, najměte si někoho, kdo dané problematice rozumí - stejně tak si najímají klienti Vás. Pokud to neuděláte, tak nedávejte reklamu tam, kam nepatří - protože pak se někdo zaměří na Váš eshop (práve proto že ho štvou nevyžádané reklamy) zda tam máte vše potřebné a zda dodržujete legislativu. 

 

Na reklamu si využijte jiné nástroje a nespamujte ve forech, která k tomu nejsou určená. O tom byla celá tato diskuze.

 

J.

Link to comment
Share on other sites

Funkční řešení poslání přílohy v potvrzení objednávky (Obchodní podmínky a Poučení o odstoupení) na Prestashop 1.6.1.15:

 

v souboru /classes/Mail.php

 

najít řádek:  /* Send mail */ a před něj vložit:

if ($template == 'order_conf'){
	$file = _PS_ROOT_DIR_ . '/obchodni-podminky.pdf';
        $message->attach(new Swift_Attachment(file_get_contents($file), 'obchodni-podminky.pdf', 'application/pdf'));
}
if ($template == 'order_conf'){
	$file = _PS_ROOT_DIR_ . '/pouceni-odstoupeni-od-smlouvy.pdf';
        $message->attach(new Swift_Attachment(file_get_contents($file), 'pouceni-odstoupeni-od-smlouvy.pdf', 'application/pdf'));
}

Oba soubory musí být v root adresáři. Název souborů bez mezer a interpunkcí. Funguje, odzkoušeno.

Edited by N3S4 (see edit history)
Link to comment
Share on other sites

Funkční řešení poslání přílohy v potvrzení objednávky (Obchodní podmínky a Poučení o odstoupení) na Prestashop 1.6.1.7:

 

v souboru /classes/Mail.php

 

najít řádek:  /* Send mail */ a před něj vložit:

if ($template == 'order_conf'){
	$file = _PS_ROOT_DIR_ . '/obchodni-podminky.pdf';
        $message->attach(new Swift_Attachment(file_get_contents($file), 'obchodni-podminky.pdf', 'application/pdf'));
}
if ($template == 'order_conf'){
	$file = _PS_ROOT_DIR_ . '/pouceni-odstoupeni-od-smlouvy.pdf';
        $message->attach(new Swift_Attachment(file_get_contents($file), 'pouceni-odstoupeni-od-smlouvy.pdf', 'application/pdf'));
}

Oba soubory musí být v root adresáři. Název souborů bez mezer a interpunkcí. Funguje, odzkoušeno.

Ahoj,

už jsem tady psal, že to funguje. Jinak to nemusí bezpodmínečně být přímo v hlavním/root adresáři, může se udělat jakýkoliv (aby nebyl nepořádek v souborech), ale pak musí být odkaz na ten adresář. ./adresar/soubor.pdf

 

Jirka

Link to comment
Share on other sites

  • 3 months later...

Když to zkouším na 1.6.1.10 hází mi to následující chyby:

 

Notice: Undefined variable: currency in /home/www/doprovazejme.cz/subdomeny/www/www/modules/bankwire/controllers/front/validation.php on line 64

Notice: Trying to get property of non-object in /home/www/doprovazejme.cz/subdomeny/www/www/modules/bankwire/controllers/front/validation.php on line 64

Parse error: syntax error, unexpected 'catch' (T_CATCH) in /home/www/doprovazejme.cz/subdomeny/www/www/classes/Mail.php on line 396

 

V modulu bankwire jsem upravovala jen soubor *.tpl pro smazani textu týkající se měny a pak odstranění majitele účtu.

V mail.php kromě kódu z tohoto vlákna není upravováno nic.

 

Můžete mi, prosím, poradit? Děkuji.

Link to comment
Share on other sites

Tak currency odstraněno, nyní už je jen chyba:

 

Parse error: syntax error, unexpected 'catch' (T_CATCH) in /home/www/doprovazejme.cz/subdomeny/www/www/classes/Mail.php on line 396

 

 

       return $send;

        } catch (Swift_SwiftException $e) {
            PrestaShopLogger::addLog(
                'Swift Error: '.$e->getMessage(),
                3,
                null,
                'Swift_Message'
            );
 
            return false;
        }
Edited by switch42 (see edit history)
Link to comment
Share on other sites

  • 3 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...