This is an old revision of the document!


Laborator 05: Serviciul de e-mail

1. Trimiterea și citirea e-mail-urilor local (2p)

  • Comenzi/concepte/fișiere
    • postfix
    • mail
    • /etc/aliases
    • newaliases
    • .forward

Tutorial

  • Verificați dacă utilitarul mail este instalat. Comanda mail (sau mailx) poate fi folosită pentru transmiterea sau recepționarea de email-uri, din linia de comandă.
  • Folosiți mail pentru a trimite un mesaj din contul utilizatorului root către student.
root@mjolnir:~# echo "Hello" | mail -s hello student
  • Verificați căsuța poștală implicită a utilizatorului student (/var/mail/student).
student@mjolnir:~$ ls -l /var/mail/student
-rw-rw---- 1 student mail 590 Dec 14 20:45 /var/mail/student

student@mjolnir:~$ cat /var/mail/student
From root@mjolnir.labs.cs.pub.ro Wed Dec 14 20:45:00 2011
Return-path: <root@mjolnir.labs.cs.pub.ro>
Envelope-to: student@mjolnir.labs.cs.pub.ro
Delivery-date: Wed, 14 Dec 2011 20:45:00 +0200
Received: from root by mjolnir.labs.cs.pub.ro with local (Exim 4.76)
	(envelope-from <root@mjolnir.labs.cs.pub.ro>)
	id 1Ratp6-0002VY-0X
	for student@mjolnir.labs.cs.pub.ro; Wed, 14 Dec 2011 20:45:00 +0200
To: student@mjolnir.labs.cs.pub.ro
Subject: hello
Message-Id: <E1Ratp6-0002VY-0X@mjolnir.labs.cs.pub.ro>
From: root <root@mjolnir.labs.cs.pub.ro>
Date: Wed, 14 Dec 2011 20:45:00 +0200

Hello


student@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/student": 1 message 1 new
>N  1 root@mjolnir.labs  Wed Dec 14 20:43   16/590   hello
& 1
Message 1:
From root@mjolnir.labs.cs.pub.ro Wed Dec 14 20:43:19 2011
Envelope-to: student@mjolnir.labs.cs.pub.ro
Delivery-date: Wed, 14 Dec 2011 20:43:19 +0200
To: student@mjolnir.labs.cs.pub.ro
Subject: hello
From: root <root@mjolnir.labs.cs.pub.ro>
Date: Wed, 14 Dec 2011 20:43:19 +0200

Hello

& q
Saved 1 message in /home/student/mbox

Exerciții

  • [01]. Instalați MTA-ul postfix. Alegți opțiunile implicite în timpul asistentului de instalare.
Show solution
Hide solution
Show solution
root@mjolnir:~# apt-get install postfix
  • [02]. Inspectând conexiunile TCP active, aflați portul pe care ascultă serverul de mail conexiuni. (Hint: netstat)
  • [02].a Cum se numește executabilul asociat?
Show solution
Hide solution
Show solution
root@mjolnir:~# netstat -lntp | grep ":25"
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      10866/master 
  • [03]. Adăugați utilizatorii alice, bob și charlie pe mașina fizică (adăugați utilizatorii în grupuri omonime, creați-le directoare home și specificați /bin/bash ca shell implicit).
Show solution
Hide solution
Show solution
root@mjolnir:~# groupadd alice

root@mjolnir:~# useradd -d /home/alice -m -g alice -s /bin/bash alice

root@mjolnir:~# echo "alice:alice" | chpasswd

root@mjolnir:~# groupadd bob

root@mjolnir:~# useradd -d /home/bob -m -g bob -s /bin/bash bob

root@mjolnir:~# echo "bob:bob" | chpasswd

root@mjolnir:~# groupadd charlie

root@mjolnir:~# useradd -d /home/charlie -m -g charlie -s /bin/bash charlie

root@mjolnir:~# echo "charlie:charlie" | chpasswd
  • [04]. Din contul utilizatorului alice, trimiteți un mail catre bob cu subiectul salutare (Hint: mail, curs slide 19)
Show solution
Hide solution
Show solution
alice@mjolnir:~$ echo "Mesaj de la alice catre bob" | mail -s "Hello" bob
  • [05]. Din contul utlizatorului bob, verificați casuța de mesaje e-mail. Dupa aceasta operatiune, NU inchideti utilitarul mail. (Hint: mail)
Show solution
Hide solution
Show solution
bob@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/bob": 1 message 1 new
>N  1 alice@mjolnir.lab  Wed Dec 14 21:02   14/494   Hello
& 1
Message 1:
From alice@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:02:52 2011
X-Original-To: bob
To: bob@mjolnir.labs.cs.pub.ro
Subject: Hello
Date: Wed, 14 Dec 2011 21:02:52 +0200 (EET)
From: alice@mjolnir.labs.cs.pub.ro

Mesaj de la alice catre bob

& 
  • [06]. Răspundeți (reply) la mesaj. Verificați că reply-ul a ajuns în contul lui alice. (Folosiți ? - semnul întrebării - pentru un ecran de ajutor)
Show solution
Hide solution
Show solution
& r 1
To: alice@mjolnir.labs.cs.pub.ro bob@mjolnir.labs.cs.pub.ro
Subject: Re: Hello

Reply de la bob catre alice

.
Cc: 
&

alice@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/alice": 1 message 1 new
>N  1 bob@mjolnir.labs.  Wed Dec 14 21:04   16/611   Re: Hello
& 1
Message 1:
From bob@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:04:31 2011
X-Original-To: alice@mjolnir.labs.cs.pub.ro
To: alice@mjolnir.labs.cs.pub.ro, bob@mjolnir.labs.cs.pub.ro
Subject: Re: Hello
In-Reply-To: <20111214190252.EB4346A@mjolnir.labs.cs.pub.ro>
Date: Wed, 14 Dec 2011 21:04:31 +0200 (EET)
From: bob@mjolnir.labs.cs.pub.ro

Reply de la bob catre alice

&
  • [07]. Configurați un alias denumit contact care să redirecteze toate mesajele trimise pe adresa sa către utilizatorul alice. (Hint: /etc/aliases, newaliases)
Show solution
Hide solution
Show solution
root@mjolnir:~# tail -n 1 /etc/aliases
contact:alice

root@mjolnir:~# newaliases
  • [08]. Trimiteți un e-mail de la bob la contact și verificați că mesajul a ajuns la alice. (Hint: mail)
Show solution
Hide solution
Show solution
bob@mjolnir:~$ echo "Mesaj de la bob catre contact" | mail -s "Test alias contact" contact

alice@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/alice": 1 message 1 new
>N  1 bob@mjolnir.labs.  Wed Dec 14 21:11   14/515   Test alias contact
& 1
Message 1:
From bob@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:11:30 2011
X-Original-To: contact
To: contact@mjolnir.labs.cs.pub.ro
Subject: Test alias contact
Date: Wed, 14 Dec 2011 21:11:30 +0200 (EET)
From: bob@mjolnir.labs.cs.pub.ro

Mesaj de la bob catre contact

&
  • [09]. Realizați un forward local (configurat din home-ul utilizatorului) astfel încât toate mesajele care sunt destinate utilzatorului student să ajungă la utilizatorul bob. (Hint: ~/.forward)
Show solution
Hide solution
Show solution
student@mjolnir:~$ cat .forward 
bob
  • [10]. Trimiteți un e-mail de la alice către student, având la CC pe charlie. Verificați conturile de mail ale utilizatorilor student, bob și charlie.
Show solution
Hide solution
Show solution
alice@mjolnir:~$ echo "Mesaj de la alice catre student si charlie" | mail -s "Test forward" -c charlie student

student@mjolnir:~$ mail
No mail for student

bob@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/bob": 1 message 1 unread
>U  1 alice@mjolnir.lab  Wed Dec 14 21:14   19/711   Test forward
& 1
Message 1:
From alice@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:14:46 2011
X-Original-To: student
To: student@mjolnir.labs.cs.pub.ro
Subject: Test forward
Cc: charlie@mjolnir.labs.cs.pub.ro
Date: Wed, 14 Dec 2011 21:14:46 +0200 (EET)
From: alice@mjolnir.labs.cs.pub.ro

Mesaj de la alice catre student si charlie

& 

charlie@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/charlie": 1 message 1 new
>N  1 alice@mjolnir.lab  Wed Dec 14 21:14   15/563   Test forward
& 1
Message 1:
From alice@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:14:46 2011
X-Original-To: charlie
To: student@mjolnir.labs.cs.pub.ro
Subject: Test forward
Cc: charlie@mjolnir.labs.cs.pub.ro
Date: Wed, 14 Dec 2011 21:14:46 +0200 (EET)
From: alice@mjolnir.labs.cs.pub.ro

Mesaj de la alice catre student si charlie

& 

2. Configurări Postfix (2p)

  • Comenzi/concepte/fișiere
    • postconf

Tutorial

  • N/A

Exerciții

Toate configurările de Postfix vor fi realizate folosind postconf (Hint: curs, slide 17)

  • [01]. Configurați Postfix astfel încât mesajele către gsr.ro să fie stocate local (Hint: mydestination). Mapați gsr.ro și mail.gsr.ro pe adresa ip 127.0.0.1.
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf | grep "mydestination ="
mydestination = mjolnir.labs.cs.pub.ro, localhost.labs.cs.pub.ro, , localhost

root@mjolnir:~# postconf -e 'mydestination = mjolnir.labs.cs.pub.ro, localhost.labs.cs.pub.ro, , localhost, gsr.ro'

root@mjolnir:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.

root@mjolnir:~# head -n 3 /etc/hosts
127.0.0.1	localhost
127.0.1.1	mjolnir.labs.cs.pub.ro	mjolnir
127.0.0.1	gsr.ro mail.gsr.ro
  • [02]. Testați funcționarea directivei trimițând un email de la student către alice@gsr.ro. Verificați în contul lui alice mesajul primit de la student.
Show solution
Hide solution
Show solution
student@mjolnir:~$ echo "Mesaj de la student catre alice@gsr.ro" | mail -s "Mesaj catre alice@gsr.ro" alice@gsr.ro

alice@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/alice": 1 message 1 new
>N  1 student@mjolnir.l  Wed Dec 14 21:26   14/524   Mesaj catre alice@gsr.ro
& 1
Message 1:
From student@mjolnir.labs.cs.pub.ro  Wed Dec 14 21:26:45 2011
X-Original-To: alice@gsr.ro
To: alice@gsr.ro
Subject: Mesaj catre alice@gsr.ro
Date: Wed, 14 Dec 2011 21:26:45 +0200 (EET)
From: student@mjolnir.labs.cs.pub.ro (Student CS)

Mesaj de la student catre alice@gsr.ro

& 
  • [03]. Configurați Postfix astfel încât directiva myhostname să fie mail.gsr.ro.
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf | grep "myhostname ="
myhostname = mjolnir.labs.cs.pub.ro

root@mjolnir:~# postconf -e 'myhostname = gsr.ro'

root@mjolnir:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
  • [04]. Configurați Postfix astfel încât directiva myorigin să aibă valoarea directivei myhostname. (Hint: $myhostname)
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf | grep "myorigin ="
append_at_myorigin = yes
myorigin = /etc/mailname

root@mjolnir:~# postconf -e 'myorigin = $myhostname'

root@mjolnir:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
  • [05]. Testați funcționarea configurărilor anterioare trimițând un email de la alice către bob@gsr.ro.
Show solution
Hide solution
Show solution
alice@mjolnir:~$ echo "Mesaj de la alice catre bob@gsr.ro" | mail -s "Catre bob@gsr.ro" bob@gsr.ro
  • [05].a. Verificați mesajul primit de bob. Ce apare trecut în dreptul sursei?
Show solution
Hide solution
Show solution
bob@mjolnir:~$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/bob": 1 message 1 new
>N  1 alice@gsr.ro       Wed Dec 14 21:40   14/407   Catre bob@gsr.ro
& 1
Message 1:
From alice@gsr.ro  Wed Dec 14 21:40:30 2011
X-Original-To: bob@gsr.ro
To: bob@gsr.ro
Subject: Catre bob@gsr.ro
Date: Wed, 14 Dec 2011 21:40:30 +0200 (EET)
From: alice@gsr.ro

Mesaj de la alice catre bob@gsr.ro

& 

3. Configurare Courier IMAP și Maildir (2.5p)

Nu este subiect de examen!

  • Comenzi/concepte/fișiere
    • maildirmake

Tutorial

  • N/A

Exerciții

  • [01]. Instalați un pachet care să conțină utilitarul maildirmake.
  • [01].a. Căutați toate pachetele care conțin fișierul din /bin maildirmake. (Hint: apt-file, grep)
  • [01].b. Din lista de pachete găsită instalați pachetul de bază pentru courier. Alegeți opțiunile default din asistentul de instalare.
Show solution
Hide solution
Show solution
root@mjolnir:~# apt-file search maildirmake | grep /usr/bin
courier-base: /usr/bin/maildirmake.courier
dovecot-core: /usr/bin/maildirmake.dovecot
maildrop: /usr/bin/maildirmake.maildrop

root@mjolnir:~# apt-get install courier-base
  • [02]. Configurați suportul de Maildir în Postfix. (Hint: curs, slide 22)
  • [02].a. home_mailbox = Maildir/
  • [02].b. mailbox_command =
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf | grep "home_mailbox ="
home_mailbox = 

root@mjolnir:~# postconf | grep "mailbox_command ="
mailbox_command = procmail -a "$EXTENSION"

root@mjolnir:~# postconf -e "home_mailbox = Maildir/"

root@mjolnir:~# postconf -# mailbox_command

root@mjolnir:~# postconf | grep "mailbox_command ="
mailbox_command = 
Show solution
Hide solution
Show solution
root@mjolnir:~# apt-get install courier-imap

root@mjolnir:~# apt-get install libgamin0

root@mjolnir:~# /etc/init.d/courier-imap restart
Stopping Courier IMAP server: imapd.
Starting Courier IMAP server: imapd.
  • [04]. Inspectând conexiunile active, aflați portul pe care ascultă daemonul de IMAP. (Hint: netstat)
Show solution
Hide solution
Show solution
root@mjolnir:~# netstat -lntp | grep courier
tcp6       0      0 :::143                  :::*                    LISTEN      14373/couriertcpd

root@mjolnir:~# getent services imap
imap2                 143/tcp imap
  • [05]. Creați un director de tip Maildir în home-ul utilizatorului alice (calea către director va trebui să fie /home/alice/Maildir/) (Hint: maildirmake)
  • [05].a. Atenție: După creare, directorul Maildir/ trebuie să fie deținut de utilizatorul alice.
Show solution
Hide solution
Show solution
alice@mjolnir:~$ maildirmake /home/alice/Maildir

alice@mjolnir:~$ ls -l
total 8
drwx------ 5 alice alice 4096 Dec 14 22:07 Maildir
-rw------- 1 alice alice 1683 Dec 14 21:28 mbox
alice@mjolnir:~$ ls -lR Maildir/
Maildir/:
total 12
drwx------ 2 alice alice 4096 Dec 14 22:07 cur
drwx------ 2 alice alice 4096 Dec 14 22:07 new
drwx------ 2 alice alice 4096 Dec 14 22:07 tmp

Maildir/cur:
total 0

Maildir/new:
total 0

Maildir/tmp:
total 0
  • [06]. Instalați clientul de e-mail Mozilla Thunderbird.
  • [06].a. Hint: în Debian, Thunderbird a fost redenumit. Va trebui să găsiți numele pachetului care îl conține.
Show solution
Hide solution
Show solution
root@mjolnir:~# apt-get install icedove
  • [07]. Configurați Thunderbird pentru a se conecta la serverul de IMAP local (localhost), în contul utilizatorului alice. Mesajele vor fi trimise, de asemenea, folosind MTA-ul local (localhost).
    • [07].a. Pentru pornirea clientului folosiți meniul Applications → Internet.
    • [07].b. În Mail Account Setup folosiți butonul Manual Setup pentru a configura contul lui alice în mod avansat
      • [07].b.1. Adresa de email folosită va fi alice@gsr.ro iar parola va fi cea a utilizatorului alice.
      • [07].b.2. Server name va fi gsr.ro
      • [07].b.3 Connection security: none
      • [07].b.4 Authentication method: Password, transmitted insecurely
Show solution
Hide solution
Show solution
  *Applications -> Internet -> Icedove Mail/News
  *Mail Account Setup
    *Your name: Alice
    *Email address: alice@gsr.ro
    *Password: alice
  *Continue
  *Manual Setup
  *Server name -> gsr.ro
  *Connection security -> none
  *Authentication method -> Password, transmitted insecurely
  • [08]. Trimiteți un e-mail de la bob către alice@gsr.ro și verificați că mesajul a ajuns în Thunderbird, în contul lui alice.
Show solution
Hide solution
Show solution
bob@mjolnir:~$ echo "Mesaj de la bob catre alice@gsr.ro" | mail -s "Test Thunderbird" alice@gsr.ro

Thunderbird -> Get Mail.

5. Maildrop (1.5p)

  • Comenzi/concepte/fișiere
    • N/A

Tutorial

Exerciții

  • [01]. Instalați pachetul maildrop.
Show solution
Hide solution
Show solution
root@mjolnir:~# apt-get install maildrop
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf -e 'mailbox_command = /usr/bin/maildrop -d $USER'

root@mjolnir:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
  • [03]. Adăugați contul bob în Thunderbird asociat utilizatorului bob de pe stația locală. Setările sunt aceleași cu ale contului lui alice (imap STARTTLS, postfix SSL/TLS)
Show solution
Hide solution
Show solution
File -> New -> Mail Account
  • [04]. Configurați fișierul ~/.mailfilter din home-ul utilizatorului bob pentru ca:
  • [04].a. mesajele care au mai mult de 3 linii să fie livrate în directorul Maildir/.big.
  • [04].b. mesajele care vin de la alice@gsr.ro (From: Alice alice@gsr.ro) să fie livrate în directorul Maildir/.alice.
  • [04].c. mesajele care conțin în subiect șirul test să fie livrate în directorul Maildir/.test.
  • [04].d. Hint: Curs, slide 28
  • [04].e. Hint: Creați directoarele big, alice și test ca subdirectoare ale Inbox în interfața Thunderbird. Consecința este crearea (folosind IMAP) a directoarelor .big, .alice și .test în Maildir/.
  • [04].f. Hint: Urmăriți log-urile (/var/log/mail.log) pentru descoperirea problemelor.
Show solution
Hide solution
Show solution
bob@mjolnir:~$ cat .mailfilter
MAILDIR=$HOME/Maildir


if ( /^From: Alice <alice@gsr.ro>/ ) 
{
        to $MAILDIR/.alice
} 
if ( $LINES > 3 )
{
        to $MAILDIR/.big
}

if ( /^Subject: .*test.* /)
{
        to $MAILDIR/.test
}

to $MAILDIR/

Bonus

  • [01]. Alias-uri avansate: Configurați domeniile virtuale gsr-cs.ro și gsr-upb.ro și alias-urile (curs, slide 21):
  • [01].a. contact@gsr-cs.ro → alice
  • [01].b. info@gsr-cs.ro → bob
  • [01].c sales@gsr-upb.ro → alice
  • [01].d. office@gsr-upb.ro → bob
Show solution
Hide solution
Show solution
root@mjolnir:~# postconf -e 'virtual_alias_domains = gsr-cs.ro gsr-upb.ro'

root@mjolnir:~# postconf -e 'virtual_alias_maps = hash:/etc/postfix/virtual'

root@mjolnir:~# cat /etc/postfix/virtual 
contact@gsr-cs.ro	alice
info@gsr-cs.ro		bob
sales@gsr-upb.ro	alice
office@gsr-upb.ro	bob

root@mjolnir:~# postmap /etc/postfix/virtual 
  • [02]. Configurați căsuțe postale virtuale cu utilizatori non-unix pentru domeniul gsr-rules.ro.
  • [02].a. Directorul de bază pentru căsuțele poștare virtuale este /usr/local/mail/gsr-rules.ro/.
  • [02].b. Utilizatorul dorin va avea căsuța poștală, format Maildir, în directorul /usr/local/mail/gsr-rules.ro/dorin/.
Show solution
Hide solution
Show solution
root@mjolnir:~# groupadd virtual

root@mjolnir:~# useradd -d /home/virtual -m -g virtual -s /bin/bash virtual

root@mjolnir:~# echo "virtual:virtual" | chpasswd

root@mjolnir:~# mkdir -p /usr/local/mail/gsr-rules.ro

root@mjolnir:~# chown -R virtual:virtual /usr/local/mail/

root@mjolnir:~# getent passwd virtual
virtual:x:1005:1005::/home/virtual:/bin/bash

root@mjolnir:~# postconf -e 'virtual_mailbox_domains = gsr-rules.ro'

root@mjolnir:~# postconf -e 'virtual_mailbox_maps = hash:/etc/postfix/vmailbox'

root@mjolnir:~# postconf -e 'virtual_mailbox_base = /usr/local/mail/gsr-rules.ro'

root@mjolnir:~# postconf -e 'virtual_uid_maps = static:1005'

root@mjolnir:~# postconf -e 'virtual_gid_maps = static:1005'

root@mjolnir:~# cat /etc/postfix/vmailbox 
dorin@gsr-rules.ro	gsr-rules/dorin/

root@mjolnir:~# postmap /etc/postfix/vmailbox
  • [03]. Configurați suport de căsuțe poștale virtuale în Courier pentru căsuțele poștale create mai sus. (Hint: curs, slide 25)
Show solution
Hide solution
Show solution
root@mjolnir:~# cat /etc/courier/authdaemonrc | grep "authmodulelist="
authmodulelist="authuserdb"

root@mjolnir:~# userdb info set uid=1005 gid=1005 home=/usr/local/mail/gsr-rules.ro/dorin/ mail=/usr/local/mail/gsr-rules.ro/dorin/

root@mjolnir:~# cat /etc/courier/userdb
info	uid=1005|gid=1005|home=/usr/local/mail/gsr-rules.ro/dorin/|mail=/usr/local/mail/gsr-rules.ro/dorin/

root@mjolnir:~# userdbpw -md5 | userdb info set systempw
Password: 
Reenter password:

root@mjolnir:~# makeuserdb

root@mjolnir:~# cat /etc/courier/userdb
info	systempw=$1$6/NXTTBE$wioqqFuVEFXymHoMyVvfu.|uid=1005|mail=/usr/local/mail/gsr-rules.ro/dorin/|home=/usr/local/mail/gsr-rules.ro/dorin/|gid=1005
gsr/laboratoare/laborator-05.1478769207.txt.gz · Last modified: 2016/11/10 11:13 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0