WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP mail - felaktig avsändare (https://www.wn.se/forum/showthread.php?t=16884)

Seattlegrunge 2006-10-15 22:48

Jag använder ofta php:s mail-funktion för att skicka iväg formulär på hemsidor.

Det fungerar finfint för det mesta och själva mailbiten kan se ut som följer:

Kod:

mail("[email protected]", $subject, $body,
  "From: " . $name . "\r\n" .
  "Reply-To: " . $email . "\r\n" .
  "X-Mailer: PHP/" . phpversion());

Alla variabler är plockade från ett formulär som användaren har submittat.

När jag får ett sånt mail skickat via formuläret till min mailserver så ser allt bra ut. Kollar jag i Headers så står följande:
From: Förnamn Efternamn
Reply-To: [email protected]

Precis så som användaren har fyllt i formuläret.

Dock har jag en kund som klagar på att när de får in mailen från hemsidan, så ser mailets headers ut som följer:
From: Förnamn@domänsomkundensmailserverliggerpå.tld
Reply-To: Efternamn@domänsomkundensmailserverliggerpå.tld

Finns det någon möjlighet att kringgå detta problem? Så att kundens mailserver inte tar överhanden och sätter egna From och Reply-To? Det verkar ju vara så på vissa mailservrar bara, så det verkar vara en fråga om konfiguration på mailservern ifråga, men kan man kanske "lura" detta?

martine 2006-10-15 22:59

Det kan hända att servern kollar att from: är en riktig epostadress innan det skickas, och annars ersätter den med en egen. Har du provat att använda formen:
Förnamn Efternamn <[email protected]>
Fungerar bra för mig iaf (du kan ju sätta reply-to till detsamma om du vill, annars kan du ju slopa den). Sen borde du förståss mime-koda den så att det funkar bra med å ä ö etc

Seattlegrunge 2006-10-15 23:25

Tack, det ska jag testa, det låter som en trolig lösning. Ska höra med kunden imorgon, då jag inte kommer åt deras mail.

Ja, MIME-koda borde jag göra. Tack för tipset.
Hur ska det se ut då egentligen? Som följer kanske?

Kod:

mail("[email protected]", $subject, $body,
  "From: " . $name . "\r\n" .
  "Reply-To: " . $email . "\r\n" .
  "X-Mailer: PHP/" . phpversion()
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";);

Eller vad/hur ska jag sätta in MIME-typen?

thorsell 2006-10-15 23:34

Så här funkar fin-fint:

Kod:

$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1" . "\r\n";
$headers .= "To: Mottagare <[email protected]>" . "\r\n";
$headers .= "From: $name <$email>" . "\r\n";

mail($email, $subject,$body, $headers);


Seattlegrunge 2006-10-15 23:34

Borde väl bli så här om jag inte har fel? :)

Kod:


mail("[email protected]", $subject, $body,
 "From: " . $name . "\r\n" .
 "Reply-To: " . $email . "\r\n" .
 "MIME-Version: 1.0\r\n" .
 "Content-type: text/plain; charset=iso-8859-1\r\n" .
 "X-Mailer: PHP/" . phpversion());

Det blir rätt va?

Seattlegrunge 2006-10-15 23:35

Tack Thorsell!
Svarade mig själv samtidigt som du svarade, men våra lösningar är iaf ganska lika varandra :)

koala 2006-10-15 23:49

Testa phpmailer så blir det lättare att handskas med mailutskick.

thorsell 2006-10-15 23:53

Citat:

Originally posted by Seattlegrunge@Oct 15 2006, 23:35
Tack Thorsell
Svarade mig själv samtidigt som du svarade, men våra lösningar är iaf ganska lika varandra *

Japps, ser korrekt ut ;)
Dock är det bra att köra "From: Namn <email>" skulle jag tro, det saknar du i din lösning..

Seattlegrunge 2006-10-16 00:04

Japp, jag testar det nu och ser om det är det som är strulet på min fråga som jag skrev om högst upp i tråden.

Tack både till dig och martine!

Seattlegrunge 2006-10-16 00:19

Trots att jag satt en MIME-type och charset, så vill inte å,ä och ö fungera i ämnesraden på meddelandet. Sidan som skickar mailet/har formuläret är kodad i UTF-8 och jag kör en utf8_decode på alla variabler med värden från formuläret.

