Друзья, помогите разобраться Заполняю форму на странице "свяжитесь с нами", указываю ИМЯ - ААА ПОЧТА - БББ@ya.ru ТЕКСТ ПИСЬМА ставлю галку "я не робот" и на почту, указанную в общих настройках приходит письмо с Правильным именем, правильным содержанием, но неверным адресом почты (не БББ@ya.ru, а ГГГ@gmail.com), ясен хрен ответить я не могу адресату. В настройках Опенкарт есть вкладка "почта" Какие там настройки нужно прописать если используется gmail для отправки почты с сайта на gmail?
Если ГГГ@gmail.com - это почта админа, то всё правильно. Если подставлять отправителем почту из формы, она будет отклоняться всеми (или почти всеми) почтовыми сервисами с ошибкой "550 relay not permitted", потому что нельзя отправлять почту от имени кого угодно - это фишинг. Можно добавить к письму поле "Reply-To", тогда проблем быть не должно.
А как же люди получают письма из этой формы в стандартном опенкарте? если мне пишет юзер и я вижу админскую почту - это же дикий баг. Как это исправить? может в форме чтото поменять надо? Поле стандартной формы на стандартной странице Contact us Код: <input name="email" value="" id="input-email" class="form-control" type="text"> Но как мне кажется чтото не то в настройках VPS сервера, потому что я ипользую SMTP Gmail в настройках почты опенкарт, а не PHP mail server
А вы полистайте форум русскоязычного сообщества ОК - там куча тем о том, что как раз не получают. И во всех случаях решение - поправить класс отправки почты, чтоб отправителем была почта админа, а не из формы. Не форме, а в классе Mail. И я уже написал выше, что именно:
можете ли подсказать куда этот класс добавить? потому что видел человек советует немного иной путь Код: $mail->setFrom($this->request->post[’email’]); Вместо нее нужно добавить $mail->setFrom($this->config->get(‘config_email’)); . Э, а как я буду узнавать адрес и имя отправителя? Ищем чуть ниже $mail->setText(strip_tags(html_entity_decode($this->request->post[‘enquiry’], ENT_QUOTES, ‘UTF-8′))); и меняем на $mail->setText(strip_tags(html_entity_decode($this->request->post[‘enquiry’].”\n”.$this->request->post[’email’].” (“.$this->request->post[‘name’].”)”, ENT_QUOTES, ‘UTF-8′))); и у меня же VPS, может легче настроить MAIL чем SMTP?
Ну, тут просто адрес отправителя добавляется в тело письма. Это довольно очевидный вариант, который, как я понял, вам не подходит, потому что для ответа нужно вручную прописывать адресата при ответе. Если у вас двойка, то всё просто - в /catalog/controller/information/contact.php: PHP: $mail->setFrom($this->config->get(‘config_email’));$mail->setReplyTo($this->request->post[’email’]); В 1.5 метода setReplyTo ещё не было, так что там нужно шаманить внутри /system/library/mail.php Это ничего не изменит! Дело не в SMTP, а в том, что когда какой-нибудь почтовый сервис получает письмо, он смотрит на адрес отправителя, берёт оттуда домен и проверяет, разрешил ли этот домен отправку почты с ip вашего сервера (а он конечно же не разрешил, как и серверам Gmail). У разных сервисов разная политика на этот счёт: кто-то сразу отклоняет письма с "левых" ip, кто-то отправляет в спам, некоторые делают задержку доставки на какое-то количество часов. В общем, нельзя ставить отправителем какие попало адреса.
Добрый день, не подскажете эти строки нужно добавить в файл? у меня они есть и все равно нету емейла отправителя в письме( Вот участок кода из файла у меня↓ Код: if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $mail = new Mail($this->config->get('config_mail_engine')); $mail->parameter = $this->config->get('config_mail_parameter'); $mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname'); $mail->smtp_username = $this->config->get('config_mail_smtp_username'); $mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); $mail->smtp_port = $this->config->get('config_mail_smtp_port'); $mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout'); $mail->setTo($this->config->get('config_email')); $mail->setFrom($this->config->get('config_email')); $mail->setFrom($this->config->get(‘config_email’)); $mail->setReplyTo($this->request->post[’email’]); $mail->setReplyTo($this->request->post['email']); $mail->setSender(html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8')); $mail->setSubject(html_entity_decode(sprintf($this->language->get('email_subject'), $this->request->post['name']), ENT_QUOTES, 'UTF-8')); $mail->setText($this->request->post['enquiry']); $mail->send(); $this->response->redirect($this->url->link('information/contact/success')); } Точнее этот код, там я вставлял для сравнения те строки... Код: public function index() { $this->load->language('information/contact'); $this->document->setTitle($this->language->get('heading_title')); if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { $mail = new Mail($this->config->get('config_mail_engine')); $mail->parameter = $this->config->get('config_mail_parameter'); $mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname'); $mail->smtp_username = $this->config->get('config_mail_smtp_username'); $mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); $mail->smtp_port = $this->config->get('config_mail_smtp_port'); $mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout'); $mail->setTo($this->config->get('config_email')); $mail->setFrom($this->config->get('config_email')); $mail->setReplyTo($this->request->post['email']); $mail->setSender(html_entity_decode($this->request->post['name'], ENT_QUOTES, 'UTF-8')); $mail->setSubject(html_entity_decode(sprintf($this->language->get('email_subject'), $this->request->post['name']), ENT_QUOTES, 'UTF-8')); $mail->setText($this->request->post['enquiry']); $mail->send(); $this->response->redirect($this->url->link('information/contact/success')); }
Оно не в письме должно быть, а в заголовках. Если вы попробуете ответить на такое письмо, то адресатом будет почта из ReplyTo.
Оно уже должно быть не в письме (выше написал где). Если нужно именно в письме, надо приклеить $this->request->post['email'] к $this->request->post['enquiry'].
Это вот так приклеить? Код: $mail->setSubject(html_entity_decode(sprintf($this->language->get('email_subject'), $this->request->post['name']), ENT_QUOTES, 'UTF-8')); $mail->setText($this->request->post['enquiry'], $this->request->post['email']); $mail->send(); $this->response->redirect($this->url->link('information/contact/success')); Если так, то так не работает, по другому хз как, пробовал еще варианта 3.... просто я в этом не совсем понимаю
Ну, почти. Для конкатенации строк в php используется символ точки. А setText принимает только один аргумент (запятая означает, что вы добавили второй).
И как быть тогда? Я пробовал: Код: $mail->setText($this->request->post['enquiry'].$this->request->post['email']); $mail->setText($this->request->post['enquiry'] + $this->request->post['email']); $mail->setText($this->request->post['enquiry']. + $this->request->post['email']); Не работает) --- Добавлено, 5 июн 2018 --- А где вообще менять это все нужно? в /catalog/controller/information/contact.php ????? Просто я удалил часть текста и никаких изменений, моэет это не этот файл надо? или изменения вступают через какое-то время??
Вы знаете, что такое OCMOD (модификаторы)? Знаете, что после любых правок в файлах надо обновлять кеш окмод, чтоб эти правки начали работать? Первый вариант правильный. Второй вариант - это конкатенация не для php, а, например, для Python или JS. Третий вариант - полнейший бред.
А... все, заработало)))) спасибо большущее))) только 1 вопрос, как пробел влепить после текста? а то текст вместе с мейлом слитно приходит...
Код: $mail->setText($this->request->post['enquiry'].' '.$this->request->post['email']); Если я правильно понял то вот так↑ Работает) Спасибо еще раз))