webmcp
annotate framework/env/encode/mime/mail.lua @ 110:0c4841af07a5
String truncating by counting Unicode codepoints in format.string(...)
(grapheme cluster boundary detection not implemented)
(grapheme cluster boundary detection not implemented)
| author | jbe | 
|---|---|
| date | Sun Jan 12 03:57:47 2014 +0100 (2014-01-12) | 
| parents | 9fdfb27f8e67 | 
| children | b7596f5158d4 | 
| rev | line source | 
|---|---|
| jbe/bsw@0 | 1 local un = encode.mime.unstructured_header_line | 
| jbe/bsw@0 | 2 local mbl = encode.mime.mailbox_list_header_line | 
| jbe/bsw@0 | 3 | 
| jbe/bsw@0 | 4 local function encode_container(parts, container) | 
| jbe/bsw@0 | 5 if container.multipart then | 
| jbe/bsw@0 | 6 local boundary | 
| jbe/bsw@0 | 7 boundary = "BOUNDARY--" .. multirand.string( | 
| jbe/bsw@0 | 8 24, | 
| jbe/bsw@0 | 9 "123456789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz" | 
| jbe/bsw@0 | 10 ) | 
| jbe/bsw@0 | 11 parts[#parts+1] = "Content-Type: " | 
| jbe/bsw@0 | 12 parts[#parts+1] = "multipart/" | 
| jbe/bsw@0 | 13 parts[#parts+1] = container.multipart | 
| jbe/bsw@0 | 14 parts[#parts+1] = "; boundary=" | 
| jbe/bsw@0 | 15 parts[#parts+1] = boundary | 
| jbe/bsw@0 | 16 parts[#parts+1] = "\r\n\r\nMIME multipart\r\n" -- last \r\n optional | 
| jbe/bsw@0 | 17 for idx, sub_container in ipairs(container) do | 
| jbe/bsw@0 | 18 parts[#parts+1] = "\r\n--" | 
| jbe/bsw@0 | 19 parts[#parts+1] = boundary | 
| jbe/bsw@0 | 20 parts[#parts+1] = "\r\n" | 
| jbe/bsw@0 | 21 encode_container(parts, sub_container) | 
| jbe/bsw@0 | 22 end | 
| jbe/bsw@0 | 23 parts[#parts+1] = "\r\n--" | 
| jbe/bsw@0 | 24 parts[#parts+1] = boundary | 
| jbe/bsw@0 | 25 parts[#parts+1] = "--\r\n" | 
| jbe/bsw@0 | 26 else | 
| jbe/bsw@0 | 27 parts[#parts+1] = "Content-Type: " | 
| jbe/bsw@0 | 28 parts[#parts+1] = container.content_type or "text/plain" | 
| jbe/bsw@0 | 29 parts[#parts+1] = "\r\n" | 
| jbe/bsw@0 | 30 if container.content_id then | 
| jbe/bsw@0 | 31 parts[#parts+1] = "Content-ID: <" | 
| jbe/bsw@0 | 32 parts[#parts+1] = container.content_id | 
| jbe/bsw@0 | 33 parts[#parts+1] = ">\r\n" | 
| jbe/bsw@0 | 34 end | 
| jbe/bsw@0 | 35 if container.attachment_filename then | 
| jbe/bsw@0 | 36 parts[#parts+1] = "Content-Disposition: attachment; filename=" | 
| jbe/bsw@0 | 37 parts[#parts+1] = encode.mime.atom_token( | 
| jbe/bsw@0 | 38 container.attachment_filename | 
| jbe/bsw@0 | 39 ) | 
| jbe/bsw@0 | 40 parts[#parts+1] = "\r\n" | 
| jbe/bsw@0 | 41 end | 
| jbe/bsw@0 | 42 if container.binary then | 
| jbe/bsw@0 | 43 parts[#parts+1] = "Content-Transfer-Encoding: base64\r\n\r\n" | 
| jbe/bsw@0 | 44 parts[#parts+1] = encode.mime.base64(container.content) | 
| jbe/bsw@0 | 45 else | 
| jbe/bsw@0 | 46 parts[#parts+1] = | 
| jbe/bsw@0 | 47 "Content-Transfer-Encoding: quoted-printable\r\n\r\n" | 
| jbe/bsw@0 | 48 parts[#parts+1] = | 
| jbe/bsw@0 | 49 encode.mime.quoted_printable_text_content(container.content) | 
| jbe/bsw@0 | 50 end | 
| jbe/bsw@0 | 51 end | 
| jbe/bsw@0 | 52 end | 
| jbe/bsw@0 | 53 | 
| jbe/bsw@0 | 54 function encode.mime.mail(args) | 
| jbe/bsw@0 | 55 local parts = {} | 
| jbe/bsw@0 | 56 parts[#parts+1] = mbl("From", args.from) | 
| jbe/bsw@0 | 57 parts[#parts+1] = mbl("Sender", args.sender) | 
| jbe/bsw@0 | 58 parts[#parts+1] = mbl("Reply-To", args.reply_to) | 
| jbe/bsw@0 | 59 parts[#parts+1] = mbl("To", args.to) | 
| jbe/bsw@0 | 60 parts[#parts+1] = mbl("Cc", args.cc) | 
| jbe/bsw@0 | 61 parts[#parts+1] = mbl("Bcc", args.bcc) | 
| jbe/bsw@0 | 62 parts[#parts+1] = un("Subject", args.subject) | 
| jbe/bsw@0 | 63 parts[#parts+1] = "MIME-Version: 1.0\r\n" | 
| jbe/bsw@0 | 64 encode_container(parts, args) | 
| jbe/bsw@0 | 65 return table.concat(parts) | 
| jbe/bsw@0 | 66 end |