Tar jag emot mailen på min egen mail via min mailserver, då fungerar å, ö och ö i ämnesraden, men tas det emot hos kunden via deras mailserver så blir det X istället för å, ä och ö. Detta gäller även avsändaren, det blir t ex HXkan Xberg <[email protected]> istället för Håkan Öberg <[email protected]>

Förresten, det andra verkar fungera nu, dvs From och Reply-To ser bra ut nu sedan jag använder $headers .= "From: $name <$email>" . "\r\n";

Seattlegrunge 2006-10-16 01:43

Kollar jag headers/källkod för meddelandet som tas emot finns följande felmeddelande. Vet i katten hur jag ska ta mig runt detta:

Thunderbird:
X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char C3 hex) in message header 'Subject': Subject: ***EPOST FR\303\205N HEMSIDAN***\n

Outlook Express:
X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char C5 hex) in message header 'Subject': Subject: ***EPOST FR\305N HEMSIDAN***\n

Varför den bara klagar på Subject förstår jag inte. På From fungerar ju inte å, ä och ö heller.

Seattlegrunge 2006-10-16 02:18

Jag har äntligen löst det!
Nu fungerar även svenska tecken i From och Subject genom att dra berörda strängar genom följande funktion:

Kod:

function encode_iso88591($string) {
        $text = '=?iso-8859-1?q?';
        for( $i = 0; $i < strlen($string); $i++ ) {
  $val = ord($string[$i]);
  if($val > 127) {
          $val = dechex($val);
          $text .= '='.$val;
  }
  else {
          $text .= $string[$i];
  }
        }
        $text .= '?=';
        return $text;
 }

Tack alla som hjälpt mig under kvällen... nu har jag väl en glad kund imorgon får jag hoppas :)

martine 2006-10-16 14:16

Lite grundläggande info om mime-encoding (mime är inte bara att sätta en header till mime ;) ):
Mejlstandarden är urgammal och egentligen får man inte skicka något annat är "amerikanska" ascii-tecken, dvs endast 7-bitars (iso-8859 har 8 bitar, unicode 16 bitar). Det går alltså inte att skicka svenska tecken. Eftersom detta snabbt blev otillräckligt så utvecklades mime-standarden som gör det möjligt att skicka "vanlig" (svensk) text och allehanda filer genom att omvandla dessa till 7-bitars text innan de skickas. För headers i mejlet innebär detta att text som innehåller "oamerikanska" tecken inkapslas i
Kod:

From: =?utf-8?Q?=c3=85sa=20H=c3=b6gland=c3?= <[email protected]>
och att alla 8-bitarstecken samt kontrolltecken (retur, tab) och vissa andra tecken (komma, likamedtecken, mellanslag och liknande) ersätts med ett likamedtecken plus bytens värde i hex. Denna form av encoding kallas printed-quotable eftersom man kan printa den och åtminstone läsa alla amerikanska tecken. T ex å blir =a5.
Hela strängen byggs alltså upp genom
[header]: =?[använd_encoding]?Q?[text_med_åäö_ovandlade_till_=XX]?=
I synnerhet är det headers: Subject:, From: och To: som behöver detta.

Hur fixar man då detta i php? Jo man glömmer alltihop ovan och använder bara funktionen iconv_mime_encode() eller
mb_encode_mimeheader("TExtsträng", "utf-8", "Q") alltså exempelvis:
Kod:

$subject = "Subject: ".mb_encode_mimeheader("Om våra produkter", "utf-8", "Q")."\r\n";
och
Kod:

$from = "From: ".mb_encode_mimeheader("Åsa", "utf-8", "Q")."<".$email.">\r\n";
Om du har en slappt webhotell som inte har mb(multibyte)-support så får du använda typ:
Kod:

preg_replace('/[^\x21-\x3C\x3E-\x7E\x09\x20]/e','sprintf( "=%02x", ord("$0"));',$mimetext);
För mime-meddelandet gäller:
1. Ingen rad får längre än 80 (ascii)tecken
2. Varje rad måste avslutas med "\r\n"
3. Ingen tecken får förekomma som är "större än" 7 bitar
Du behöver dessa headers:
Kod:

MIME-Version: 1.0;
Content-Type: text/plain; charset=utf-8;
Content-Transfer-Encoding: quoted-printable;

Det är förstås viktigt att ange korrekt charset, i det här fallet utf-8.
Content-Type ochContent-Transfer-Encoding varierar givetvis beroende på vad skicka, t ex bilagor, bilder, html, och hur du encodar det, base64 är lämpligt för bilagor, se http://de2.php.net/manual/en/function.base...se64-encode.php
Tyvärr finns ingen smart funktion såvitt jag vet för att mime-encoda meddelandet som quoted-printable så jag använder:
Kod:

function encodeQuotedPrintable($textblock) {
        $textblock = preg_replace(
 '/[^\x21-\x3C\x3E-\x7E\x09\x20]/e',
 'sprintf( "=%02x", ord ( "$0" ) );',
 $textblock
        );
        return preg_replace ( '/(.{73}[^=]{0,3})/', '$1'."=\r\n", $textblock);
}

som jag kör på meddelandet.

Om man inte mime-kodar sina mejl riktigt så finns det ingen garanti att dom ser bra ut när dom kommer fram...

Men egentligen kan man använda mb_send_mail() som sköter allt detta självt...

Så, det här får ni i hemläxa tills imorgon! :P :D

PS. Reply-to: används för att ange en annan svars adress än den som anges i From: t ex
Kod:

From: kampanjer@företag.se
Reply-to: kundtjänst@företag.se

Så att det står att mejlet kommer från kampanjadv. på företaget men om man klickar på svara/reply så skickas mejlet till kundtjänst. (Det finns ju förstås bättre användningsområden för detta, t ex om man vill skicka mejl som alltid kommer från support@företag.se men man vill att svarsmejl alltid kommer tillbaks till personen som sist behandlade ärendet med reply-to: bengtVidSupporten@företag.se och inte alfonsVidSupporten@företag.se. Man ser ju då alltid i mejlprogrammets from att mejlet kom från den välkända supporten och inte från någon okänd bengt... )

martine 2006-10-16 14:28

Citat:

Originally posted by Seattlegrunge@Oct 15 2006, 23:34
Det blir rätt va?
Som svar till Seattlegrunge:
Jag skulle alltså använda:
Kod:

mail("[email protected]", mb_encode_mimeheader($subject,"iso-8859-1","Q"), encodeQuotedPrintable($body),
 *"From: " . mb_encode_mimeheader($name,"iso-8859-1","Q") ."<".$email.">\r\n" .
 *"MIME-Version: 1.0\r\n" .
 *"Content-type: text/plain; charset=iso-8859-1\r\n" .
 *"Content-Transfer-Encoding: quoted-printable;\r\n"

med funktionen encodeQuotedPrintable() ovan.

De flesta mejlservrar bråkar inte med å ä ö etc i meddelandedelen men för att vara säker bör man hålla sig till mime-standarden så man inte får några bokstäver ersatta med X (och framförallt vara noga med att ange rätt charset).

Seattlegrunge 2006-10-16 16:06

Ojojojojojoj.... vilken klippa du är!
Har fick man maaaassa grym information rakt upp och ner, en massa information som jag kom över inatt efter några timmars googlande och pusslade från en massa sajter... dock så fick jag inte fram riktigt allt det du nämnde här på några rader! All heder åt dig Martine! :)

Men du... jag ska nu testa göra som du visar ovan istället för min lilla kodsnutt jag satte ihop inatt... men en fråga kvarstår då:

UTF-8 vs ISO-8859-1... vilket bör man välja? Finns det webbläsare som är ofta förekommande hos t ex svenska företag som inte klarar UTF-8? Egentligen är det väl bara Outlook (med eller utan Express) som används av dessa, i stort sett, men den har inga som helst problem med UTF-8 i dess olika versioner?

martine 2006-10-16 16:54

Citat:

Originally posted by Seattlegrunge@Oct 16 2006, 16:06
UTF-8 vs ISO-8859-1... vilket bör man välja? Finns det webbläsare som är ofta förekommande hos t ex svenska företag som inte klarar UTF-8? Egentligen är det väl bara Outlook (med eller utan Express) som används av dessa, i stort sett, men den har inga som helst problem med UTF-8 i dess olika versioner?
Jag kör med utf-8 eftersom det då även funkar om någon skulle skriva typ något jugoslaviskt namn eller andra ovanliga tecken. Det är ju också den nya standarden, iso:na försvinner alltmer. Nackdelen är som du anat att det kan vara problem med att använda utf-8 i vissa gamla mailklienter, men eftersom Outlook, Mozillas och Maccens Mail alla klarar utf-8 utan problem så tycker jag inte att det är något större problem. Om däremot huvuddelen av dina mottagare är sunkiga hotmail.com kan man ju överväga att använda iso-8859-1, men jag tycker egentligen att det är hotmails problem att de inte kan visa email korrekt (det finns även en lång rad andra saker som inte fungerar på hotmail).

Om du vill ha reda på exakt hur det är så läs RFC 1521 (om du har tid och tålamod) där hur man formaterar mime-email (även med flera delar, bilagor etc) beskrivs in i minsta detalj:
http://www.faqs.org/rfcs/rfc1521.html
(För dig mest "Appendix 2", "5.1. Quoted-Printable Content-Transfer-Encoding", "1. Introduction" och egentligen hela kapitel 3, 4 och inledningen på kap. 5)
Det finns också ett antal sidor som tar upp RFC:erna på föreklat och även på svenska, googla..

Rättelse: Jag tror jag i punkt 2 i mitt inlägg ovan ska vara "=\r\n" för ett s k soft-break som tas bort när mejlet kommer fram.
Jag tror också att det är så att man måste ange en giltig email som avsändare i From-headern, inte bara ett namn.

Seattlegrunge 2006-10-24 22:19

Tack för dina svar Martine!
Dessa har hjälpt mig oerhört och jag har helt kommit underfund med hur mail fungerar nu (tror jag iaf hehe). Dina sista tips fungerade klockrent!

Du är en klippa! Iaf vad gäller mailuppbyggnad ;)

martine 2006-10-25 00:55

Citat:

Originally posted by Seattlegrunge@Oct 24 2006, 22:19
Tack för dina svar Martine!
Dessa har hjälpt mig oerhört och jag har helt kommit underfund med hur mail fungerar nu (tror jag iaf hehe). Dina sista tips fungerade klockrent!

Du är en klippa! Iaf vad gäller mailuppbyggnad ;)

Jag brukar inte svara på tackinlägg... men med så mycket smicker kan man ju inte låta bli... B)

Kul att du fått ordning på det, jag har ju också kämpat med mejl ett bra tag innan jag fick ordning på det... Men har man inte ordning på det får man ständigt klagomål på det ena eller andra. Dessutom finns ju alltid risken för mejlinjektioner om man inte sköter det ordentligt (så länge man mime-encodar är det svårt att göra mail-injektioner eftersom injektionen bara enkodas och skickas med som ett meddelande...). Det är ju bra mycket krångligare än man tror när man just lyckats skicka iväg sitt första mejl med (det egentligen ganska enkla och kassa) mail()... :D

Larzza 2007-02-10 20:58

Får jag fortsätta på denna tråd.
Jag har ett konstigt problem. Det är panik

När Subject består av ett å eller ä eller ö så skickas formuläret iväg mailet.
Men står det ä ö eller liknande Strängnäs ( 2 ä i subject alltså) så funkar det inte.
Funkar inte heller om man skriver " Fläsk med sås" inte alls med 2 exotiska tecken i subjekt.
Det hjälper inte med att ta bort "stripslashes"

Det är från ett phpscript som heter "phpreview", och nu får jag inte tag på han som gjort scriptet.
Kod:

//THE LINE BELOW MUST NOT CONTAIN ANY CARRIAGE RETURNS IT MUST ALL BE ON ONE LINE
mail("$UserEmail", stripslashes("$mailSubject"), stripslashes($UserMessage), "From: $SiteEmail\r\n" . "Reply-To: $UserMail\r\n" . "X-Mailer: PHP/" . phpversion() . "\r\. "MIME-version: 1.0\r\n" . "Content-Type: text/html");



Alla tider är GMT +2. Klockan är nu 20:28.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson