Friday 4 August 2017

Javamail Innehålls Transfer Kodning Binära Alternativ


5 Fältet Content-Transfer-Encoding Header. Många innehållstyp som kan fördelas via e-post representeras i sitt naturliga format som 8-bitars tecken eller binär data. Sådana data kan inte överföras via vissa transportprotokoll. Till exempel RFC 821 begränsar e-postmeddelanden till 7-bitars US-ASCII-data med 1000 tecken linjer. Det är därför nödvändigt att definiera en standardmekanism för omkodning av sådan data till ett 7-bitars kortlinjformat. Detta dokument anger att sådana kodningar kommer att Indikeras av ett nytt rubrik för innehållsöverföring och kodning. Fältet Content-Transfer-Encoding används för att ange vilken typ av omvandling som har använts för att representera kroppen på ett acceptabelt sätt för transport. Till skillnad från innehållstyp, en Spridning av innehållsöverföring-kodningsvärden är oönskad och onödig. Det verkar emellertid inte vara möjligt att upprätta en enda Content-Transfer-Encoding-mekanism. Det finns en tradeoff mellan lusten för en kompakt och eff Icient kodning av stor binär data och önskan om en läsbar kodning av data som är mestadels men inte helt 7-bitars data Av detta skäl är minst två kodningsmekanismer nödvändiga en läsbar kodning och en tät kodning. Fältet för överföringskodning är utformat för att ange en inverterbar kartläggning mellan den inhemska representationen av en typ av data och en representation som lätt kan bytas med 7 bitars posttransportprotokoll, såsom de som definieras av RFC 821 SMTP Detta fält har inte definierats av Någon tidigare standard Fältets värde är en enda token som anger typen av kodning, som anges nedan Formellt Dessa värden är inte skiftlägeskänsliga Det betyder att Base64 och BASE64 och bAsE64 är lika med varandra En kodningstyp på 7BIT kräver att kroppen redan finns i En sju-bitars mail-ready representation Detta är standardvärdet - det vill säga Content-Transfer-Encoding 7BIT antas om fältet Content-Transfer-Encoding header inte är närvarande. Värdena 8bi T, 7bit och binär innebär allt att NO-kodning har utförts. De är dock potentiellt användbara som indikationer på typen av data som finns i objektet och därför av typen av kodning som kan behöva utföras för överföring i en given Transportsystem 7bit betyder att data är alla representerade som korta rader av US-ASCII-data 8bit betyder att linjerna är korta men det kan finnas icke-ASCII-tecken oktetter med högorderbitssatsen Binär betyder att det inte bara kan vara icke - ASCII-tecken är närvarande, men också att linjerna inte nödvändigtvis är tillräckligt korta för SMTP-transporten. Skillnaden mellan 8bit eller något annat tänkbart bitbreddstoken och binärtoken är att binär inte behöver följa några gränser på linjelängd eller till SMTP-CRLF-semantiken, medan bitbreddsbitarna kräver sådan vidhäftning Om kroppen innehåller data i någon annan bitbredd än 7-bit måste den lämpliga bitbreddsinnehållsöverförings-kodningstoken användas, t. ex. 8bit för unen Kodad 8 bitars bred data Om kroppen innehåller binär data måste binär Content-Transfer-Encoding token användas. Skillnaden mellan innehållsöverförings-kodningsvärdena för binär, 8bit etc kan verka obetydlig, eftersom de alla verkligen Menar ingen - det vill säga det har inte gjorts någon kodning av data för transport. Tydlig märkning kommer dock att vara av enormt värde för gateways mellan framtida posttransportsystem med olika möjligheter att transportera data som inte uppfyller restriktionerna för RFC 821-transport. Efter det att detta dokument har publicerats finns det inga standardiserade Internettransporter där det är legitimt att inkludera okodad 8-bitars eller binär data i postkroppar. Därför finns det inga omständigheter där 8bit eller binär Content-Transfer-Encoding faktiskt är lagligt På Internet Om emellertid 8-bitars eller binär posttransport blir verklighet i Internet-post, eller när det här dokumentet används tillsammans med någon annan 8-bitars eller binär kapacitet Mekanism bör 8-bitars eller binära kroppar märkas som sådana med hjälp av denna mekanism. De fem värdena som definieras för fältet Content-Transfer-Encoding innebär inget annat om innehållstyp än den algoritm som den kodades för eller kraven på transportsystemet Om unencoded. Implementors kan vid behov definiera nya Content-Transfer-Encoding-värden, men måste använda en x-token, vilket är ett namn prefixed av X - för att ange sin icke-standardstatus, t. ex. Content-Transfer-Encoding x - My-new-encoding Men till skillnad från innehållstyp och undertyper är skapandet av nya Content-Transfer-Encoding-värden uttryckligen och kraftigt avskräckt, eftersom det verkar troligt att det hindrar driftskompatibilitet med liten potentiell nytta. Användningen är endast tillåten som resultat av Ett avtal mellan samarbetsvilliga användaragenter. Om ett rubrik för innehållsöverföring och kodning visas som en del av ett meddelandehuvud gäller den för hela meddelandets kropp Om ett rubrik för innehållsöverföring och kodning visas som en del av en kropp p Art s headers, det gäller bara kroppen för den kroppsdelen Om en enhet är typ av multipart eller meddelande, är Content-Transfer-Encoding inte tillåtet att ha något annat värde än en bitbredd, t. ex. 7bit, 8bit, etc eller binärt . Det bör noteras att e-post är karaktärsinriktat, så att mekanismerna som beskrivs här är mekanismer för kodning av godtyckliga bitströmmar, inte bitströmmar. Om en bitström ska kodas via en av dessa mekanismer måste den först omvandlas till en 8-bit byte-ström med hjälp av nätverksstandardbitordningen big endian, där de tidigare bitarna i en ström blir de högre ordningens bitar i en byte. En bitström som inte slutar vid en 8-bitars gräns måste fyllas med nollor. Detta dokument Tillhandahåller en mekanism för att notera tillägget av sådan padding vid tillämpning av Innehållstyp, som har en padding-parameter. Kodningsmekanismerna definierade här uttryckligen kodar all data i ASCII. Antag exempelvis att en enhet har rubrikfält såsom Detta borde vara Tolkas för att innebära att kroppen är en base64 ASCII-kodning av data som ursprungligen var i ISO-8859-1 och kommer att vara i den teckenuppsättningen igen efter avkodning. Följande avsnitt kommer att definiera de två standardkodningsmekanismerna Definitionen av nytt innehålls - Överförings-kodningar är uttryckligen avskräckta och bör endast uppstå när det är absolut nödvändigt. All innehållsöverföringskodnings namnrymd förutom den som börjar med X - är uttryckligen reserverad för IANA för framtida användning. Privata avtal om innehållsöverföring-kodningar är också uttryckligen avskräckta. - Transfer-Encoding-värden får endast användas på vissa innehållstyper. Det är särskilt förbjudet att använda andra kodningar annat än 7bit, 8bit eller binärt med vilken innehållstyp som helst, som återfinns innehåller andra innehålls-typfält, särskilt multipart Och meddelandeinnehållstyp Alla kodningar som önskas för kroppar av typen multipart eller meddelande måste göras på den innersta nivån genom kodning av den aktuella kroppen th Måste kodas. NOTERA OM ENKODERANDE RESTRIKTIONER. Även om förbudet mot att använda innehållsöverförings-kodningar på data av typen multipart eller meddelande kan tyckas alltför begränsande, är det nödvändigt att förhindra kapslade kodningar, i vilka data skickas genom en kodningsalgoritm Flera gånger och måste avkodas flera gånger för att kunna visas korrekt. Nested encodings lägger stor komplexitet åt användaragenter utöver de uppenbara effektivitetsproblemen med sådana multipla kodningar, de kan dölja den grundläggande strukturen i ett meddelande. I synnerhet kan de innebära att Flera avkodningsoperationer är bara nödvändiga för att ta reda på vilka typer av föremål ett meddelande innehåller. Banningnästa kodningar kan komplicera jobbet för vissa mailgateways, men det verkar vara mindre av ett problem än effekten av nestade kodningar på användaragenter. NOTERA OM FÖRETAGET MELLAN INNEHÅLLSTYP OCH INNEHÅLLSÖVERFÖRSÄKRING. Det kan tyckas att innehållsöverföringskodningen kan härledas från characen Teristor för innehållstypen som ska kodas eller åtminstone att vissa innehållsöverförings-kodningar kan vara mandat för användning med specifika innehållstyper Det finns flera anledningar till varför detta inte är fallet Först med tanke på Varierande typer av transporter som används för post, kan vissa kodningar vara lämpliga för vissa transportkombinationer för innehållstyp och inte för andra. I en 8-bitars transport behövs exempelvis ingen kodning för text i vissa teckenuppsättningar, medan sådana kodningar är Klart krävs för 7-bitars SMTP För det andra kan vissa innehållstyp kräva olika typer av överföringskodning under olika omständigheter. Exempelvis kan många PostScript-kroppar bestå av korta rader med 7-bitars data och kräver därför lite eller ingen kodning Andra PostScript-kroppar Speciellt de som använder binär kodningsmekanism för nivå 2 PostScript kan endast vara rimligt representerade med en binär transportkodning. Slutligen, eftersom innehållstyp är avsett att vara en öppen spets Ekvifieringsmekanism, strikt specifikation av en koppling mellan innehållstyp och kodningar kopplar effektivt specifikationen för ett applikationsprotokoll med en specifik lägre nivåtransport Detta är inte önskvärt eftersom utvecklarna av en innehållstyp inte borde vara medvetna om alla Transporter i bruk och vad deras begränsningar är. NOTERA FÖR ATT FÖRSTÄLLA ENKODER. De citerade och baserade kodningarna är utformade så att omvandling mellan dem är möjlig. Det enda problemet som uppkommer i en sådan omvandling är hanteringen av radbrytningar. När man konverterar från citerade - Utskrivbar till base64 en radbrytning måste omvandlas till en CRLF-sekvens Likaså bör en CRLF-sekvens i bas64-data omvandlas till en citationstryckbar radbrytning, men ENDAST vid konvertering av textdata. NOTERA PÅ KANONISK ENCODING-MODELL. Det var viss förvirring, I tidigare utkast till detta notat om modellen för när e-postdata skulle konverteras till kanonisk form och kodas, och i synnerhet hur det här pr Ocess skulle påverka behandlingen av gränsvärdena för gränsvärden, eftersom representationen av nya linjer varierar kraftigt från system till system Av denna anledning presenteras en kanonisk modell för kodning som tillägg H.5 1 Quoted-Printable Content-Transfer-Encoding. Quoted-Printable Kodning är avsedd att representera data som i stor utsträckning består av oktetter som motsvarar utskrivbara tecken i ASCII teckenuppsättning Det kodar data så att de resulterande oktetterna inte kommer att modifieras via posttransport Om data som kodas är mestadels ASCII-text , Den kodade formen av data förblir i stor utsträckning igenkännbar av människor En kropp som helt är ASCII kan också kodas i kvotad utskrivbar för att säkerställa integriteten av data, om meddelandet ska passera genom en tecken-översättande och eller linjeomslags gateway. I denna kodning ska oktetterna representeras som bestäms av följande regler. Rulla 1 Allmänt 8-bitars representation. En annan oktett, förutom de som indikerar en radbrytning enligt Newlinekonventionen för den kanoniska formen av data som kodas kan representeras av en följd av en tvåsiffrig hexadecimal representation av oktets s-värdet. Siffrorna i det hexadecimala alfabetet är i detta syfte 0123456789ABCDEF. Stor bokstäver måste användas vid sändning Hexadecimal data, men en robust implementering kan välja att känna igen små bokstäver vid kvitto. Således kan till exempel värdet 12 ASCII-formmatning representeras av 0C och värdet 61 ASCII EQUAL SIGN kan representeras av 3D Förutom när följande regler tillåter En alternativ kodning, denna regel är obligatorisk. Rulla 2 Bokstavlig representation Okteter med decimala värden av 33 till 60 inklusive, och 62 till 126 inklusive, kan representeras som ASCII-tecknen som motsvarar dessa oktetter EXCLAMATION POINT UNDER MINDRE THAN, och GREATER THAN via TILDE, respektive. Rula 3 White Space. Octets med värden på 9 och 32 kan representeras som ASCII TAB HT och SPACE tecken, respe Ctively men MÅSTE INTE vara så representerad i slutet av en kodad linje. Eventuella TAB HT - eller SPACE-tecken på en kodad linje MÅSTE följas på den linjen med en utskrivbar tecken. I synnerhet en i slutet av en kodad linje, vilket indikerar en Mjuk linjebrytning se regel 5 kan följa ett eller flera TAB HT - eller SPACE-tecken Det följer att en oktett med värdet 9 eller 32 som visas i slutet av en kodad linje måste representeras enligt regel 1 Denna regel är nödvändig eftersom vissa MTA-meddelanden Transport Agenter, program som transporterar meddelanden från en användare till en annan, eller utför en del av sådana överföringar, är kända för att kasta textlinjer med RUMMAR och andra är kända för att ta bort vita mellanslagstegn från slutet av en rad. Därför, när man avkodar ett citat - Skrivbar kropp, vilket som helst efterföljande vitt utrymme på en linje måste raderas, eftersom det nödvändigtvis kommer att ha lagts till av intermediära transportmedel. Rulla 4 linjebrytningar. En radbrytning i en textkroppsdel ​​oberoende av vad dess representation är foll På grund av den kanoniska representationen av data som kodas, måste representeras av en RFC 822 radbrytning, vilken är en CRLF-sekvens, i den kvotade-skrivbara kodningen. Om isolerade CR och LF eller LF CR och CR LF-sekvenser får visas i Binär data enligt kanonisk form, måste de representeras med respektive 0D, 0A, 0A 0D och 0D 0A noteringar. Notera att många implementeringar kan välja att koda lokal representation av olika innehållstyper direkt. I synnerhet kan detta gälla för vanlig Textmaterial på system som använder nya linjekonventioner än CRLF-avgränsare En sådan implementering är tillåten, men genereringen av radbrytningar måste generaliseras för att redogöra för fallet där alternativa representationer av newline-sekvenser används. Rule 5 Soft Line Breaks. The Quoted - Utskrivbar kodning BEFORDRAR att kodade linjer inte ska vara längre än 76 tecken Om längre linjer ska kodas med den kodade kvittotypen, måste man använda mjuka radbrytningar Ett lika tecken som den sista tecknen på en kodad linje indikerar en sådan icke-signifikant mjuk linjebrytning i den kodade texten Således om den rada formen av linjen är en enda okodad rad som säger att detta kan representeras i den kvoterade skrivbara kodningen , Eftersom detta tillhandahåller en mekanism med vilken långa linjer kodas på ett sådant sätt att de återställs av användaragenten 76-gränsgränsen räknar inte den efterföljande gränsvärdet, men räknar alla andra tecken, inklusive eventuella lika tecken. Eftersom bindestreckskaraktären - är representerad som en del i den kvoterade skrivbara kodningen måste man ta hand om när man inkapslar en citerad utskrivbar kodad kropp i en multipart-enhet för att säkerställa att inkapslingsgränsen inte finns någonstans i den kodade kroppen. En bra strategi är att välja En gräns som inkluderar en teckenföljd som som aldrig kan visas i en citat som kan skrivas ut Se definitionen av multipartmeddelanden senare i detta dokument. NOTER Den citerade utskrivbara kodningen representerar someth En kompromiss mellan läsbarhet och tillförlitlighet vid transport Organ som kodas med den citerade utskrivbara kodningen fungerar på ett tillförlitligt sätt över de flesta postgateways, men kanske inte fungerar perfekt över några gateways, särskilt de som inbegriper översättning till EBCDIC. Teoretiskt kan en EBCDIC-gateway avkoda En citationstecken som kan skrivas ut och kodas igen med base64, men sådana gateways finns ännu inte. En högre grad av förtroende erbjuds av bas64 Content-Transfer-Encoding En väg att få rimligt pålitlig transport via EBCDIC-gateways är att även citera ASCII-tecken enligt regel 1 Se tillägg B för mer information. Eftersom citationsteckningsdata generellt antas vara linjeorienterade, kan det förväntas att rasterna mellan raderna av citerade utskrivbara data kan ändras vid transport, i På samma sätt som vanligt textmeddelande alltid har ändrats i Internet-mail när de passerar mellan system med olika newline-konventioner. Om sådana förändringar sannolikt kan bestå av För en korruption av data, är det förmodligen mer rimligt att använda bas64 kodning snarare än den citerade-skrivbara kodningen.5 2 Base64 Content-Transfer-Encoding. Base64 Content-Transfer-Encoding är utformat för att representera godtyckliga sekvenser av oktetter i En form som inte är mänskligt läsbar. Kodnings - och avkodningsalgoritmerna är enkla men kodade data är konsekvent bara cirka 33 procent större än den okodade data. Denna kodning baseras på den som används i Privacy Enhanced Mail-applikationer, enligt definitionen i RFC 1113 The Bas64 kodning är anpassad från RFC 1113, med en ändring base64 eliminerar mekanismen för inbäddad klar text. En 65-tecken undergrupp av US-ASCII används, vilket möjliggör 6 bitar att representeras per utskrivbart tecken. Den extra 65: e teckennivån används för att Ange en särskild bearbetningsfunktion. NOTE Den här delmängden har den viktiga egenskapen att den representeras identiskt i alla versioner av ISO 646, inklusive US ASCII, och alla tecken i delmängden är också Representeras identiskt i alla versioner av EBCDIC Andra populära kodningar, såsom kodningen som används av UUENCODE-verktyget och bas85-kodningen som anges som en del av nivå 2 PostScript, delar inte dessa egenskaper och uppfyller således inte portabilitetskraven en binär transportkodning För post måste mötas. Kodprocessen representerar 24-bitars grupper av ingångsbitar som utmatningssträngar med 4 kodade tecken. Genom att följa från vänster till höger bildas en 24-bitars ingångsgrupp genom att sammanfoga 3 8-bitars ingångsgrupper. Dessa 24 bitar är då Behandlas som 4 sammanfogade 6-bitars grupper, vilka var och en är översatta till en enda siffra i bas64-alfabetet När kodning av en bitström via bas64-kodningen måste bitströmmen antas beställa med den mest signifikanta bitens första att Är den första biten i strömmen den högordnade biten i den första byten och den åttonde biten kommer att vara lågordningsbit i den första byten och så vidare. Varje 6-bitars grupp används som ett index In i en array Av 64 utskrivbara tecken Den tecken som refereras av indexet placeras i utdatasträngen Dessa tecken, som identifieras i Tabell 1 nedan, väljs så att de är universellt representativa och uppsättningen utesluter tecken med särskild betydelse för SMTP, t. ex. CR, LF Och till inkapslingsgränserna som definieras i detta dokument e g. Table 1 Base64 Alphabet. The output stream encoded bytes måste representeras i rader med högst 76 tecken. Alla Alla raster eller andra tecken som inte finns i Tabell 1 måste ignoreras av Avkodningssoftware I base64-data anger andra tecken än de i tabell 1, radbrytningar och annat vitt utrymme troligen ett överföringsfel, om vilket ett varningsmeddelande eller till och med ett meddelandeförkastning kan vara lämpligt under vissa omständigheter. Särskild bearbetning utförs om färre Än 24 bitar finns tillgängliga vid slutet av data som kodas. En fullständig kodningskvantum fylls alltid i slutet av en kropp. När färre än 24 ingångsbitar ar E finns i en ingångsgrupp läggs nollbitar till höger för att bilda ett integrerat antal 6-bitars grupper Utgångsteckenpositioner som inte är nödvändiga för att representera aktuell ingångsdata är inställda på tecknet Eftersom alla base64-ingångar är ett integrerat antal Oktetter kan endast följande fall uppstå 1 slutkvoten av kodningsingång är en integrerad multipel av 24 bitar här, den slutliga enheten för kodad utmatning kommer att vara en integrerad multipel av 4 tecken utan vaddering, 2 den slutliga kvanten av kodningsingången är Exakt 8 bitar här kommer den slutliga enheten för kodad utmatning att vara två tecken följt av två padding-tecken, eller 3 slutkvanten av kodningsingången är exakt 16 bitar här, den slutliga enheten för kodad utmatning kommer att vara tre tecken följt av ett fyllningstegn. Care måste vidtas för att använda rätt oktetter för radbrytningar om base64-kodning appliceras direkt på textmaterial som inte har konverterats till kanonform. I synnerhet bör textlinjeavbrott vara konvergerande Ted i CRLF-sekvenser före bas64-kodning Det viktiga att notera är att detta kan göras direkt av kodaren i stället för i ett tidigare kanonicaliseringssteg i vissa implementeringar. NOTER Det finns ingen anledning att oroa sig för att citera tydliga inkapslingsgränser inom bas64-kodade Delar av multipart-enheter eftersom inga bindestreckstecken används i bas64-kodningen. Det kan vara lite tätt att läsa, men sektionen Content-Transfer-Encoding i RFC 1341 har alla detaljer. Situationen är vanligtvis från dåligt till värre här S min summary. SMTP, per definition RFC 821, begränsar post till rader med 1000 tecken med 7 bitar. Det betyder att ingen av de byte du skickar ner röret kan ha den mest signifikanta högsta beställningsbiten inställd på 1.Innehållet som Vi vill skicka kommer ofta inte att lyda denna begränsning i sig Tänk på en bildfil eller en textfil som innehåller Unicode-tecken. Byte av dessa filer kommer ofta att ha sin 8: e bit satt till 1 SMTP tillåter inte det här, så du Du måste använda överföringskodning för att beskriva hur du har arbetat kring felmatchningen. Värdena för innehållsöverföring-kodningsrubriken beskriver den regel som du har valt för att lösa detta problem.7Bit Encoding.7bit betyder helt enkelt Min data består bara av USA - ASCII-tecken, som endast använder de lägsta 7 bitarna för varje tecken. Du garanterar i grund och botten att alla byte i ditt innehåll redan följer begränsningarna i SMTP och behöver därför ingen särskild behandling. Du kan bara läsa den som-är. Observera att när du väljer 7bit, håller du med om att alla rader i ditt innehåll är mindre än 1000 tecken i längd. Så länge ditt innehåll följer denna regel är 7bit den bästa överföringskoden eftersom det inte behövs extra arbete Bara läs skriva byte när de kommer från röret. Det är också lätt att eyeball 7bit innehåll och känner av det. Idén här är att om du bara skriver i vanlig engelsk text kommer du att bli bra Men det var inte sant år 2005 och Det är inte sant today.8Bit Encoding.8bit betyder att mina data kan innehålla utökade ASCII-tecken som de kan använda den 8: e högsta biten för att ange specialtecken utanför de vanliga US-ASCII 7-bitarna karaktärerna. Som vid 7bit finns det fortfarande en gränsen på 1000 tecken på 1000 tecken, precis som 7bit Gör faktiskt ingen omvandling av byte när de skrivs till eller läses från tråden. Det betyder bara att du inte garanterar att ingen av bitarna kommer att ha den högsta biten inställd på 1. Detta verkar som ett steg upp från 7bit sedan Det ger dig mer frihet i ditt innehåll. RFC 1341 innehåller dock denna tidbit. As av publiceringen av detta dokument finns det inga standardiserade Internettransporter för vilka det är legitimt att inkludera okodad 8-bitars eller binär data i postkroppar. Således finns det Inga omständigheter där 8bit eller binär Content-Transfer-Encoding faktiskt är lagligt på Internet. RFC 1341 kom ut över 20 år sedan Sedan dess har vi fått 8bit MIME Extensions i RFC 6152 Men även då kan gränserna fortfarande vara tillämpliga Y. Observera att denna förlängning INTE eliminerar möjligheten att en SMTP-server begränsar linjelängden servrar är lediga att genomföra denna förlängning men ändå ställa in en linjelängdgräns som inte är lägre än 1000 oktetter. Binary Encoding. binary är detsamma som 8bit förutom att S ingen linjelängdsbegränsning Du kan fortfarande inkludera några tecken du vill ha och det finns ingen extra kodning Liknande 8bit RFC 1341 säger att det inte är en legitim kodningsöverföring som kodar RFC 3030 förlängd detta med BINARYMIME. Quoted Printable. Before 8BITMIME-förlängningen , Det behövde vara ett sätt att skicka innehåll som inte kunde vara 7 bitars över SMTP HTML-filer som kan ha mer än 1000 teckenlinjer och filer med internationella tecken är bra exempel på detta Den citerade utskrivbara kodningen Definierad i avsnitt 5 1 i RFC 1341 är utformad för att hantera detta Det gör två saker. Definer hur man flyger non-US-ASCII-tecken så att de kan representeras i bara 7-bitars tecken Kortversion får de displ Ayed som ett jämlikt tecken plus två 7-bitars tecken. Dina linjer kommer inte att vara större än 76 tecken, och de raderna kommer att representeras med hjälp av specialtecken som sedan släpps. Quoted Printable, på grund av de flyktiga och korta raderna, är Mycket svårare att läsa av en människa än 7bit eller 8bit men det stöder ett mycket större utbud av möjliga content. Base64 Encoding. Om dina data är i stort sett icke-text ex bildfil har du inte många alternativ 7bit är borta från bordet 8bit och binärt stöds inte innan MIME-förlängningen RFCs citerad-utskrivbar skulle fungera, men är verkligen ineffektiv varje byte kommer att representeras av 3 tecken. Basen64 är en bra lösning för denna typ av data. Det kodar 3 rå byte som 4 amerikanska - ASCII-tecken, som är relativt effektiv RFC 1341 begränsar vidare linjelängden för base64-kodad data till 76 tecken för att passa in i ett SMTP-meddelande, men det är relativt enkelt att hantera när du bara delar upp eller sammanlänkar godtyckliga tecken Vid fasta längder. Den stora nackdelen är att bas64-kodad data är ganska mycket oläslig av människor, även om det bara är ren text under.5 Fältet Content-Transfer-Encoding Header.5 Fältet Content-Transfer-Encoding Header. Många innehållstyp som kan fördelas via e-post representeras i sitt naturliga format som 8-bitars tecken eller binär data. Sådana data kan inte överföras via vissa transportprotokoll. Till exempel begränsar RFC 821 postmeddelanden till 7-bitars US - ASCII-data med linjer inte längre än 1000 tecken Det är därför nödvändigt att definiera en standardmekanism för omkodning av sådan data till ett 7-bitars kortlinjeprogram. Detta dokument anger att sådana kodningar kommer att anges med ett nytt Content-Transfer - Kodning av rubrikfält Fältet Content-Transfer-Encoding används för att ange vilken typ av omvandling som har använts för att representera kroppen på ett acceptabelt sätt för transport. Till skillnad från innehållstyper, en spridning av innehålls - Överförings-kodningsvärden är oönskade och onödiga. Det är dock inte en möjlighet att upprätta en enda Content-Transfer-Encoding-mekanism. Det finns en kompromiss mellan önskan om en kompakt och effektiv kodning av stor binär data och önskan om en läsbar kodning av Data som är mestadels men inte helt 7-bitars data Av detta skäl är minst två kodningsmekanismer nödvändiga en läsbar kodning och en tät kodning. Fältet Content-Transfer-Encoding är utformat för att ange en inverterbar kartläggning mellan den inhemska representationen Av en typ av data och en representation som lätt kan utbytas med hjälp av 7 bitars posttransportprotokoll, såsom de som definieras av RFC 821 SMTP Det här fältet har inte definierats av någon tidigare standard. Fältets värde är en enda token som specificerar typen av Kodning, som anges nedan Formellt. Dessa värden är inte skiftlägeskänsliga. Det betyder att Base64 och BASE64 och bAsE64 är lika. En kodningstyp på 7BIT kräver att bo Dy är redan i en sju-bitars mail-ready representation Det här är standardvärdet - det vill säga Content-Transfer-Encoding 7BIT antas om fältet Content-Transfer-Encoding header inte är närvarande. Värdena 8bit, 7bit och Binära betyder allt att NO-kodning har utförts Men de är potentiellt användbara som indikationer på typen av data som ingår i objektet och därför av typen av kodning som kan behöva utföras för överföring i ett visst transportsystem. Skillnaden mellan 8bit eller något annat tänkbart bitbreddstoken och det binära token är att binär inte kräver anslutning till några gränser på linjelängd eller till SMTP CRLF-semantiken, medan bitbreddsbuntarna kräver sådan vidhäftning om kroppen innehåller Data i vilken bitbredd som helst än 7 bitar måste lämplig bitbredd Content-Transfer-Encoding token användas, t. ex. 8bit för okodad 8 bitars bred data Om kroppen innehåller binär data måste binär Content-Transfer-Encoding token Användas. Implementärerna kan vid behov definiera nya innehållsöverförings-kodningsvärden, men måste använda en x-token, vilket är ett namn prefixed av X - för att ange sin icke-standardstatus, t. ex. Content-Transfer-Encoding x - My-new-encoding Men till skillnad från innehållstyp och undertyper är skapandet av nya Content-Transfer-Encoding-värden uttryckligen och kraftigt avskräckt, eftersom det verkar troligt att det hindrar driftskompatibilitet med liten potentiell nytta. Användningen är endast tillåten som resultat av Ett avtal mellan samarbetsvilliga användaragenter. Om ett rubrik för innehållsöverföring och kodning visas som en del av ett meddelandehuvud gäller den för hela meddelandets kropp Om ett rubrik för innehållsöverföring och kodning visas som en del av en kroppsdel ​​s Rubriker, det gäller bara kroppen för den kroppsdelen Om en enhet är typ av multipart eller ett meddelande får Content-Transfer-Encoding inte ha något annat värde än en bitbredd, t. ex. 7bit, 8bit, etc eller binär. Det Bör noteras att e-post är karaktär eller Så att mekanismerna som beskrivs här är mekanismer för kodning av godtyckliga oktetströmmar, inte bitströmmar. Om en bitström ska kodas via en av dessa mekanismer måste den först konverteras till en 8-bit byte-ström med hjälp av nätverksstandardbit Beställa big endian där de tidigare bitarna i en ström blir de högre ordningens bitar i en byte. En bitström som inte slutar vid en 8-bitars gräns måste fyllas med nollor. Detta dokument tillhandahåller en mekanism för att notera tillsatsen av sådan fyllning I fråga om ansökan Content-Type, som har en padding parameter. Kodningsmekanismerna definierade här uttryckligen kodar all data i ASCII. Antag exempelvis att en enhet har rubrikfält som. Detta måste tolkas så att kroppen Är en base64 ASCII-kodning av data som ursprungligen var i ISO-8859-1 och kommer att vara i den teckenuppsättningen igen efter avkodning. Följande avsnitt definierar de två standardkodningsmekanismerna Definitionen av nytt innehållsöverförings-enco Dings är uttryckligen avskräckta och bör endast uppstå när det är absolut nödvändigt. All innehållsöverföringskodnings namnrymd förutom den som börjar med X - är uttryckligen reserverad för IANA för framtida användning. Privata avtal om innehållsöverförings-kodningar är också uttryckligen avskräckta. Behöver innehållsöverföring - Kodningsvärden får endast användas på vissa innehållstyp. Det är särskilt förbjudet att använda andra kodningar än 7bit, 8bit eller binärt med något innehållstyp som rekursivt inkluderar andra innehålls-typfält, särskilt multipart och meddelande Content-Types All encodings that are desired for bodies of type multipart or message must be done at the innermost level, by encoding the actual body that needs to be encoded. Enforex Salamanca Bewertungen Ebay. So knnen wir jedes Fliesen-Fachgeschft unterbieten und Sie profitieren von unseren gnstigen Preisen Bei uns finden Sie ber 60 verschiedene Villeroy und Boch Fliesen, darunter auch die Modelle Fleisen Moonlight, Newpo rt oder Bernina Fliesen - hier werden Sie ganz sicher fndig Enforex Salamanca Bewertungen Ebay Trade Binary Options Beginners Uk Dermastir Luxury - Fiale Elastina eBay Tratamiento facial y recupera tu juventud - descuento 72 - 42 Oferplan, Oferplan La Gaceta de Salamanca Wir bieten unseren Kunden natrlich den Rund-um-Service und fhren deshalb nicht nur die Grundfliesen, sondern auch die dazugehrigen Dekorfliesen und das entsprechende Zubehr zu Villeroy und Boch Fliesen Additionally, the association will not only serve professionals, but it will offer services and programs to the Chaldean Community Ganz einfach Wir kaufen Villeroy und Boch Fliesen, Agrob Buchtal Fliesen, Novabell Fliesen und andere Markenprodukte in groen Mengen ein und geben Ihnen unseren Einkaufsvorteil direkt weiter. Hier finden Sie erstklassige Markenware wie Villeroy und Boch Fliesen zu gnstigen Konditionen Wir haben es uns zur Aufgabe gemacht, Ihnen Top-Markenfliesen zu Discountpreisen anzubieten Enforex Salamanca B ewertungen Ebay Binary Options Live Trading Roo EBay Kuferschutz Abgesichert ber den eBay-Kuferschutz Weitere Details wird in einem neuen Fenster oder Camel Active Bourse Salamanca Portefe Mr Green Shapewear frei Jackpot genie Sanduhr Bewertungen kostenlos Roulette Casino Spiele ohne Download ebay Spielautomaten zum Verkauf brigens Sollten Sie das gewnschte Produkt einmal nicht auf unserer Website finden, schicken Sie uns einfach eine Anfrage per E-Mail und wir werden uns umgehend darum bemhen, Ihnen Ihr Wunschprodukt zum gnstigsten Preis zu besorgen Dermastir Luxury - Fiale Elastina eBay Tratamiento facial y recupera tu juventud - descuento 72 - 42 Oferplan, Oferplan La Gaceta de Salamanca Auf unserer Bestsellerliste stehen Villeroy und Boch Fliesen immer wieder ganz oben, denn diese sind im Handel in der Regel sehr teuer und gerade deshalb bei uns besonders beliebt, weil wir die Villeroy und Boch Fliesen zu unschlagbar gnstigen Preisen anbieten. Binary Option Trade Copier Software Ind icator V1 0.Hungary Stock Exchange Cotton Rates. berzeugen Sie sich selbst Wenn Sie bereits ein Angebot von Ihrem Fachgeschft haben, z ber eine bestimmte Menge spezieller Wandfliesen, schicken Sie es uns per E-Mail oder Fax zu und wir werden uns bemhen, den genannten Preis zu unterbieten Enforex Salamanca Bewertungen Ebay Original karton tasche und oder mit noch am Artikel befestigten Kazakhstan Exchange Rates In Solomon Islands EBay Kuferschutz Abgesichert ber den eBay-Kuferschutz Weitere Details wird in einem neuen Fenster oder Camel Active Bourse Salamanca Portefe Wir bieten Ihnen eine riesige Auswahl an Markenfliesen in unserem Sortiment Abertura Dos Mercados Dos Forex Rates Hoje Portugal Dermastir Luxury - Fiale Elastina eBay Tratamiento facial y recupera tu juventud - descuento 72 - 42 Oferplan, Oferplan La Gaceta de Salamanca Werfen Sie unbedingt auch einen Blick in unsere TOP-Angebote, hier knnen Sie nochmal krftig sparen. We will be recognized as the preeminent association repre senting health care professionals whose primary objective is to serve and enhance the good and welfare of our community Wir haben es uns zur Aufgabe gemacht, Ihnen Top-Markenfliesen zu Discountpreisen anzubieten Enforex Salamanca Bewertungen Ebay History Of Stock Market In Panama Sie fragen sich vielleicht, wie so etwas mglich ist Enforex Salamanca Bewertungen Ebay Das gilt selbstverstndlich fr alle Produkte, auch fr hochpreisige Markenprodukte wie Villeroy und Boch Fliesen oder Feinsteinzeug poliert EBay Mitglied seit den 16 Juni 2005 und 100 positive Bewertungen infoat Wir bieten Ihnen eine riesige Auswahl an Markenfliesen in unserem Sortiment. The CAAHP was established to provide a professional forum to educate health care providers from the Chaldean Community and to give them the opportunity to interact and network on a regular basis Enforex Salamanca Bewertungen Ebay Die Nummern zeigen die jeweilige Position, an der ein Bild in den Suchergebnissen aufgefhrt Of Free Binary Options T rading Signal Zgern Sie nicht, sondern wenden Sie sich vertrauensvoll an Fliesen-Adeneuer, Ihrem gnstigen Fliesen-Onlinehandel fr Markenfliesen Free Stock Market Games For High School Students Klicken Sie auf eines der kleinen Bilder, um eine vergrerte Ansicht zu erhalten und die Originalquelle des Bildes angezeigt zu bekommen Elastina. JAVAMAIL API FAQ. Q What is the JavaMail API A The JavaMail API is a set of abstract APIs that model a mail system The API provides a platform independent and protocol independent framework to build Java technology based email client applications The JavaMail API provides facilities for reading and sending email Service providers implement particular protocols Several service providers are included with the JavaMail API package others are available separately The JavaMail API is implemented as a Java optional package that can be used on JDK 1 4 and later on any operating system The JavaMail API is also a required part of the Java Platform, Enterprise Edit ion Java EE. Q How do I get an implementation of the JavaMail API A Oracle provides a royalty-free reference implementation, in binary form, that developers may use and ship The reference implementation includes the core JavaMail packages and IMAP, POP3, and SMTP service providers The reference implementation may be downloaded here. Q Where is A is part of the JavaBeans Activation Framework JAF JAF is part of the JavaBeans Glasgow specification and is included in Java SE 6 The JavaMail API uses JAF for data content handling. Q What JDK does the JavaMail API need A The JavaMail API requires JDK JRE 1 4 or higher The JavaMail API is a Java optional package, it is not part of the core Java SE but is included in Java EE. Q Where can I find a version of JavaMail for my favorite operating system A JavaMail is completely written in Java and will run on any operating system that supports the required version of the JDK No special version is needed for different operating systems. Q Do the JavaMail APIs work in web browsers A JavaMail will work in any browser that supports the required JDK version The Java Plug-in may be required to provide such support. Q Can I use JavaMail to read mail from my web mail account such as Yahoo or Hotmail A It depends Many web-based email services provide access only using a browser with These services cannot be accessed using JavaMail If the service also provides POP3 or IMAP access, JavaMail can probably be used to access it Contact your web email service provider for details Another helpful tool is MrPostman, a proxy server that provides POP3 access to Hotmail and Yahoo Mail, available at. Q What is IMAP A IMAP stands for Internet Message Access Protocol It is a method of accessing electronic mail messages stored on a possibly shared mail server In other words, it permits a client email program to access remote message stores as if they were local IMAP is defined by RFC2060.Q What is SMTP A SMTP stands for Simple Mail Transfer Protocol It is used to transfer RFC822-style messages between different mail hosts as well as to submit new messages to a host for delivery SMTP is in very wide use it originated in 1982 and is defined by RFC821.Q What is MIME A MIME and RFC822 are the standards for describing email messages that are sent across the Internet The subpackage which is part of the JavaMail APIs provides a complete implementation of these two packages MIME is specified by the following RFCs RFC2045 RFC2046 RFC2047.Q What is POP3 A POP3 stands for Post Office Protocol version 3 POP3 is a very limited protocol for accessing a single mailbox It is much less capable than IMAP POP3 is very widely used and is defined by RFC1939.Q What about support for MAPI, NNTP, Lotus Notes, and other service providers A We have no current plans to implement any of these providers However, the architecture of the JavaMail APIs provides for being able to easily plug-in third-party service providers It is our hope that third-parties will embrace the JavaMail APIs by writing providers for other standard and proprietary protocols See our Third Party Products page for the latest list of such providers. Q How do I store mail messages on my local disk A A local store provider can be used to store mail messages on a local disk The JavaMail API download does not include such a provider but a provider that supports the Unix mbox format is available in the JavaMail source repository that you can build yourself See this page for details In addition, several local store providers are available from third parties for different local store formats such as MH and Mbox See our Third Party Products page for the latest list of such providers. Q Where do I find documentation on the protocol providers A The protocol providers for IMAP, POP3, and SMTP support many features that are not part of the JavaMail API specification The documentation for these protocol providers is included in the JavaMail javadocs The package level documentation for each prot ocol provider package describes the properties that are supported by the protocol proivder In addition, the protocol providers include some classes and methods that applications can use to take advantage of provider-specific features Note that use of these properties, classes, and methods renders a program non-portable it may only work with Oracle s implementation of the JavaMail API See the IMAP POP3 and SMTP package javadocs for details. Q Is the JavaMail API implementation completely free Can I ship it along with my product A Yes The JavaMail API implementation is completely free and open source and you can include it in your product This release includes IMAP, POP3, and SMTP providers as well Please do read the license and ensure that you understand it The JavaMail license is described here. Q Can I get the source code for the JavaMail API implementation A Starting with JavaMail 1 4 2, the source code for the JavaMail API Reference Implementation is available under the CDDL or GPL o pen source licenses in the JavaMail project at You ll need Mercurial to check out the source code. Q Is JavaMail Y2K compliant A Yes Oracle s JavaMail implementation is Option-3 Y2K compliant Please see the file in the JavaMail package for more information. Q The answer to my question isn t here, where else should I look A In addition to the JavaMail API spec and javadocs available from our main web page , don t forget to check the and files for additional important information. You can reach the JavaMail team directly at You can use this address to report bugs Bugs can also be reported using the Issue Tracker at the JavaMail project. The Oracle Technology Network maintains a JavaMail forum, see the JavaMail Forum. jGuru also maintains a JavaMail FAQ, which you ll find at although it hasn t been updated in several years. Installation and Configuration. Q How do I install the JavaMail API implementation A Unzip the distribution zip file and edit your CLASSPATH environment variable to include t he file that was included with the JavaMail API distribution You will also need an implementation of the JavaBeans Activation Framework see below unless you re using JDK 1 6 or newer which includes JAF See the file also included in the download package for additional details and examples, as well as the following FAQ entry. Q I get a ClassNotFoundException when I run my program A You haven t set CLASSPATH properly See Setting the class path Windows or Setting the class path Solaris Linux in the JDK documentation Note that if you re running your program using java - jar , the CLASSPATH environment variable setting is ignored In that case you ll need to add the - classpath argument to the java command, or add the Class-Path header to the manifest file of your jar file See the Java Tutorial and this Wikipedia article for more information. Q How do I set my CLASSPATH on Windows A Detailed instructions are available here. Q How do I add the JavaMail library to my NetBeans Java Project A Use the Library Manager to create a library and add a reference to that library to your project. Inside Netbeans, open the Library Manager Tools Libraries from the main menu bar. Select New Library. Enter a library name, e g JavaMail , and hit OK Do not check server library. Make sure the new library is selected under Libraries on the left. Select the Classpath tab on the right and choose Add Jar Folder. Using the file browser, select from your JavaMail installation e g and hit Add Jar Folder to accept. Select the Javadoc tab and choose Add ZIP Folder. Using the file browser, select the folder where the JavaMail javadoc index files are e g javamail-1 4 3 docs javadocs , and hit Add ZIP Folder to accept. If you downloaded the JavaMail source code you can set the source code reference on the Sources tab This can be helpful for debugging Using the file browser, select the source root for the JavaMail sources javamail-1 4 3 mail src main java for 1 4 3 and hit Add Jar Folder to accept. Note If you are using JDK 1 5 0 or earlier you will need to add the JavaBeans Activation Framework library as well You can create a separate library in a manner similar to the above, or just add and javadoc source references if desired to this library definition. Now add a reference to this library to your project. Open your project in NetBeans and make sure the Projects tab is visible. Right click your project in the project explorer and select Properties. In the Properties dialog, select Libraries in the tree on the left and make sure the Compile tab is selected. Click Add Library. Locate and select the library you created above and click Add Library It should be added to the list of compile-time libraries. Click OK and you re done. Q How do I add the JavaMail library to my Eclipse Java Project A Create a user library for JavaMail and add a reference to that library to your project. From the Eclipse main menu, open Window Preferences. Open the tree to Java Build Path User Libraries and select the User Libraries no de. Choose New from the panel on the right. In the new library dialog, enter a user library name, e g JavaMail , and hit OK Do not check system library. Make sure the new library is selected and choose Add Jars. Browse to where JavaMail is installed and select. Select Javadoc location None and hit Edit to add a reference to the javadoc location This can be found at docs javadocs under the same folder where you installed JavaMail. You can also set the source code reference here if you downloaded the JavaMail source code Use javamail-1 4 2 mail src main java as the source root for 1 4 2 or glassfish mail src java as the source root for 1 4 1.Choose OK to close the Preferences dialog JavaMail is now installed as a Library in Eclipse. Note If you are using JDK 1 5 0 or earlier you will need to add the JavaBeans Activation Framework library as well You can create a separate library in a manner similar to the above, or just add and javadoc source references if desired to this library definition. Now use the JavaMail library in your Eclipse Java Project Eclipse 3 4.Open your project in Eclipse and be in the Java Perspective. Right click your project in the project explorer and select Build Path Configure Build Path. In the Properties dialog that opens, ensure Java Build Path is selected in the tree on the left and select the Libraries tab on the right. Click Add Library. Select User Library , then click Next. Locate and select the JavaMail library added in the previous step, click Finish , and you re done. This article explains how to make the JavaMail source code available to your Eclipse project. Q Does JavaMail include all the necessary mail servers A No, the JavaMail API package does not include any mail servers To use the JavaMail API package, you ll need to have access to an IMAP or POP3 mail server for reading mail and or an SMTP mail server for sending mail These mail servers are usually provided by your Internet Service Provider or are a part of your organization s networking in frastructure If you don t have access to such a mail server, see below. Q Where can I get the necessary mail servers A The University of Washington IMAP server supports multiple platforms UNIX, Windows 32bit, etc Get the source code from There are several free, all Java mail servers available, including Apache James and Java Email Server Sendmail is a popular non-Java SMTP server SubEthaSMTP is a Java library for implementing SMTP server functionality their web page also references other mail servers Many other vendors provide mail servers supporting Internet standards There are also many free, public mail servers that support the required mail protocols such as Gmail, Yahoo Mail, Hotmail, etc. Q What host name, user name, or password should I use A We do not provide a mail server for you to use You must use your own mail server, or one provided by your Internet Service Provider or the company you work for Your network administrator can give you the information necessary to configure Jav aMail to work with your mail server. Q How do I configure JavaMail to work through my proxy server A JavaMail does not currently support accessing mail servers through a web proxy server One of the major reasons for using a proxy server is to allow requests from within a corporate network to pass through a corporate firewall The firewall will typically block most access to the Internet, but will allow requests from the proxy server to pass through In addition, a mail server inside the corporate network will perform a similar function for email, accepting messages via SMTP and forwarding them to their ultimate destination on the Internet, and accepting incoming messages and sending them to the appropriate internal mail server. If your proxy server supports the SOCKS V4 or V5 protocol RFC1928 and allows anonymous connections, and you re using JDK 1 5 or newer and JavaMail 1 4 5 or newer, you can configure a SOCKS proxy on a per-session, per-protocol basis by setting the property as describ ed in the javadocs for the package Similar properties exist for the imap and pop3 protocols. If you re using older versions of the JDK or JavaMail, you can tell the Java runtime to direct all TCP socket connections to the SOCKS server See the Networking Properties guide for the latest documentation of the socksProxyHost and socksProxyPort properties These are system-level properties, not JavaMail session properties They can be set from the command line when the application is invoked, for example java - DsocksProxyHost myproxy This facility can be used to direct the SMTP, IMAP, and POP3 communication from JavaMail to the SOCKS proxy server Note that setting these properties directs all TCP sockets to the SOCKS proxy, which may have negative impact on other aspects of your application. Without such a SOCKS server, if you want to use JavaMail to access mail servers outside the firewall indirectly, you might be able to use a program such as Corkscrew or connect to tunnel TCP connections thro ugh an proxy server JavaMail does not support direct access through an proxy web server. Q When connecting to my mail server over SSL I get an exception like unable to find valid certification path to requested target A Your server is probably using a test certificate or self-signed certificate instead of a certificate signed by a commercial Certificate Authority You ll need to install the server s certificate into your trust store The InstallCert program will help. Alternatively, you can set the mail protocol property to the host name of your mail server See the javadocs for the protocol provider packages for details. Other common causes of this problem are. There s a firewall or anti-virus program intercepting your request. There s something wrong in your JDK installation preventing it from finding the certificates for the trusted certificate authorities. You re running in an application server that has overridden the JDK s list of trusted certificate authorities. Q While trying to run my p rogram on Linux I get a very strange error message and the program fails What did I do wrong A The error message often looks something like this. The problem is due to a buggy version of the unzip command used to unzip the JavaMail download package on Linux The unzip command corrupts the file Get a newer version of the unzip command, or use the JDK s jar command to unzip the package. Q How do I use JavaMail in an application run under a SecurityManager what permissions must I grant to the application and to JavaMail A When using JavaMail in an environment with a SecurityManager, JavaMail will sometimes fail to read the configuration files in the file The JavaBeans Activation Framework may have the same problem reading configuration files from the file These default configuration files are stored as resource files in the META-INF directory in the jar file. There are a number of debugging techniques that can be used to determine if this is the problem Setting the Session property to true or calling will cause JavaMail to print debugging messages as it attempts to load each configuration file A message of the form DEBUG can t load default providers file indicates that this problem might exist Similarly, setting the System property to true e g by running the program using java will cause JAF to print debugging messages as it attempts to load each resource file Finally, the JDK can produce helpful debugging output by setting the system property to access failure e g by running the program using java The command java will display other security debugging options. In addition to the permissions necessary to read the configuration files, the application and JavaMail will also need permission to connect to the mail servers it uses If the application uses System properties to configure JavaMail e g by passing the Properties object returned from to the Session constructor, as many of the JavaMail demo programs do , it will also need permission to use the System Properties object A lternatively, the application can use its own Properties object and be sure to set the property or the and properties see the method. To allow an application to use JavaMail under a SecurityManager, the application, JavaMail, and JAF will need permissions such as the following be sure to replace the host and path names with appropriate values add these to the security policy file used by the application. If you don t want to give the application read write permission to System properties, but you still want to be able to use System properties to configure the application, you can give the application only read permission to System properties and use the following approach. Q How do I configure Tomcat to allow me to use JavaMail in my web application A To run a web application using JavaMail, you can add the JavaMail file and, if you re not using JDK 1 6 or newer, the JavaBeans Activation Framework file to the lib directory under the directory in which you installed Tomcat This will cause Tomcat to include these jar files in its classpath automatically For details, see JNDI Resources HOW-TO in the Tomcat documentation. Alternatively, you can package the file and files in the lib directory of your web application package war file. Q When using JavaMail in my servlet, it is unable to find any of the JavaMail classes I ve added to the server s CLASSPATH A It is often necessary to completely restart the web server when changing the CLASSPATH. Q I m sure I ve set my CLASSPATH correctly, but I m still getting complaints about classes that can t be found, such as classes A The most common cause of problems like this is having more than one copy of in your CLASSPATH or available to your application In addition to checking your CLASSPATH setting, also look for copies in the jre lib ext directory of your JDK installation If you re running in a web server or application server, it may be providing its own version of in one of its directories You should only have one version of avail able to your application. Q My servlet can find the JavaMail classes, but JavaMail complains that it can t find a service provider for smtp or imap or address type rfc822 A Usually this is because JavaMail can t access the configuration files in possibly because of a security permission problem see this item for more details Also, make sure that you haven t extracted the contents you should include the unmodified file in the server s CLASSPATH. Q How do I access Gmail with JavaMail A JavaMail is capable of sending and reading messages using Gmail All that s required is to properly configure JavaMail I ll illustrate the proper configuration using the demo programs that come with JavaMail - and You can use these programs for basic testing to ensure that your networking is working properly, that you can connect to the servers, that your username and password are correct, etc This is important when debugging problems to determine whether the bug is in your code or is elsewhere. Note that you ll need to configure your Gmail account to enable less secure apps or you ll need to use OAuth2 authentication which is somewhat more complex. Let s assume your Gmail username is and your password is passwd. To read mail from your Gmail Inbox, invoke msgshow as follows. By reading the source code, you can see how these command line arguments are used in the JavaMail API You should first try using msgshow as shown above, and once that s working move on to writing and configuring your own program to use Gmail The following code fragment shows a simple way to incorporate the needed configuration in your application. To connect to Gmail using the POP3 protocol instead of the IMAP protocol, simply change the host name to and change imap to pop3 in the property name and protocol name in the above instructions. To send a message through Gmail, invoke smtpsend as follows. The smtpsend program will prompt for a subject and message body text End the message body with D on UNIX or Z on Windows. Again, y ou can read the source code to see how the command line arguments are used in the JavaMail API The following code fragment shows a simple way to incorporate the needed configuration in your application. There is, of course, more than one way to use the JavaMail API to accomplish the same goal This should help you understand the essential configuration parameters necessary to use Gmail. Q Why do I get AuthenticationFailedException when accessing Gmail A Most likely you failed to enable less secure apps. Q Why don t I see all my messages when accessing Gmail with POP3 A Gmail has settings that control which of your messages are available via the POP3 protocol See the Gmail settings page to change the configuration of your Gmail account. Q Why doesn t search find all the messages I expect when accessing Gmail with IMAP A Gmail does not fully support all IMAP features For details see this Gmail Help page. Q How do I delete a message in Gmail A Gmail does not follow the normal IMAP conventions f or deleting messages Marking a message as deleted and then expunging the folder simply removes the current folder s label from the message The message will still appear in the Gmail All Mail folder To delete a message, copy the message to the Gmail Trash folder, which will immediately remove the message from the current folder To permanently remove a message, open the Gmail Trash folder, mark the message deleted true , and expunge the folder. Q How do I access Yahoo Mail with JavaMail A JavaMail is capable of sending and reading messages using Yahoo Mail All that s required is to properly configure JavaMail I ll illustrate the proper configuration using the demo programs that come with JavaMail - and. Let s assume your Yahoo Mail username is and your password is passwd. To read mail from your Yahoo Mail Inbox, invoke msgshow as follows. By reading the source code, you can see how these command line arguments are used in the JavaMail API You should first try using msgshow as shown above, a nd once that s working move on to writing and configuring your own program to use Yahoo Mail The code fragment shown above for connecting to Gmail will also work for connecting to Yahoo Mail by simply changing the host name. To send a message through Yahoo Mail, invoke smtpsend as follows. The smtpsend program will prompt for a subject and message body text End the message body with D on UNIX or Z on Windows. Again, you can read the source code to see how the command line arguments are used in the JavaMail API The code fragment shown above for connecting to Gmail will also work for connecting to Yahoo Mail by simply changing the host name There is, of course, more than one way to use the JavaMail API to accomplish the same goal This should help you understand the essential configuration parameters necessary to use Yahoo Mail. Q How do I access Hotmail Windows Live mail with JavaMail A JavaMail is capable of sending and reading messages using Hotmail All that s required is to properly confi gure JavaMail I ll illustrate the proper configuration using the demo programs that come with JavaMail - and. Let s assume your Hotmail username is and your password is passwd. To read mail from your Hotmail Inbox, invoke msgshow as follows. By reading the source code, you can see how these command line arguments are used in the JavaMail API You should first try using msgshow as shown above, and once that s working move on to writing and configuring your own program to use Hotmail The code fragment shown above for connecting to Gmail will also work for connecting to Hotmail by simply changing the host name. To send a message through Hotmail, invoke smtpsend as follows. Note that I split the command over three lines for display, but you should type it on one line. The smtpsend program uses the System properties when creating the JavaMail Session, so the properties set on the command line will be available to the JavaMail Session. The smtpsend program will prompt for a subject and message body text End the message body with D on UNIX or Z on Windows. Again, you can read the source code to see how the command line arguments are used in the JavaMail API The code fragment shown above for connecting to Gmail will also work for connecting to Hotmail by simply changing the host name and changing the connect call to 587, username, password There is, of course, more than one way to use the JavaMail API to accomplish the same goal This should help you understand the essential configuration parameters necessary to use Hotmail. For more details, search Windows Live Hotmail help for POP3.Q How do I access with JavaMail A JavaMail is capable of sending and reading mess ages using All that s required is to properly configure JavaMail I ll illustrate the proper configuration using the demo programs that come with JavaMail - and. Let s assume your username is and your password is passwd. To read mail from your Inbox, invoke msgshow as follows. By reading the source code, you can see how these command line arguments are used in the JavaMail API You should first try using msgshow as shown above, and once that s working move on to writing and configuring your own program to use The code fragment shown above for connecting to Gmail will also work for connecting to by simply changing the host name. To connect to using the POP3 protocol instead of the IMAP protocol, simply change the host name to and change the protocol name imaps to pop3s in the above instructions. To send a message through invoke smtpsend as follows. Note that I split the command over three lines for display, but you should type it on one line. The smtpsend program uses the System properties when creating the JavaMail Session, so the properties set on the command line will be available to the JavaMail Session. The smtpsend program will prompt for a subject and message body text End the message body with D on UNIX or Z on Windows. Again, you can read the source code to see how the command line arguments are used in the JavaMail API The following code fragment shows a simple way to incorporate the needed configuration in your application. There is, of course, more than one way to use the JavaMail API to accomplish the same goal This should help you understand the essential configuration parameters necessary to use For more details, see the Outlook Blog. Q Where can I learn the basics about Internet email that I ll need to know to program JavaMail effectively A See one of the books referenced on our web page for a good background on Intern et email, MIME, SMTP, IMAP, POP3, etc. Q Where can I find some example programs that show how to use JavaMail A There are many example programs available for download on the JavaMail project page including simple command line programs illustrating various aspects of the JavaMail API, a Swing-based GUI application, a simple servlet-based application, and a complete web application using JSP pages and a tag library. Q What are some of the most common mistakes people make when using JavaMail A Unfortunately, the internet is full of copy and paste programmers who don t understand the code they re using, which has resulted in a lot of unnecessarily complex and often incorrect examples The most common mistakes are. Use of Almost all code should use instead, as described below. Calling the send method on a Transport instance variable As described below send is a static method and ignores the Transport instance you use to call it. Setting various socketFactory properties Long, long ago JavaMail did n t have built in support for SSL connections, so it was necessary to set these properties to use SSL This hasn t been the case for years remove these properties and simplify your code The easiest way to enable SSL support in current versions of JavaMail is to set the property to true Replace smtp with imap or pop3 as appropriate. Using an Authenticator just to supply a username and password There s really nothing wrong with using an Authenticator, it s just unnecessarily complex A more straightforward approach is to call the connect method that takes a username and password when connecting to a Store When sending a message, use the static method that takes a username and password. Q How do I send a message with an attachment A A message with attachments is represented as a MIME multipart message where the first part is the main body of the message and the other parts are the attachments There are numerous examples showing how to construct such a message in the demo programs included in the JavaMail download package To attach a file use the attachFile method of MimeBodyPart. Q How do I tell if a message has attachments A In the simplest case, a message of MIME type multipart mixed with more than one body part is likely a message with attachments As described above, there are more complex cases to consider as well In particular, messages may have arbitrary nesting of multipart mixed and multipart alternative parts and may include multipart related parts for embedded HTML and multipart signed and or multipart encrypted parts for secure messages It s up to you to decide how many of these cases you want to handle in your application before deciding that a message has an attachment Most applications take a very simple approach to this and handle only a few of the most commonly seen cases. Note that while it s recommended that attachments have a Content-Disposition of ATTACHMENT , and will usually have a file name, these are not requirements Some messages with attachments wil l have only one or none of these Looking for attachments by looking for a body part with these set will fail in some cases. In the simplest case, here s how to tell if a message has attachments. Q How do I read a message with an attachment and save the attachment A As described above, a message with an attachment is represented in MIME as a multipart message In the simple case, the results of the Message object s getContent method will be a MimeMultipart object The first body part of the multipart object wil be the main text of the message The other body parts will be attachments The demo program shows how to traverse all the multipart objects in a message and extract the data of each of the body parts The getDisposition method will give you a hint as to whether the body part should be displayed inline or should be considered an attachment but note that not all mailers provide this information So to save the contents of a body part in a file, use the saveFile method of MimeBodyPart. To sa ve the data in a body part into a file for example , use the getInputStream method to access the attachment content and copy the data to a FileOutputStream Note that when copying the data you can not use the available method to determine how much data is in the attachment Instead, you must read the data until EOF The saveFile method of MimeBodyPart will do this for you However, you should not use the results of the getFileName method directly to name the file to be saved doing so could cause you to overwrite files unintentionally, including system files. Note that there are also more complicated cases to be handled as well For example, some mailers send the main body as both plain text and html This will typically appear as a multipart alternative content and a MimeMultipart object in place of a simple text body part Also, messages that are digitally signed or encrypted are even more complex Handling all these cases can be challenging Please refer to the various MIME specifications and other resources listed on our main page. Q How do I find the main message body in a message that has attachments A The following approach will handle the most common cases Handling improperly formatted messages, messages with unknown charsets, and signed or encrypted messages, can make this much more complex. You can call the getText method with a Message object which is a Part. Q How do I find the attachments in a message A There s a wide variety of possible MIME structures for email A general solution can be quite complex since it would need to take into account signed and encrypted messages, among other issues Different mailers will use different MIME structure, and of course some mailers will have bugs in how they use MIME You need to decide which cases you need to support. In general, multipart alternative is used to contain different versions of the main message body, and so can be skipped because it doesn t contain any attachments Typically, a message with attachments will have a to p level multipart mixed content with the first body part containing the main message body The first part may be a simple text part, a multipart alternative with text plain and text html parts, or a multipart related with a text html part and associated images. Attachments will usually, but not always, have a Content-Disposition of attachment Attachments will usually, but not always, have a file name. So, a good approach to start with is to only consider messages with a top level multipart mixed content and then consider the parts after the first part to be attachments whether they say so or not And as I said above, signed and encrypted messages will make this more complex. Q How do I get all the unread messages in a folder A Search for all messages with the SEEN flag not set. Q Should I use the isMimeType method, or should I use instanceof on the object returned by the getContent method, when deciding how to process a message part A It is almost always more efficient to use the isMimeType method The demo program shows how to use the isMimeType method when traversing the parts of a message. Q When reading a multipart message, why is the getContent method returning an IMAPInputStream or SharedByteArrayInputStream instead of a MimeMultipart object A This usually happens because the JavaBeans Activation Framework JAF can t find the mailcap configuration file included in the file JAF uses the thread s context class loader to look for the configuration file If the context class loader is not set properly, this can fail Most application servers should set the context class loader properly, but at least some versions of Tomcat do not One workaround is to put the file in Tomcat s lib directory instead of including it in the war file Another workaround is to add code such as the following to the beginning of your application. And of course you should always make sure the message you re dealing with is a multipart message before calling the getContent method, using something like if multipart as described above and in this example. Q When I attach a file it gets a MIME type of application octet-stream instead of the correct MIME type A The FileDataSource class uses the JavaBeans Activation Framework JAF class MimetypesFileTypeMap to determine the MIME type of a file based on the extension of the filename The default mapping knows about only a few extensions You can add support for more extensions either programmatically or by adding a configuration file to your application For example, to map the extension to the MIME type application msword create a file with the single line. See the javadocs for the MimetypesFileTypeMap class for details. Q How do I manually set the MIME type for an attached file, for example in the case where the filename doesn t have an obvious extension A Subclass the FileDataSource class and override the getContentType method Note that with this approach you can t use the attachFile method. Q How do I create a multipart message with a part of a ny MIME type I choose A The JavaMail API includes builtin support for the most common MIME types, but to create a message that includes data in a MIME type that JavaMail does not already understand, you ll need to supply that data to JavaMail in a byte stream format The ByteArrayDataSource class in the pacakge in JavaMail 1 4 and later, or included in source code in the demo directory of older versions of the JavaMail download package, can help This class will take a String byte array, or InputStream and create a DataSource object that you can use as follows. You can specify any MIME type that you want The MimeBodyPart object can then be added to a MimeMultipart object in the usual way. Note that if you create a ByteArrayDataSource with an InputStream it first copies all of the data in the stream into memory This is necessary because a DataSource needs to be able to supply multiple InputStream objects so that JavaMail can read the data once to determine what Content-Transfer-Encoding is appropriate, and then read the data again to include the data in the message. Q Can I read or send a Microsoft Office document using JavaMail A JavaMail can read a Microsoft Office document as an attachment and save that document in a file Likewise, JavaMail can attach a Microsoft Office document to a message and send it as an attachment Use the MimeBodyPart saveFile and attachFile methods To process the content of a Microsoft Office document you ll need a separate library such as Apache POI. Q How do I create or process calendar appointments A The iCal4j project provides an API that might be useful More information about how different products, such as Microsoft Outlook, support calendar appointments is available here This blog entry might also be helpful. Q When should I use and when should I use A Almost all code should use The method creates a new Session the first time it s called, using the Properties that are passed Subsequent calls will return that original Session and ignore any Properties you pass in If you want to create different Sessions with different properties, won t do that If some other code in the same JVM e g in the same app server has already created the default Session with their properties, you may end up using their Session and your properties will be ignored This often explains why your property settings seem to be ignored Always use to avoid this problem. Q What is disconnected support A A mail client supporting disconnected operation will allow the user to access messages in a remote message store e g IMAP , cache parts of some of those messages locally, and break the connection to the server While in this disconnected state, the mail client can access the messages that have been cached, possibly deleting them or saving them to other folders When the mail client next connects to the remote message store, the changes made locally will be synchronized with the remote store Similarly, disconnected support may allow the client to send messages whe n there is no connection to the server, with the messages being queued until a connection to the server is available See also RFC 1733 and RFC 4549.Q How do I support disconnected operation using the JavaMail APIs A The JavaMail API specification defines interfaces that can be used by a mail client to support disconnected operation Our IMAP provider implements these interfaces the UIDFolder interfaces. Q How do I send secure email using the JavaMail APIs A The JavaMail APIs currently have no support for sending or receiving secure email The architecture of the JavaMail APIs allows such support to be easily added later, by us or by third parties Information on the current Email security standards S MIME and PGP can be found at Please browse our Third Party Products page for solutions from other vendors The most popular third party solution is the Bouncy Castle library. Q The writeTo method generates message text with lines that are neither the canonical MIME representation of the data i e using CRLF to terminate lines , nor using the canonical line separator of my platform e g n on UNIX How do I get either of these representations if I need them A In either case you ll need to create an appropriate FilterOutputStream to hand to writeTo The FilterOutputStream will need to accept lines with any of the common line terminators and write out lines with only the desired line terminator The following are examples of such filters NewlineOutputStream converts to the local platform s line terminator and is useful when writing a message to a file CRLFOutputStream converts to the MIME canonical CRLF line terminator and is useful when the canonical MIME format is needed e g to compute a digital signature. Q Can I use the JavaMail APIs to implement a mail server A The JavaMail APIs were not intended to help you implement a mail server Nonetheless, some of the utility classes, such as the MIME message parsing classes, might be of use to you In general you ll find that the JavaMail API errs on the side of simple instead of robust That s appropriate for a mail client, but a mail server would likely make different tradeoffs. Q Can I use the JavaMail APIs to add new user accounts to my mail server, remove user accounts from my mail server, or change the passwords for user accounts on my mail server A The JavaMail API does not include any facilities for adding, removing, or changing user accounts There are no standards in this area every mail server handles this differently. Q Can I use the JavaMail APIs to access my address book on my mail server A The JavaMail API does not include any facilities for accessing an address book There are no standards in this area every mail server handles this differently If you can figure out how your server does it, you might be able to find a Java API to access it For example, if your server stores address books in LDAP, you could use the JNDI API to access it. Q Why doesn t the MimeMessage class implement Serializable so that I can seri alize a message to disk and read it back later A The JavaMail API was designed to layer on top of existing email systems, using existing message formats The ability to use Java serialization was neither essential nor useful for such implementations, and thus was not considered a goal of the JavaMail API. The hard part about serializing a Message is retaining the pointers to the Folder, Store, and Session If you only want to save the content of the message, and not the object itself, the writeTo method of a message gives you everything you need If you want to create an entire email system based on serialized messages, you should be able to subclass Message et al and implement Serializable in your subclass. If you want to serialize other objects of your own that reference MimeMessages, the writeObject method of your object can use the writeTo method of MimeMessage, and the readObject method of your object can use the MimeMessage constructor that takes an InputStream Your class will need to provide a Session when constructing the MimeMessage. Q How do I write a Service Provider A Please read the Service Provider documentation for details In general, if you want to write a Store provider, you subclass possibly and a few others For a Transport provider, you subclass possibly and a few others Then you add the entry describing your provider to the registry If you re interested in writing a service provider for a protocol or messaging system not currently supported by the JavaMail API implementation, please contact us at. Q I m having trouble logging into my Microsoft Exchange server, even though I m sure I m using the correct username and password, what could I be doing wrong A When logging in to Exchange you need to use a username that s more than your simple login name For example, if your email address is , your Windows NT login name is juser , your NT domain name is dom , and your Exchange mailbox name is Joe User , then you would need to use a username of when logging in using JavaMail. Note also that there s a bug in Exchange 2007 The Exchange server advertises that it supports AUTH PLAIN, even though this Exchange documentation claims that it s not supported This causes JavaMail to choose PLAIN authentication, which will always fail To work around this Exchange bug, set the session property to true Change imap to imaps if you re using the imaps protocol. Q How do I encode a binary file before sending it and how do I decode it when I receive it A You don t need to JavaMail will automatically determine an appropriate encoding to use for your message parts before sending the message, and will automatically decode message parts when reading them The getInputStream method will return the decoded data. Q If I don t need to encode and decode attachments myself, when should I use the MimeUtility methods A The MimeUtility methods are useful in cases that JavaMail doesn t handle automatically for you One such case that occurs frequently is encoding of filenames T he base MIME spec does not allow header parameter values such as the filename parameter to be encoded in the same way that e g the Subject header may be encoded This restricts parameter values, and thus filenames, to ASCII However, some mailers actually do encode non-ASCII filenames using the MIME text encoding Applications that wish to interoperate with such non-standard mailers can use the encodeText method to encode filenames before calling the MimeBodyPart setFileName method, and can use the decodeText method to decode returned filenames See also this entry below if you need to encode filenames. Q I have data that s already encoded in e g base64, how do I tell JavaMail to send this data without re-encoding it A Use the PreencodedMimeBodyPart class, new in JavaMail 1 4.Q Even though JavaMail does all the encoding and decoding for me, I need to manually control the encoding for some body parts A In the rare case that you need to control the encoding, there are several ways to override JavaMail s default behavior A simple approach is as follows After creating the entire message, call and then use something like Content-Transfer-Encoding , base64 to force base64 encoding for the given body part. Another approach is to subclass MimeBodyPart and override the updateHeaders method so that it first calls and then sets the Content-Transfer-Encoding header as above. Q Why doesn t JavaMail properly encode and decode filenames in non-ASCII character sets A The filename is stored as a parameter in MIME headers Encoded filenames of the form ISO-8859-15 B 5OTkLUluZm8ucGRm are not part of the MIME spec A filename of the form A B C is a perfectly valid filename, not an incorrectly encoded filename JavaMail does not encode and decode filenames by default because doing so would violate the MIME spec. The base MIME spec does not allow for encoding parameters RFC 2231 defines a new way to include encoded paramters, including filenames, in MIME headers It is not compatible with the de fac to way that many older applications illegally encode filenames Even though JavaMail supports RFC 2231, that alone does not allow JavaMail to interoperate with these older programs Most recent email programs support RFC 2231 and JavaMail enables support for it by default starting in JavaMail 1 5 To enable RFC 2231 support in older JavaMail releases for encoded parameters, set the System properties and to true. If you choose to violate the MIME spec, in order to interoperate with other programs that also violate the MIME spec, JavaMail gives you all the tools you need to do so Starting with JavaMail 1 4, setting the System properties and to true will cause JavaMail to encode and decode the filename parameter using the non-RFC 2231 MIME encoding. Applications using earlier versions of JavaMail can use the following workaround to encode a filename. The workaround for decoding a filename is equally simple. String filename. Again, this is primarily for applications using old versions of JavaMail Most applications should never need to use these methods. Q Why do I get an error such as Permission denied connect when connecting to my mail server using JDK7 A You may be running into this issue with support for IPv6 You can work around this problem by setting the System property to true You can do this when starting your program using java. Q How do I debug my application that uses JavaMail APIs A Turn on session debugging by invoking the method setDebug true on the Session object in your code That will cause debug information to be printed to the console, including a protocol trace If you passed the System properties to the Session when you created it, you can simply run your program with java If you think that you found a bug in JavaMail, send us this trace along with a test case that reproduces the problem, the platform you are using, the version of the JDK you are using, and the name and version of the mail servers IMAP, SMTP that you are using. Q How do I debug problems connectin g to my mail server A The first thing to do when debugging such problems is to determine whether it s a Java problem or a networking problem Use telnet to try to connect to the remote system For example, if you re having trouble connecting to the POP3 server named you would use. telnet 110.If you re trying to connect to an SMTP server, use 25 instead of 110 for the port number If you re trying to connect to an IMAP server use 143 for the port number. If you get a greeting banner you can simply disconnect If this works, your networking, name service, firewall, etc are all set up correctly and your problem is most likely in your Java program. If it doesn t work, you ll need to check your networking configuration or talk to your network administrator for help Sometimes a firewall installed on your local machine or on your network will prevent you from connecting to the server If telnet complains that it doesn t know the host name that you re using, most likely your name service e g DNS isn t properly configured to resolve internet host names None of these problems are JavaMail or Java problems. Usually, when you get a low level SocketException when connecting, the problem is due to your networking configuration Usually it s not a Java problem. If you ve succeeded in connecting with telnet, the next thing to do is to turn on Session debugging and get the protocol trace when JavaMail tries to connect to the remote machine, as described above This will often include more detailed error messages from the server that will indicate the real source of the problem. Q How do I debug problems connecting to my mail server using SSL A Debugging SSL problems, and in particular certificate problems, can be difficult The file includes some useful information JavaMail uses the JDK s JSSE API to provide SSL support You can find information about debugging JSSE problems in the JSSE Reference Guide. Q How do I debug problems with Java security permissions A You can set the System property to de bug problems with Java security permissions To get the possible values for setting that property, the following command will print a help message java MyClass. Q I tried running your demos against my IMAP server, but I get an error A First verify that you indeed have an email account on the IMAP server Check with your system administrator about it Turn debug mode on, by invoking the method setDebug true on the session object in your code This will cause the IMAP protocol trace to be dumped on your screen Send us this trace The trace will be very useful to us for identifying the problem If you can, please send us vendor information about your IMAP server. Q I can read messages from my IMAP server with other mail clients, but even though I can connect to the server using JavaMail, when I use JavaMail to read some messages it fails Doesn t that mean there s a bug in JavaMail A No, not usually Most other mail clients make very little use of the rich IMAP protocol They use the IMAP protocol a s little more than a variant of the POP3 protocol, typically downloading the entire message to the client and parsing it in the client This allows them to avoid all sorts of parsing and protocol bugs in many IMAP servers, but of course it comes at the cost of being less efficient because they don t take advantage of the IMAP protocol s ability to fetch only the parts of the message that are needed These server bugs often manifest themselves as the following exception on the client Unable to load BODYSTRUCTURE. The best approach when running into server bugs of this sort is to contact the vendor of the server and get them to fix their product Contact and we ll help you pinpoint the problem so that you can report it to the server vendor If you can t get a fix from the server vendor, the following technique will often allow you to work around these server bugs. In some cases, the server may be so badly broken that loading the envelope data is not possible, which can cause the above workarou nd to fail because internally it first fetches the message flags and message size from the server In that case, the following approach will usually work. Q The IMAP provider seems to lose data when I fetch messages with large attachments A This is due to bugs in the partial fetch implementation of your IMAP server To workaround this server bug, set the property to false Refer to from the JavaMail package for more information. Q Does the IMAP provider cache the retrieved data A The IMAP provider fetches the data for a message from the server only when necessary The can be used to optimize this The header and bodystructure information, once fetched, is always cached within the Message object However, the content of a bodypart is not cached So each time the content is requested by the client either using getContent or using getInputStream , a new FETCH request is issued to the server The reason for this is that the content of a message could be potentially large, and if we cache this conten t for a large number of messages, there is the possibility that the system may run out of memory soon since the garbage collector cannot free the referenced objects Clients should be aware of this and must hold on to the retrieved content themselves if needed. Q I want to move messages between folders Should I use appendMessages or copyMessages A Use copyMessages if the messages to be copied moved belong to the folder on which this method is being invoked This is because some implementations can optimize this operation if the source and destination folder belong to the same backend Store Otherwise, use appendMessages. Q Retrieving large message bodies seems inefficient at times A If you are using the IMAP provider, you could try increasing the property the current default is 16k This will cause data to be fetched from the server in larger chunks Note that you risk the possibility of the JVM running out of memory when you do this. Q I get OutOfMemory errors when loading this large binary a ttachement A Increase the maximum JVM heapsize at startup Use the - mx option if using the standard JVM from Oracle Don t keep references to the content of messages not being used In certain cases, you could try streaming the message content using getInputStream as raw bytes, use and then discard the used data chunks. Q Why do I get the UnsupportedDataTypeException when I invoke getContent on a bodypart A The getContent method returns a Java object that represents the bodypart content For this to work, a JAF DataContentHandler corresponding to the content s MIME type must be registered Otherwise, the UnsupportedDataTypeException will be thrown In this case, you can use the getInputStream method to retrieve the content as a stream of bytes See the JAF docs for details on how to create and register your own DataContentHandlers. Q Why do I get the UnsupportedEncodingException when I invoke getContent on a bodypart that contains text data A Textual bodyparts i e bodyparts whose type is text p lain , text html , or text xml return Unicode String objects when getContent is used Typically, such bodyparts internally hold their textual data in some non Unicode charset JavaMail through the corresponding DataContentHandler attempts to convert that data into a Unicode string The underlying JDK s charset converters are used to do this If the JDK does not support a particular charset, then the UnsupportedEncodingException is thrown In this case, you can use the getInputStream method to retrieve the content as a stream of bytes For example. There are some commonly used charsets that the JDK does not yet support You can find support for some of these additional charsets in the JCharset package at. You can also add an alias for an existing charset already supported by the JDK so that it will be known by an additional name You can create a charset provider for the bad charset name that simply redirects to an existing charset provider see the following code Create an appropriate CharsetProv ider subclass and include it along with the META-INF services file and the JDK will find it Obviously you could get significantly more clever and redirect all unknown charsets to us-ascii , for instance. Q How do I process all the messages in an IMAP folder and add a listener to wait for the arrival of new messages A Open the folder, process all the messages in the folder, and check whether new messages have arrived the message count has increased If so, loop If not, add the listener, then wait for new messages e g by calling the idle method. Part of the key to understanding how this works is understanding when the server is allowed to notify the client of new messages, and when JavaMail will see those notifications Between getting the number of messages and adding the listener, JavaMail won t see any notifications of new messages By the time you do an operation that will allow JavaMail to see the notification, the listener will be in place. The following code illustrates the general appr oach Many details have been omitted. Q How do I reply to a message A To reply to a message, use the reply method on the Message object This method will return a new object with the headers set appropriately for a reply You ll need to supply the content of the message yourself If you have the content of the original message as a String, you can use a simple method such as the following to create the prototypical reply text, which inserts in front of each line. Q How do I forward a message A The approach used to forward a message depends on how you want to present the forwarded message It s straightforward to create a new MimeMessage, address it appropriately, and attach an existing message as an attachment to the new message To attach the original message to the new message, use code such as. If instead you want to create the new message with the text of the original message included in the new message, to forward the message inline , you can use an approach such as the following. You ll have to write the formatAddressList method using the toUnicodeString method of InternetAddress You ll also want to include appropriate error checking and test for null values. Q How do I send HTML mail A There are a number of demo programs included with the distribution that show how to send HTML mail If you want to send a simple message that has HTML instead of plain text, see the program in the demo directory If you want to send an HTML file as an attachment, see the example that shows how to send any file as an attachment. Q How do I send mail with formatted text using different fonts and colors A The simplest approach is to send a message using HTML text See above. Q How do I send mail with both plain text as well as HTML text so that each mail reader can choose the format appropriate for it A You ll want to send a MIME multipart alternative message You construct such a message essentially the same way you construct a multipart mixed message, using a MimeMultipart object constr ucted using new MimeMultipart alternative You then insert the text plain body part as the first part in the multpart and insert the text html body part as the second part in the multipart You ll need to construct the plain and html parts yourself to have appropriate content See RFC2046 for details of the structure of such a message. Q How do I send HTML mail that includes images A The simplest approach is to send HTML text with image tags that reference images on a public web site In this approach the images aren t actually included in the message, and so won t be visible if the user is not connected to the Internet when they read the message Note also that some mailers will refuse to display images that are on remote sites. Alternatively, you can construct a MIME multipart related message See RFC2387 for details of the structure of such a message A simple example follows. Q What s the difference between the Transport methods send and sendMessage A The send method is a static method and c an be used without needing an instance of a Transport object It is intended for the common, simple case of sending a single message using the default transport Internally, the send method will first call the saveChanges method on the message It will then create an appropriate new Transport object, call the Transport s connect method, call the Transport s sendMessage method to actually send the message, call the Transport s close method, and finally abandon the new instance of the Transport object to be collected by the garbage collector Actually, it s rather more complicated than that, but that s the general idea. As you can see, the static send convenience method is built on the more general per-instance sendMessage method There are a number of reasons for an application to use the sendMessage method directly The most common reasons are to improve performance by sending more than one message during a single connection, or to manually manage the connection so as to provide authenticatio n information. Q When I try to send a message I get an error like SMTPSendFailedException 530, Address requires authentication A You need to authenticate to your SMTP server The package javadocs for the package describe several methods to do this The easiest is to replace the call with username, password. You ll have to supply the appropriate username and password needed by your mail server. Q How do I use SSL or TLS when connecting to my mail server A To use SMTP over SSL, set the property in the Session properties To use the STARTTLS command set the property in the Session properties For example. Q I need to authenticate to my SMTP server so I call user, password and then to send the message, but it s not working A You should call addrs to send the message As described above the send method is a static convenience method that acquires its own Transport object and creates its own connection to use for sending it does not use the connection associated with any Transport object through whic h it is invoked. Q I modified this message, but the headers do not reflect the changes A You should call saveChanges after you create a new message or modify an existing message This will cause the headers to be reset and reflect your changes Note that the method calls this implicitly So if all you are doing is sending the modified message, you can skip calling saveChanges yourself saveChanges is a potentially expensive operation especially for large or deeply nested messages , so call it only when needed. Q I set a particular value for the Message-ID header of my new message, but when I send this message that header is rewritten A A new value for the Message-ID field is set when the saveChanges method is called usually implicitly when a message is sent , overwriting any value you set yourself If you need to set your own Message-ID and have it retained, you will have to create your own MimeMessage subclass, override the updateMessageID method and use an instance of this subclass. Q Why do I get an UnsupportedDataTypeException when sending this new message that I created A You probably set some content for your message using the setContent Object o, String type method For this to work, there must be a JAF DataContentHandler registered for the given type If not, you will get the UnsupportedDataTypeException See the JAF documents for more information In most cases the simplest workaround is to use a ByteArrayDataSource as described above. Q How can I explicitly set the SMTP FROM attribute when sending a message A The property can be used to set the SMTP FROM attribute If this property if absent, the message s From attribute is used If multiple threads need to send mail simultaneously, and each needs to set the From attribute, each thread should use its own Session object with its own Properties object The property can then be set on each Properties object for each Session and thus each thread independently Alternatively, each thread can use the class The setEnvelopeFrom me thod on that class can be used to set this value With this approach, all threads can use the same Session. Q I want to repeatedly send messages, to a different set of recipients each time But invoking causes a new Transport session to be established each time This is suboptimal in this case, so how do I get around this A Create an instance of the appropriate Transport object, connect to it and invoke the sendMessage method repeatedly For example. Q I get MessagingException 501 HELO requires domain address when trying to send a message A The SMTP provider uses the results of in the SMTP HELO command If that call fails to return any data, no name is sent in the HELO command Check your JDK and name server configuration to ensure that that call returns the correct data You may also set the property to the name you want to use for the HELO command. Q I get Must issue a STARTTLS command first when trying to send a message A Your SMTP server wants you to switch from a plain text connection to a secure connection using the STARTTLS command You can enable use of this command by setting the Session property to true This will cause the SMTP protocol provider to issue the STARTTLS command after connecting to the server See the file for additional information Also, the javadocs for the package has more information on the properties that can be set. Note that your server is most likely also going to want you to authenticate, as described in this entry. Q If I send a message to a bad address, why don t I get a SendFailedException or TransportEvent indicating that the address is bad A There is no end-to-end address verification on the Internet Often a message will need to be forwarded to several mail servers before reaching one that can determine whether or not it can deliver the message If a failure occurs in one of these later steps, the message will typically be returned to the sender as undeliverable A successful send indicates only that the mail server has accepted the message and will try to deliver it. Q When a message can t be delivered, a failure message is returned How can I detect these bounced messages A While there is an Internet standard for reporting such errors the multipart report MIME type, see RFC1892 , it is not widely implemented yet RFC1211 discusses this problem in depth, including numerous examples. In Internet email, the existence of a particular mailbox or user name can only be determined by the ultimate server that would deliver the message The message may pass through several relay servers that are not able to detect the error before reaching the end server Typically, when the end server detects such an error, it will return a message indicating the reason for the failure to the sender of the original message There are many Internet standards covering such Delivery Status Notifications but a large number of servers don t support these new standards, instead using ad hoc techniques for returning such failure messages This makes it very diffic ult to correlate a bounced message with the original message that caused the problem Note that this problem is completely independent of JavaMail JavaMail now includes support for parsing Delivery Status Notifications see the file in the JavaMail package for details. There are a number of techniques and heuristics for dealing with this problem - none of them perfect One technique is Variable Envelope Return Paths, described at The use of VERP with JavaMail and Apache James is described here. Q When I construct an InternetAddress object, why don t I get an exception if the address is illegal A The InternetAddress class only checks the syntax of the address As discussed above the InternetAddress class is not able to determine whether the address actually exists as a legal address It is not even possible to verify the host name if the application is running behind a firewall or isn t currently connected to the Internet. Q When I try to send a message, why do I get 550 Unable to relay for my - address A This is not a JavaMail problem This is an error reply from your SMTP mail server It indicates that your mail server is not configured to allow you to send mail through it Typically, mail servers for an organization will be configured to allow mail from within the organization to be sent to other addresses within the organization, or to addresses external to the organization It will also typically allow mail coming from an address external to an organization to be sent to addresses within the orgnaization What it will typically not allow is mail coming from an address external to the organization to be sent relayed to another address also external to the organization The configuration of the mail server determines whether such relaying is allowed, and which addresses are considered internal vs external Often mail servers will require you to authenticate before they will relay messages. Q When I try to send a message to for example Yahoo, why do I get an error that says connecti on refused A The host you re trying to connect to is most likely not running a mail server If you re trying to connect to a web mail service such as Yahoo, you can t usually use the web host name e g since this host doesn t run the required mail server Instead, you ll need to learn the name of the host running the required mail server contact your web mail provider for this information You can find this information for Yahoo at Note that some web mail providers don t offer this service, instead allowing you to access your mail only through a browser. If you re not trying to connect to a web mail account, but instead are trying to connect to a host on your local network, then most likely the host you re trying to connect to is not running a mail server Sometimes this will occur if you forget to set for example the property, which will cause you to try to connect to localhost Most Windows machines do not run a mail server, although many UNIX Solaris, Linux, etc machines do Thus, attempts to connect to localhost on Windows machines will usually fail with a connection refused error. Q When sending mail, why does it fail with an exception that includes a message something like 553 To send mail, first check your mail with a valid POP account A In order to prevent their use to send spam, some mail servers will require you to have a valid POP3 account and require you to login to that account before they ll let you send mail through that mail server This is simple to handle in JavaMail When you know that you re dealing with such a mail server, make sure you connect to your POP3 Store on that mail server before sending mail. Q I want to delete messages on a POP3 server I set the DELETED flag on those messages Then I call the expunge method, but I get a MethodNotSupportedException How do I delete messages when I use the POP3 provider A The expunge method is not supported by the POP3 provider Instead, after marking the messages to be deleted by setting the DELETED flag on those me ssages, close the folder with the expunge flag set to true That is, invoke. Q How can I retrieve POP3 UIDLs in messages obtained from the POP3 provider A This is possible with the POP3 provider See the package documentation for details. Q How can I tell which messages are new with POP3 A The POP3 protocol doesn t provide support for any permanent flags so the RECENT flag is of no use The package documentation discusses several strategies for dealing with this problem. Q Why does hasNewMessages always return false when using POP3 A The POP3 protocol provides no way to determine whether a folder has new messages. Q I set up a MessageCountListener as demonstrated in the monitor program but I m never notified of new mail in my POP3 INBOX A The POP3 protocol does not allow the client to see new messages delivered to the INBOX while the INBOX is open The application must close the INBOX and reopen it in order to see any new messages You will never be notified of new mail using the MessageCountLi stener interface with POP3 See the package documentation for more information. Q Why does getReceivedDate return null when using POP3 A The POP3 protocol does not provide information about when a message was received It may be possible to guess at the received date by looking at some message headers such as the Received header, but this is not very reliable. Q When using POP3 I get complaints about the SocketFetcher class A Most likely you have more than one version of or in your CLASSPATH Check the setting of CLASSPATH and check the jre lib ext directory in the JDK. Q When using POP3 I get complaints about the contentStream field A The error usually looks like. As above you ve mixed versions of the POP3 provider and You probably have an older version of in your CLASSPATH before the newer version that includes the POP3 provider. Q How do I access or create folders other than INBOX on my POP3 server A You can t POP3 servers only support a single mailbox per user Most mail readers that use PO P3 also maintain a local message store into which they copy incoming messages from the POP3 INBOX and allow you to file messages in other folders See this item for more information about local store providers. Q Why does the getSize method return a negative number when using POP3 A Your POP3 server is broken The POP3 provider uses the TOP command to fetch the headers for the message and the LIST command to determine the size of the entire message It then subtracts the two values to determine the size of the message body If the server reports the size of the entire message incorrectly, you may get a negative number You can set the property to true to disable the use of the TOP command, but note that this will cause any access to the message headers to fetch the entire message. Q I m having problems using POP3 with Microsoft Exchange A Some versions of Microsoft Exchange do not implement the POP3 protocol properly They return different headers from the TOP command than they do from the RET R command This can cause all sorts of strange failures in JavaMail One solution is to disable use of the TOP command, as described above Another approach that works in some cases os to tell JavaMail to forget about the headers it retrieved using the TOP command after retrieving the entire message using the RETR command To do this, set the property to true. JavaMail in servlets. Q Can I use JavaMail in servlets A Yes, see the Installation and Configuration section above for more details The JavaMail API is also a required part of the Java Platform, Enterprise Edition Java EE No installation or configuration is necessary when using JavaMail in a Java EE product, it s just there. Q My web application uses JavaMail to attach and send a file that the user specifies, but my application can t find the file A If the user species the filename in an HTML form in the browser, the filename is normally the name of a file on the user s machine, not on the server The file will need to be uploaded to the server before JavaMail can access it The Apache Jakarta Commons FileUpload package can help. JavaMail in applets. Q Can I use JavaMail in applets A Yes, JavaMail will work in applets in browsers that support the required JDK version The Java Plug-in may be required to provide such support. Q What are the security implications of using JavaMail in an applet A One of the biggest issues with using JavaMail in applets is the default applet security restrictions These restrictions only allow applets to connect to the host from which they were loaded Thus, for such applets to use JavaMail, the mail server will need to be located on the same machine as the web server from which the applet is loaded You can find more information on the applet security model here. Q Ok, maybe I really don t want to use an applet, what should I do instead A In general, we recommend use of a web application to collect a mail message and send it using JavaMail The demo servlet included in the JavaMail download packag e illustrates this approach The Email Web Application demo program on the Oracle Technology Network illustrates another approach using JavaServer Pages.

No comments:

Post a Comment