Re: deliver.db to big size.
Manuel, If I'm not mistaken, deliver.db is used exclusively for duplicate message suppression. I can't imagine why it has grown so big (unless you are not running ctl_deliver -E regularly -- normally this is configured to run every 24 hours or so in /etc/cyrus.conf). Some people keep deliver.db on a ramdisk/tmpfs, so my take is you can safely delete that file and start afresh without any real consequences. But check to see that ctl_deliver is running to prune the duplicates database too... - Anthony On 11/09/2011 5:34 AM, Manuel Vazquez wrote: Hi, i'm newbie in the cyrus world. I am admin junior of 1 system of corporate mail. In 1 instance of de cyrus imapd i detect the deliver.db file have to big size (more de 5GB). I two question over this file. 1. This file have the traffic info of mailbox user? 2. I'm problem with the space on the filesystem on cyrus imapd run. Could i move the file deliver.db to other filesystem and soft link to this for not lost the information? Thx, and sorry for my poor english. -- Manuel Vázquez. Técnico Informático. manuel.vazquez.gonza...@hotmail.com mailto:manuel.vazquez.gonza...@hotmail.com titocer...@gmail.com mailto:titocer...@gmail.com Cyrus Home Page:http://www.cyrusimap.org/ List Archives/Info:http://lists.andrew.cmu.edu/pipermail/info-cyrus/ Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/
Testing: Exim, Cyrus and invalid header lines
Hi folks, This is, at present, only a test message. I am setting up a new box with Cyrus and Exim, but my experience has always been with Postfix. For some reason, messages from the Info-Cyrus list -- and so far, ONLY messages from the Info-Cyrus list -- are being rejected by Cyrus LMTP as having an invalid header. Now testing to see what the cause is. I've managed to get Exim to strip blank Message-ID: headers, which I know Cyrus doesn't like much, but I'm not sure that is it. Why does Cyrus have to be so fussy? (Watch, this message will come back to me just fine.) - Anthony Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/
Re: SSL certificates
Kevin, I wondered about the passphrase myself. The instructions GoDaddy provides are, of course, tailored for Apache, and maybe they think entering a passphrase is a reasonable thing to have to do, though I can't imagine what server admin would actually want that. I'll dump the passphrase and try again. I would bet that is the culprit... - Anthony On 01/03/2011 8:22 AM, Kevin Kobb wrote: On 2/28/2011 9:44 AM, Anthony Tibbs wrote: Good morning, I've been running Cyrus at a couple of small sites since 2001 or so. I've run into a snag trying to setup SSL using something other than the self-signed, auto-generated certificate. The domain has a GoDaddy 2048-bit SSL certificate. From the SSL manager, one downloads a bundle that contains a certificate chain bundle, and a separate file with the certificate for the domain itself. The key and CSR was generated with: openssl genrsa -des3 -out xxx.key 2048 openssl req -new -key xxx.key -out xxx.csr I've seen a few different methodologies posted about how to install this. One is to conctenate the domain certificate, the certificate chain, and the private key into one .pem file and set tls_cert_file, tls_ca_file, and tls_key_file to point to the same '.pem' file. Another is to keep the files completely separate. No matter what I have tried, I've been unsuccessful. Thunderbird reports that it received an SSL record that is too long, and/or the imapd process becomes stuck at 100% CPU utilization until it is killed forcibly. Is there something I'm missing on this? - Anthony Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/ Couple of things you might look at. First, I think you need to drop the -des3 option when you create the private key. Do something like: openssl genrsa -out xxx.key 2048 instead. Otherwise, you wind up with an encrypted private key that needs a pass phrase every time you start the server. I didn't think Cyrus would even start with a key like this. Apache is about the only thing I've used that would prompt you for a pass phrase on start up. To remove the key pass phrase you can do something like: openssl rsa -in xxx.key -out xxx.key.nopass I haven't used GoDaddy certs for a while because you had the extra hassle of dealing with intermediate certificates, and I can get single-root certs cheaper. That being said, I believe all you should need to do is cat the signed cert and the intermediate cert together, and use this for the tls_cert_file: value in imapd.conf. Point the tls_key_file: value to your private key, and that should do it. This is all off the top of my head and a sick child meant I only got about 3 hours of sleep last night, so please make copies of everything before trying any of this! Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/ Cyrus Home Page: http://www.cyrusimap.org/ List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/
Re: Exec'ing a script from Cyrus when imapd has a client
You know, I don't know if I agree with all the objections over this person's request. I actually have a similar setup where Fetchmail is used to retrieve messages from a remote mailbox for injection into a Cyrus setup, primarily because of quota requirements on the far end. Yes, modern MUA's offer the ability to store messages locally, but what if you have that MUA installed in several computers in different locations? Moving to 'local folders' in that case isn't helpful. And yes, you could setup two accounts - one on the main server and one to your cyrus setup - and move messages manually, but then why not fetchmail to the cyrus setup directly too? - Original Message - From: Greg A. Woods woods-cy...@weird.com To: Cyrus User's Mailing List info-cyrus@lists.andrew.cmu.edu Sent: Friday, October 23, 2009 2:57 PM Subject: Re: Exec'ing a script from Cyrus when imapd has a client At Thu, 22 Oct 2009 18:43:41 -0700 (PDT), David Lang david.l...@digitalinsight.com wrote: Subject: Re: Exec'ing a script from Cyrus when imapd has a client there can be cases where you are providing mail services for several people, or have multiple machines you use yourself where having an IMAP server is worthwhile. Neither of those things make any real sense whatsoever. They certainly don't define any clear requirements that make sense in this context. Every modern and useful IMAP-capable MUA can collect e-mail from any combination of many IMAP servers anywhere and everywhere all at once. If fetchmail can fetch the mail from an IMAP server, then so can any MUA. Just get rid of all the unnecessary complexity in the middle and just use the MUA for what it's designed to be used for! now, it's unusual to use something like this without having a full MTA, but it's not unheard of. It's not unusual for people to create all kinds of crazy complicated setups that have no real purpose, in every domain in life. I'm sure I make my own life more complicated than it needs to be in some ways. However things do not _need_ to be made more complicated than necessary, Here the OP's question provides a perfect clue showing that something is far more complicated than it needs to be because we see that it will even have to get more complex (and even less robust) before it begins to work the way it would actually work without any of this unnecessary complexity in the middle in the first place. -- Greg A. Woods +1 416 218-0098VE3TCP RoboHack wo...@robohack.ca Planix, Inc. wo...@planix.com Secrets of the Weird wo...@weird.com Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
ctl_cyrusdb I/O requirements
Hi everyone, I'm running Cyrus 2.3.14 on a VPS (Gentoo), and have been for a number of years now. All was well until last night when performance went down the tubes and I started seeing high I/O wait times. I'm pretty sure this is a problem on the hosting end, but in trying to diagnose the source of the I/O congestion, the closest I could come to answer was that ctl_cyrusdb is reading/writing about 15-20 4096b blocks (from the /var/imap/db/* files) per second.This amounts to read/write throughput in the 250kb/second range. Is this normal behaviour? I never noticed before, but it's the only thing I see that is constantly generating I/O... Take care, Anthony Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Cyrus APIs ? - detecting new messages in a folder
This might seem like a really dumb question, but why can't you just monitor the log file for Delivered: lines and parse those (as they appear) to do the 'push'ing? I have a script that monitors this and gives me the datestamp, user/folder, and Message-ID domain on a running basis. Or am I missing something really obvious here? Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Logging number of pop3's email retrieved during a connection - was (IMAP/POP traffic accounting)
Hi Eddy, I had worked on this briefly and, given a day or so, I could probably come up with a working solution at least for byte/traffic accounting. Logging 'messages retrieved' for POP3 could make some sense, but it gets complicated with clients using TOP to partially retrieve messages for inspection, and in the IMAP world its all but meaningless (since that might involve copies to folders, etc.). For pure traffic accounting purposes, though, that isn't so hard, particularly if you don't want it saved in a database anywhere, but merely added as a log entry. I might not have a chance to look at this until December though. Cyrus/software development is something of a side job for me, as I'm actually a third year student in McGill's Faculty of Law. But I will work on getting this done (since I need it nowadays anyway) for traffic accounting on IMAP/POP3 at the very least... Take care, Anthony - Original Message - From: Eddy Beliveau [EMAIL PROTECTED] To: Mirosław Jaworski [EMAIL PROTECTED] Cc: info-cyrus@lists.andrew.cmu.edu; [EMAIL PROTECTED] Sent: Friday, November 21, 2008 2:12 PM Subject: Logging number of pop3's email retrieved during a connection - was (IMAP/POP traffic accounting) Hi! Netfriends, I sent this email last week but didn't received any replies. So, I would like to spin it again... Maybe my title was obscure. ;-) I would like to log some statistics when any user retrieves their pop3's emails. Currently: ... pop3[32760]: login: address [ip] user plaintext User logged in It would be nice to also get the number of messages retrieved (and total size if available) Can someone help ? Thanks, Eddy Message original Sujet : Re: IMAP/POP traffic accounting De : Eddy Beliveau [EMAIL PROTECTED] Pour : Mirosław Jaworski [EMAIL PROTECTED] Copie à : info-cyrus@lists.andrew.cmu.edu Date : 2008-11-13 11:51 Hi! By browsing archives, I find this current thread. We are using cyrus-imapd 2.2.13 and it works well :-) I would also like to add statistics to pop3d.c Can you please provide the patch that was used to get this: Nov 30 16:27:31 mail1 pop3[19762]: stats: t63877a 8 663454 0 0 It would be valuable to our helpdesk staff. Many thanks, Have a nice day Eddy Message original Sujet : Re: IMAP/POP traffic accounting De : Mirosław Jaworski [EMAIL PROTECTED] Pour : Anthony Tibbs [EMAIL PROTECTED] Copie à : info-cyrus@lists.andrew.cmu.edu Date : 2006-11-30 10:35 On Wed, 2006-11-29 at 13:23 -0500, Anthony Tibbs wrote: I believe there was some mention of this in the past, but I'm wondering whether there are any known efforts to implement network traffic accounting in the later versions of Cyrus, or if this is still something that hasn't been dealt with. I am pondering possibly tackling this, but I'm not really familiar with the Cyrus code and would rather not reinvent the wheel if it's already in the works. Well, 'effort' is definitely too big word for the hack we use. Our support was used to some old popper log format, so we have made hack resulting in such lines: User who (downloaded and) deleted 8 messages, 663454 bytes total. Nov 30 16:27:16 mail1 pop3[19762]: login: [83.15.90.206] t63877a plaintext User logged in [...] Nov 30 16:27:31 mail1 pop3[19762]: stats: t63877a 8 663454 0 0 User who didn't (downloaded and) deleted any messages; has 35 messages in his INBOX, 10785042 bytes total: Nov 30 16:18:59 mail1 pop3[19360]: login: [83.31.77.74] po30533 plaintext User logged in [...] Nov 30 16:19:00 mail1 pop3[19360]: stats: po30533 0 0 35 10785042 While it makes sense to have such logs from pop3 daemon doing simple operations on only one folder it has none when it comes to IMAP. What log can i possibly create after user connects to imap, applies his rules to an INBOX ( moving most of the messages to various folders, ie. marking them for deletion, not deleting them )? What when he reads some messages without deleting them? M. -- Eddy Beliveau HEC Montreal Montreal (Quebec) Canada Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Emergancy..... db4: PANIC: fatal region error
Well, for one, you would need something along the lines of the following in your imapd.conf file to change over to Skiplist: # File formats annotation_db:skiplist duplicate_db: skiplist mboxkey_db: skiplist mboxlist_db: skiplist quota_db: skiplist seenstate_db: skiplist tlscache_db: skiplist Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Method to drop unknown user messages to black hole
Hi Bob, Perhaps I am missing something here, but with my Postfix setup (which is based on two instances of Postfix + amavisd-new + Cyrus), messages are checked against a user database at the outer postfix, and rejected during the SMTP connection for invalid recipients, before lmtp/etc. even sees it. For me, this requires that user logins/authentication be handled through a MySQL database, but is this an option for you? It avoids almost all of the backscatter issues... though may not be the best setup for everyone. Take care, Anthony - Original Message - From: Bob Bob To: Cyrus Maillist Sent: Friday, July 13, 2007 10:52 PM Subject: Method to drop unknown user messages to black hole Postfix Cyrus Have been finishing off the server ready for accepting external smtp connections. No more fetchmail... I note that in todays spam environment more and more administrators are choosing to black hole any messages with invalid recipients. In a standard postfix setup this is pretty easy with luser_relay. When however you use lmtp, local delivery really only looks at /etc/aliases until it passes through to cyrus. My first question is a general one. Do you all choose to send reject/nonexistent user messages or just black hole them? Rejecting is obviously the simplest solution but I am concerned about being blacklisted from sending garbage back out. There are ways of course to stop backscatter happening but I am also concerned that there are valid bounces being created that the (real) sender needs to know about. I'd like to hear what your solutions have been. My second question is how to you accomplish a black hole with cyrus? I had thought that a global sieve script would do it but note that this is user specific. I see nothing specific in lmtp that points to that either. I note this has been discussed previously but I didn't find an actual resolution beyond allowing auto mailbox creation! Thoughts appreciated Bob Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Outlook Express and IMAP connections - thousands of them?
Hi everyone, I've been using Outlook Express with Cyrus now for several years (since 2002), have set it up on many different computers, and have never run into this before. I have one user who is also using OE, and their OE is doing something very strange - it's disconnecting and reconnecting for every folder it checks, leading to (litreally) thousands of lines a day indicating a new login: Dec 14 12:02:25 polaris imap[26772]: login: clientHost [69.xxx.xxx.xxx] user@tibbs.ca plaintext User logged in Dec 14 12:02:25 polaris imap[26170]: login: clientHost [69.xxx.xxx.xxx] user@tibbs.ca plaintext User logged in Dec 14 12:02:26 polaris imap[26170]: login: clientHost [69.xxx.xxx.xxx] user@tibbs.ca plaintext User logged in Dec 14 12:02:26 polaris imap[26772]: login: clientHost [69.xxx.xxx.xxx] user@tibbs.ca plaintext User logged in Dec 14 12:02:27 polaris imap[26772]: login: clientHost [69.xxx.xxx.xxx] user@tibbs.ca plaintext User logged in ... and so on. Looking at the telemetry logs, there doesn't seem to be anything unusual, or any errors or anything (see below). Is there a setting somewhre that I don't know aobut that would affect this? -- user@tibbs.ca Thu Dec 14 12:07:03 2006 1166116023he0o OK User logged in 1166116023dmip IDLE 1166116023+ idling 1166116023DONE 1166116023dmip OK Completed 1166116023ld73 SELECT INBOX.Guidedog-Friends 1166116023* FLAGS (\Answered \Flagged \Draft \Deleted \Seen) * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] * 0 EXISTS * 0 RECENT * OK [UIDVALIDITY 1164770668] * OK [UIDNEXT 1] ld73 OK [READ-WRITE] Completed 1166116023mqu8 IDLE 1166116023+ idling 1166116023DONE 1166116023mqu8 OK Completed 1166116024kd8l NOOP 1166116024kd8l OK Completed 1166116024dyyb IDLE 1166116024+ idling -- user@tibbs.ca Thu Dec 14 12:07:04 2006 1166116024136z OK User logged in 1166116024nh4o IDLE 1166116024+ idling 1166116024DONE 1166116024nh4o OK Completed 1166116024lwev SELECT INBOX.LJ 1166116024* FLAGS (\Answered \Flagged \Draft \Deleted \Seen) * OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] * 10 EXISTS * 0 RECENT * OK [UIDVALIDITY 1164770606] * OK [UIDNEXT 16] lwev OK [READ-WRITE] Completed 1166116024xj4l IDLE 1166116024+ idling -- user@tibbs.ca Thu Dec 14 12:07:05 2006 1166116025gvti OK User logged in 11661160258fw3 IDLE 1166116025+ idling .. and so on. Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
IMAP/POP traffic accounting
I believe there was some mention of this in the past, but I'm wondering whether there are any known efforts to implement network traffic accounting in the later versions of Cyrus, or if this is still something that hasn't been dealt with. I am pondering possibly tackling this, but I'm not really familiar with the Cyrus code and would rather not reinvent the wheel if it's already in the works. On the surface, this appears to be fairly straight forward, what with the protocol abstraction already in place (where recording could be done at or around the same place as telemetry logging) ... or is there something I'm missing about this idea that makes it significantly more complicated than it first appears? Cyrus Home Page: http://cyrusimap.web.cmu.edu/ Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Sendmail aliases and Cyrus
Hi everyone, I was trying to check the list archives for some hints, but it seems that that server is having some 'difficulties' at the moment, and isn't responding. I am currently in the process of setting up another Cyrus/IMAP server, as I've been (personally) running Cyrus/Sendmail for a few years now with good results. I had the usual sendmail+virtdomains+cyrus hoops to jump through, but now have THAT working all right (by way of a mailertable entries, i.e. mydomain.cacyrusv2d:/var/lib/imap/socket/lmtp The problem is that for this to WORK, mydomain.ca must not be considered a local domain (i.e. it must not be in local-host-names), since this results in a rewrite that strips the 'host' portion of the address off, and then Cyrus rejects the message with an 'unknown mailbox' error. And all of this ultimately means that I can't use sendmail aliases (for non-local addresses), which I need in order to redirect such things as postmaster, root, etc. to a particular user. Have I missed something simple here? I've tried following the instructions at http://asg.web.cmu.edu/cyrus/download/imapd/install-virtdomains.html but that is where I am getting stuck... Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Question about cyrus quotas - how it behaves
Check out quotawarn: and quotawarnkb: in man imapd.conf. They result in IMAP ALERT messages being generated. Note that these alerts are sent on SELECT, and it has been claimed that Outlook SELECTs a lot, making it unusable. I have not verified this. Indeed, this can be a problem if you have a large number of folders. For example, I have about 30 folders under my Inbox for archived messages, various mailing lists, etc., and if I ever get near the quota, hitting Control+M to poll for messages is a really bad idea, because I'll get an alert dialog at least once for each and every folder -- and there's nothing you can do but keep hitting ENTER until it is done. It can be annoying, but I'd wager that most people don't sit above that 90% threshold for long, before they clue in and dump some old mail. --- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: Virtual host help - users on virtual domains can't authenticate
What command did you use to add the user to the saslpasswd2 database? It should be something like this I believe... saslpasswd2 -u domain2.com -c user (At least for me, adding them as saslpasswd -c [EMAIL PROTECTED] didn't work.) - Original Message - From: Sun Advocate Webmaster [EMAIL PROTECTED] I have cyrus authenticating via sasldb, and all works well for local domains. However, virtual domains don't work. My DNS for all the virtual domains point to my server. In cyradm, I created a mailbox for [EMAIL PROTECTED], where domain.com is the primary domain. I then added a password using saslpasswd2. Using imtest, I can authenticate [EMAIL PROTECTED] correctly. However, [EMAIL PROTECTED] fails: no user found. --- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Re: emails of multiple domain on one IMAP server
Hello George, to fetch mail from a server you can use fetchmail and hand that mail to cyrus. I am not sure if you can hand it directly to cyrus or pass it first to an MTA like postfix which delivers email to cyrus. Ulf Assuming you have no intermediary processing via Postfix that you actually want to happen (for virus scans or what have you), Fetchmail can deliver directly to cyrus via lmtp. That's how I have it setup here... --- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
Cyrus 2.2.6 (Fedora Core 3) + Sendmail 8.13.1 + Virtual Domains
Hi everyone, I'm a newbie to the mailing list, though I've been running Cyrus as something of my own personal IMAP server for the past 3 years, without a problem. I'm just setting it up again on a new system, though, and decided to do it the 'right' way this time, and prepare for virtual domains right from the get-go. (On my old setup, I ended up using table mappings, etc. to make this work without actually using Cyrus' virtdomains... it worked, but was a bit of a pain.) Right now, everything is working, but I had to do some kludging to *get* it to deliver mail locally. In particular, I've found the information about the cyrusv2d mailer for Sendmail, which is (supposed) to not strip the domain part of recipient addresses. Alas, even delivering via cyrusv2d, Sendmail is still stripping the domain portion of local addresses (as evidenced by sendmail -bt tests). The solution, for now? Take the relevant domain out of /etc/mail/local-host-names, plunk it into /etc/mail/access as a To:mydomain.com RELAY entry. I don't think this is how it is supposed to work, though, and I've got this nagging feeling that one of these days, this is going to prove to be a really problematic way of fixing it. :) Is there a better way that I've missed, given that 'cyrusv2d' doesn't seem to be doing the trick? Take care, Anthony Tibbs --- Cyrus Home Page: http://asg.web.cmu.edu/cyrus Cyrus Wiki/FAQ: http://cyruswiki.andrew.cmu.edu List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html