LINUX.ORG.RU

Отправка почты через php

 , ,


1

1

Привет все. Такая сиуация. есть VPS, на нем поднят apache2, php5. Пытаюсь отправить почту.

<?php
$subject = "Тестовое сообщение";
$message = "Текст сообщения";
$headers = "From: macik1@name.com";
mail( "macik2@name.com", $subject, $message, $headers);
?>
сам скрипт UTF-8, письмом приходит в таком виде: http://cl.ly/L4YS исходный код:
Return-Path: <www-data@host1.ua>
Delivered-To: macik1@local.com
Received: from localhost (localhost [127.0.0.1])
	by mail.local.com (Postfix) with ESMTP id B1793183A46
	for <macik1@local.com>; Fri, 23 Nov 2012 16:38:00 +0200 (EET)
Received: from mail.local.com ([127.0.0.1])
	by localhost (mail.local.com [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id hxHG4gorZJCr for <macik1@local.com>;
	Fri, 23 Nov 2012 16:38:00 +0200 (EET)
Received: by mail.local.com (Postfix, from userid 5000)
	id 97C36183A47; Fri, 23 Nov 2012 16:38:00 +0200 (EET)
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.local.com
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham
	version=3.3.1
Received: from host1.ua (host1.ua [78.47.178.205])
	by mail.local.com (Postfix) with ESMTPS id 9B798183A46
	for <macik1@local.com>; Fri, 23 Nov 2012 16:37:55 +0200 (EET)
Received: from host1.ua (localhost [127.0.0.1])
	by host1.ua (8.14.4/8.14.4/Debian-2ubuntu2) with ESMTP id qANEXova023753
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
	for <macik1@local.com>; Fri, 23 Nov 2012 16:33:50 +0200
Received: (from www-data@localhost)
	by host1.ua (8.14.4/8.14.4/Submit) id qANEXoAK023752;
	Fri, 23 Nov 2012 16:33:50 +0200
Date: Fri, 23 Nov 2012 16:33:50 +0200
Message-Id: <201211231433.qANEXoAK023752@host1.ua>
To: macik1@local.com
Subject: =?UTF-8?B?w5DCosOQwrXDkcKBw5HCgsOQwr7DkMKyw5A=?=
 =?UTF-8?B?wr7DkMK1IMORwoHDkMK+w5DCvsOQwrHDkcKJw5DCtcOQwr3DkMK4w5DCtQ==?=
X-PHP-Originating-Script: 0:php.php
From: macik1@local.com
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: BASE64

w5DCosOQwrXDkMK6w5HCgcORwoIgw5HCgcOQwr7DkMK+w5DCscORwonDkMK1w5DCvcOQwrjDkcKP

Помогите как исправить, наверно надо что то настроить в php и apache?!


Кодировка - кодировкой, это отдельный вопрос. А вот www-data@host1.ua - это ожидаемый envelope from, или про это мыслей не было пока ?

AS ★★★★★ ()
Ответ на: комментарий от xorik

все это хорошо... но вопрос не про это ...

PS

«зачем не грузовик если я хочу коробку спичек перенести»?

macik ()
Ответ на: комментарий от macik

Сообщение отправляется с mail from:<www-data@host1.ua>. Это существующий E-Mail ? На него может быть доставлено уведомление об ошибке доставки ? Он пройдёт проверку smtp callback ?

В общем-то, незнание того, что в mail from подставляется вовсе не значение $headers = «From: macik1@name.com» - распространённая проблема современных php-кодеров... Да и не только php...

AS ★★★★★ ()
Ответ на: комментарий от AS

адрес не существует ...

Проверка адреса отправителя у меня на сервере отключена.

Я сообщение получаю проблема не в этом. Тут я не могу прочитать письмо, а почему письмо так странно кодируется я понять не могу. Такое впечатление, что оно два раза в гонятся в кодировку и еще и разную.

macik ()
Ответ на: комментарий от macik

Я сообщение получаю проблема не в этом.

Это не значит, что получит кто-то другой. Не надо привыкать использовать mail() без -f. Правильно так:

mail( «macik2@name.com», $subject, $message, $headers, "-f<macik1@name.com>" );

AS ★★★★★ ()
Ответ на: комментарий от macik

А что касается кодировки, откуда в заголовке берётся

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: BASE64

Это mail() такое умеет ? Я не то, чтобы PHP-программист, но думаю пока, что этой функции надо давать всё готовое.

AS ★★★★★ ()
Ответ на: комментарий от AS

Это не значит, что получит кто-то другой. Не надо привыкать использовать mail() без -f. Правильно так:

учту.

А что касается кодировки, откуда в заголовке берётся

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: BASE64

Это mail() такое умеет ? Я не то, чтобы PHP-программист, но думаю пока, что этой функции надо давать всё готовое.

Меня это тоже удивляет. На других хостингах если явно не указывать то этих данных в заголовке просто нет. А тут mail сам их вставляет и по всей видимости кодирует. Но как то не правильно.

macik ()
Ответ на: комментарий от macik

А тут mail сам их вставляет и по всей видимости кодирует. Но как то не правильно.

Есть подозрение, что это не mail() делает, а что-то ещё. Или функция mail переопределена, если в php такое возможно.

AS ★★★★★ ()
Ответ на: комментарий от AS

Есть подозрение, что это не mail() делает, а что-то ещё. Или функция mail переопределена, если в php такое возможно.

Если я с терминала отправляю, то все правильно уходит. А вот через php то кодировка присватывается. ХЗ что это такое.

macik ()
Ответ на: комментарий от AS

Это mail() такое умеет ? Я не то, чтобы PHP-программист, но думаю пока, что этой функции надо давать всё готовое.

дык это внешняя программа работает. sendmail по дефолту, а я помнится msmtp юзал. Настраивается в конфиге апача. (и в конфиге программы отправки конечно). Это же не венда...

drBatty ★★ ()
Ответ на: комментарий от AS

Sendmail сам ничего не добавляет.

mail() тем более не добавляет. Оно вообще всё тупо сливает тому, что там в sendmail_path прописано.

drBatty ★★ ()
Ответ на: комментарий от drBatty

посмотри php.ini секцию [mail function]

вот что тут есть:

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = no-reply@zet.com.ua

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
;sendmail_path = 

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = On

; The path to a log file that will log all mail() calls. Log entries include
; the full path of the script, line number, To address and headers.
mail.log = /var/log/mail.php.log

macik ()
Ответ на: комментарий от drBatty

mail() тем более не добавляет

Ну я больше в Sendmail уверен. :-)
В общем, надо искать, кто вызывается между mail() и sendmail.

AS ★★★★★ ()
Ответ на: комментарий от macik

Надо сообразить... Можно попробовать написать

sendmail_path = cat > /tmp/qqwwee

и посмотреть, что будет в /tmp/qqwwee. Кажется, должно получиться.

AS ★★★★★ ()
Ответ на: комментарий от drBatty

у тебя вообще, sendmail?

Sendmail 8.14.4:

Received: (from www-data@localhost)
by host1.ua (8.14.4/8.14.4/Submit) id qANEXoAK023752;
Fri, 23 Nov 2012 16:33:50 +0200

Если кто-то не подделывает. Но Received типичный.

AS ★★★★★ ()
Ответ на: комментарий от AS

Можно попробовать написать sendmail_path = «cat > /tmp/qqwwee»

fixed

drBatty ★★ ()
Ответ на: комментарий от macik

после этого изменения в php.ini сообщение по скрипту пишет что ушло, а на почте его нет.

Конечно не будет. Цель - загнать его в файл /tmp/qqwwee, чтобы увидеть, что там получилось до sendmail. А вот если по скрипту ошибка, значит так просто не выходит... Возможно, «>» в конфиге php как-то не так обрабатывается. А, может, файл создался всё же ?

AS ★★★★★ ()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от AS

А, может, файл создался всё же ?

Создался, но не моим скриптом а wordpress его создал и поместил туда полностью все сообщение которое кто то отправлял через wordpress.

To: jasonwjanes@yahoo.co.uk
Subject: =?UTF-8?B?PT9VVEYtOD9CPzBKTFJnZEMxMExQUXZpRFF2?=
 =?UTF-8?B?OUMrMEwzUXRkQzgwTDNRdnRDejBZTWdMaTR1T2lEUW45Q3cwWURRdnRDNz89?=
 =?UTF-8?B?CiA9P1VURi04P0I/MFl3PT89?=
Date: Fri, 23 Nov 2012 23:13:42 +0200
Return-Path:  тут было мое мыло
From: =?UTF-8?B?0JLRgdC10LPQviDQv9C+0L3QtdC80L3QvtCz0YMgLi4u?= <maciborka@gmail.com>
Message-ID: <26e4e7eb8d998e8375f5809dd8157926@macik.net>
X-Priority: 3
X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.4]
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="UTF-8"

Ваше имя пользователя: gzbobji 
Ваш пароль: 3WAySe28N4fm 
Вы можете сейчас войти в систему: http://macik.net/bbpress/ 

ВпереÐ

macik ()
Ответ на: комментарий от macik

Создался, но не моим скриптом а wordpress его создал и поместил туда полностью
все сообщение которое кто то отправлял через wordpress.

Ну так интересно-то скриптом.

Только стоп. Если там что-то рабочее, сайт, например, то отключить бы на время эксперимента, чтобы почту не потерять. И делать быстро.

AS ★★★★★ ()
Ответ на: комментарий от AS

фиг сним с этим сайтом ... Мне он сейчас не важен. Сообщения и так приходят как чушь ...

Я включил тут лог для mail() (mail.log = /var/log/mail.php.log), и он вот что вбивает:

mail() on [/var/www/star.zet.com.ua/php.php:12]: To: мое@мыло -- Headers: From: мое@мыло MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: BASE64

macik ()
Ответ на: комментарий от macik

MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: BASE64

получается, что кто-то уже добавил. Значит, не sendmail. А то сообщение, которое вордпрес отправляет, нормальное получается, или, тоже, битое ?

AS ★★★★★ ()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от macik

И что не так? Сообщение в юникоде, чарсет прописан в заголовке правильный. Если твоя вебморда не умеет читать такие письма - попробуй в бровсере кодировку выставить принудительно.

anonymous ()
Ответ на: комментарий от anonymous

Сообщение в юникоде, чарсет прописан в заголовке правильный.

Речь про то, которое в самом начале, в base64. Оно битое. И кто кодирует в base64 - не ясно.

AS ★★★★★ ()
Ответ на: комментарий от anonymous

И что не так? Сообщение в юникоде, чарсет прописан в заголовке правильный. Если твоя вебморда не умеет читать такие письма - попробуй в бровсере кодировку выставить принудительно.

Все не так. Не один клиент это сообщение прочитать не может. Оно битое!

macik ()
Ответ на: комментарий от AS

получается, что кто-то уже добавил. Значит, не sendmail. А то сообщение, которое вордпрес отправляет, нормальное получается, или, тоже, битое ?

сообщение с wordpress тоже битые. С любого скрита на сервер.

Тут еще одно но. Когда я в скрипте сам указываю все тело письма, то оно падает в

cat /tmp/qqwwee
когда нет, то его там нет и оно только светится в логе

macik ()

попробуй сам в скрипте принудительно переопределить заголовки:

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
mega_venik ★★★ ()

сам скрипт UTF-8

А это точно ? И, точно, хостер с php не делал ничего ? Если посмотреть соответствующий пакет в Убунте, он совпадает ?

AS ★★★★★ ()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от mega_venik

попробуй сам в скрипте принудительно переопределить заголовки:

пробовал все Transfer-Encoding ... эффект один.

macik ()
Ответ на: комментарий от AS

А это точно ? И, точно, хостер с php не делал ничего ? Если посмотреть соответствующий пакет в Убунте, он совпадает ?

А как это сделать? Как проверить совпадение?

macik ()
Ответ на: комментарий от AS

Вы не поверите !!! Я уже просто задолбался и плюнул на все!!!

Вызвал обновление всей системы. Оказалось что php и apache захотели обновится. И вот инсталлятор предложил обновить и php.ini на тот что в обдейте, я согласился!

И «О чудо»!!! Все заработало!

Сообщение без тела стало приходить без кодировки, а если я указываю тело письма то все приходит как надо.

Вот теперь я в догадках, что это было?! И кто виноват?!

macik ()
Ответ на: комментарий от macik

что это было?!

сравни командой diff старый и новый конфиг. ПМ вообще-то должен старый вариант оставлять (переименовывать).

drBatty ★★ ()
Ответ на: комментарий от macik

Вот теперь я в догадках, что это было?!

Может быть, хостер поставил PHP какой-то своей сборки, в которой хотел реализовать кнопку «сделать хорошо». Теперь выяснить сложно, если старого пакета нет. Хотя, возможно, нужен пакет с исходниками даже.

AS ★★★★★ ()
Ответ на: комментарий от drBatty

сравни командой diff старый и новый конфиг.

Боюсь, дело не в конфиге, а в каком-нибудь патче. Хотя, кто знает...

AS ★★★★★ ()
Ответ на: комментарий от AS

Боюсь, дело не в конфиге, а в каком-нибудь патче. Хотя, кто знает...

обычно такая ерунда бывает, когда скажем sendmail пропатчили, а php забыли. Или наоборот. Выясняется не сразу, потому как многие юзают latin1, а там УНВР.

drBatty ★★ ()
Ответ на: комментарий от drBatty

обычно такая ерунда бывает, когда скажем sendmail пропатчили

sendmail, во-первых, патчить на эту тему бессмысленно, я даже не знаю таких случаев. Во-вторых, выяснили же, что письмо такое получается до sendmail.

AS ★★★★★ ()
Ответ на: комментарий от AS

sendmail, во-первых, патчить на эту тему бессмысленно, я даже не знаю таких случаев. Во-вторых, выяснили же, что письмо такое получается до sendmail.

ну значит какой-то глюк php. или там апача... Не знаю.

drBatty ★★ ()
Ответ на: комментарий от drBatty

скорее всего патч был на php или apache ... Я как раз обратил, что только эти пакеты обновились.

вообще все это странно. Хостер сам в шоке, они утверждают что целый консилиум собрали. И у них нехрена не выходило.

macik ()
Ответ на: комментарий от macik

понятно, что я могу только гадать, что там у вас было, но мне кажется, что проблема всё-же в кодировке - utf-8 невозможно передать через неправильную кодировку (например latin1, в ней не определены 127..159), потому пришлось преобразовать в base64. Впрочем, почтовые клиенты просто обязаны понимать base64, и автоматически её раскодировать.

drBatty ★★ ()
Ответ на: комментарий от drBatty

понятно, что я могу только гадать, что там у вас было, но мне кажется, что проблема всё-же в кодировке - utf-8 невозможно передать через неправильную кодировку (например latin1, в ней не определены 127..159), потому пришлось преобразовать в base64. Впрочем, почтовые клиенты просто обязаны понимать base64, и автоматически её раскодировать.

Я больше склоне думать что система два раза кодировала файл и причем скорее всего не только в base64

Тот же скрипт работал правильно на других системах.

macik ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.