![]() |
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, 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? |
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 |
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, |
Så här funkar fin-fint:
Kod:
$headers = "MIME-Version: 1.0" . "\r\n"; |
Borde väl bli så här om jag inte har fel? :)
Kod:
|
Tack Thorsell!
Svarade mig själv samtidigt som du svarade, men våra lösningar är iaf ganska lika varandra :) |
Testa phpmailer så blir det lättare att handskas med mailutskick.
|
Citat:
Dock är det bra att köra "From: Namn <email>" skulle jag tro, det saknar du i din lösning.. |
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! |
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"; |
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. |
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) { |
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 ioch 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"; Kod:
$from = "From: ".mb_encode_mimeheader("Åsa", "utf-8", "Q")."<".$email.">\r\n"; Kod:
preg_replace('/[^\x21-\x3C\x3E-\x7E\x09\x20]/e','sprintf( "=%02x", ord("$0"));',$mimetext); 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 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) { 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 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... ) |
Citat:
Jag skulle alltså använda: Kod:
mail("[email protected]", mb_encode_mimeheader($subject,"iso-8859-1","Q"), encodeQuotedPrintable($body), 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). |
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? |
Citat:
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. |
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 ;) |
Citat:
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 |
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 |
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