ugrás a tartalomhoz

E-mailek "átirányítása" eredeti fejlécek (Cc, Bcc, To, From, DKIM, stb.) megtartásával

sandrosdj · 2017. Júl. 31. (H), 15.08
Sziasztok!

Készítettem egy rendszert, amely megadott adatok alapján (imap szerver, user, jelszó, mailbox) csatlakozik egy távoli levélszerverhez, majd ott kikeresi az olvasatlan üzeneteket és átküldi egy megadott címre.

Folyamat nagyjából: Levelet elküldték ide: a##kukac##a.com ----> Megérkezett ide: b##kukac##b.com ----> script megtalálja a levelet, majd imap_mail-lel továbbküldi ide: c##kukac##c.com

Jelenleg ha benne hagyom a To-t, From-ot, Cc-t, Subject-et (meg még párat), akkor több problémával is szembesülök. Ilyenek pl: ha van Cc az eredeti levélben, akkor továbbításnál újra megkapják az abban szereplők, a subject kétszer lesz benne, a To kétszer lesz benne és az új címre (c) és az eredeti címre (b) is kimegy, From ugyanígy kétszer lesz benne.

Ezekre jelenleg az a megoldásom, hogy átírom a nevüket (Pl: To -> X-Original-To), de ez nem célszerű, hiszen így az utolsó címen (c) nem az a cím lesz látható, amire eredetileg küldték, a Cc-k pedig nem is látszanak csak ha megnézem az üzenet forrását.

Hogyan lehetne megoldani, hogy a levél a fejlécek minimális módosításával kerüljön át a végső címre? Tehát tartsa meg a címzett eredeti nevét és címét, a másolatot kapókat (ne küldje ki nekik mégegyszer), és akár a DKIM-et (bár ez annyira nem lényeges most).

(Cél mailszerverhez van mindenféle hozzáférésem, ugyanakkor annak babrálása nélkül szeretném megoldani. Az outlook is tud forwardolni/redirectelni levelet úgy, hogy nem változnak ezek az adatok.)

A hozzászólásokat előre is köszönöm! :)
 
1

Fejlec

janoszen · 2017. Júl. 31. (H), 20.00
A tovabbitas teljesen fuggetlen a fejlecekrol. Az egyetlen kivetel itt a Received fejlec, itt persze feltuntetesre kerulnek az ujboli kuldes altal erintett szerverek. A celszervernek persze el kell fogadnia a leveleket, vagyis a kuldo szervert fel kell venni a trusted szerver listaba.

Amire itt figyelned kell, hogy az a szerver amin keresztul kuldod a levelet fogadja is el a levelet modositas nelkul, illetve a program amit a kuldeshez hasznalsz ne akarjon beleturmakolni. (Azaz a phpmailer es haverjai egybol kiesnek, illetve a mail() fuggveny PHP-ban szinten.)

Ha ennel tobb segitsegre vagysz, muti a kodot.
2

Az oké, csak jelenleg nem

sandrosdj · 2017. Aug. 1. (K), 11.23
Az oké, csak jelenleg nem tudom továbbítani a levelet anélkül, hogy az imap_mail vagy php mail() belenyúlna/értelmezné azt, amit nem kéne.

if ($mbox = imap_open($host.$data->eiaMailbox, $data->eisUsername, $data->eisPassword)) :
  $mails = imap_search($mbox, 'UNSEEN');
  if (!empty($mails)) :
    foreach ($mails AS $mail) :
$overview	= imap_fetch_overview($mbox, $mail)[0];

$header		= preg_replace('~(*BSR_ANYCRLF)\R~', "\r\n", preg_replace_callback('/^([a-z\d_-]+.?)/mi', function ($m)
{
	switch (rtrim(strtolower($m[0]), ':')) :
		case 'to':					return 'X-Original-To:';		break;
		case 'subject':				return 'X-Original-Subject:';	break;
		case 'received':			return 'X-O-Received:';			break;
		case 'return-path':			return 'X-O-Return-Path:';		break;
		case 'delivered-to':		return 'X-O-Delivered-To:';		break;
		case 'message-id':			return 'X-O-Message-Id:';		break;
		case 'dkim-signature':		return 'X-O-DKIM-Signature:';	break;
		case 'x-mailer':			return 'X-O-Mailer:';			break;
	endswitch;

	return $m[0];
}, imap_fetchheader($mbox, $mail)));

$extra_header = [
	'X-Mailer'		=> 'PHP-Resender',
	'X-Resent'		=> 'Yes',
	'Resent-From'	=> '<'.$overview->to.'>',
	'Resent-Date'	=> date('D, d M Y H:i:s O (T)'),
	'Return-Path'	=> '<'.$overview->to.'>'
];

if (imap_mail($data->euName.'##kukac##'.$data->wsDomain, $overview->subject, imap_body($mbox, $mail), preg_replace('/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/', "\r\n", $header."\n".implode("\n", array_map(function($v, $k)
{
	return $k.': '.$v;
}, $extra_header, array_keys($extra_header))))))
	echo "OK\n";
else
	echo "ERROR\n";

imap_setflag_full($mbox, $mail, "\\Seen");
    endforeach;
  endif;
endif;
Az eredeti fejlécek cseréjét az indító posztban megmagyaráztam, az extra fejlécek a Return Path módosításához kellenek (mert nem az eredeti rp-re szeretném küldeni a mailer üzeneteket, hanem a továbbítónak, a resent pedig hogy újra lett küldve.

Az imap_mail-nál egységesítem a newlineokat. Kb. ennyiről van szó.

A célszerver (c) elfogadja a leveleket, ezzel nincs gond. Megjön minden, csak a címzett a c##kukac##c.com-ra változik, mikor b##kukac##b.com-nak kellene maradnia, a CC-k újra megkapják a levelet, stb.
3

Implementacio

janoszen · 2017. Aug. 1. (K), 23.21
Nezz egy a PHP fuggvenyeitol fuggetlen SMTP libraryt es probald meg azt hasznalni.