defmodule Mailman.Attachment do @moduledoc "A struct defining an attachable file. It automatically detect the mime type based on file extension." defstruct file_name: "", mime_type: "", mime_sub_type: "", data: "" @mime_types [ { ".3dm", "x-world/x-3dmf" }, { ".3dmf", "x-world/x-3dmf" }, { ".a", "application/octet-stream" }, { ".aab", "application/x-authorware-bin" }, { ".aam", "application/x-authorware-map" }, { ".aas", "application/x-authorware-seg" }, { ".abc", "text/vnd.abc" }, { ".acgi", "text/html" }, { ".afl", "video/animaflex" }, { ".ai", "application/postscript" }, { ".aif", "audio/aiff" }, { ".aif", "audio/x-aiff" }, { ".aifc", "audio/aiff" }, { ".aifc", "audio/x-aiff" }, { ".aiff", "audio/aiff" }, { ".aiff", "audio/x-aiff" }, { ".aim", "application/x-aim" }, { ".aip", "text/x-audiosoft-intra" }, { ".ani", "application/x-navi-animation" }, { ".aos", "application/x-nokia-9000-communicator-add-on-software" }, { ".aps", "application/mime" }, { ".arc", "application/octet-stream" }, { ".arj", "application/arj" }, { ".arj", "application/octet-stream" }, { ".art", "image/x-jg" }, { ".asf", "video/x-ms-asf" }, { ".asm", "text/x-asm" }, { ".asp", "text/asp" }, { ".asx", "application/x-mplayer2" }, { ".asx", "video/x-ms-asf" }, { ".asx", "video/x-ms-asf-plugin" }, { ".au", "audio/basic" }, { ".au", "audio/x-au" }, { ".avi", "application/x-troff-msvideo" }, { ".avi", "video/avi" }, { ".avi", "video/msvideo" }, { ".avi", "video/x-msvideo" }, { ".avs", "video/avs-video" }, { ".bcpio", "application/x-bcpio" }, { ".bin", "application/mac-binary" }, { ".bin", "application/macbinary" }, { ".bin", "application/octet-stream" }, { ".bin", "application/x-binary" }, { ".bin", "application/x-macbinary" }, { ".bm", "image/bmp" }, { ".bmp", "image/bmp" }, { ".bmp", "image/x-windows-bmp" }, { ".boo", "application/book" }, { ".book", "application/book" }, { ".boz", "application/x-bzip2" }, { ".bsh", "application/x-bsh" }, { ".bz", "application/x-bzip" }, { ".bz2", "application/x-bzip2" }, { ".c", "text/plain" }, { ".c", "text/x-c" }, { ".c++", "text/plain" }, { ".cat", "application/vnd.ms-pki.seccat" }, { ".cc", "text/plain" }, { ".cc", "text/x-c" }, { ".ccad", "application/clariscad" }, { ".cco", "application/x-cocoa" }, { ".cdf", "application/cdf" }, { ".cdf", "application/x-cdf" }, { ".cdf", "application/x-netcdf" }, { ".cer", "application/pkix-cert" }, { ".cer", "application/x-x509-ca-cert" }, { ".cha", "application/x-chat" }, { ".chat", "application/x-chat" }, { ".class", "application/java" }, { ".class", "application/java-byte-code" }, { ".class", "application/x-java-class" }, { ".com", "application/octet-stream" }, { ".com", "text/plain" }, { ".conf", "text/plain" }, { ".cpio", "application/x-cpio" }, { ".cpp", "text/x-c" }, { ".cpt", "application/mac-compactpro" }, { ".cpt", "application/x-compactpro" }, { ".cpt", "application/x-cpt" }, { ".crl", "application/pkcs-crl" }, { ".crl", "application/pkix-crl" }, { ".crt", "application/pkix-cert" }, { ".crt", "application/x-x509-ca-cert" }, { ".crt", "application/x-x509-user-cert" }, { ".csh", "application/x-csh" }, { ".csh", "text/x-script.csh" }, { ".css", "application/x-pointplus" }, { ".css", "text/css" }, { ".cxx", "text/plain" }, { ".dcr", "application/x-director" }, { ".deepv", "application/x-deepv" }, { ".def", "text/plain" }, { ".der", "application/x-x509-ca-cert" }, { ".dif", "video/x-dv" }, { ".dir", "application/x-director" }, { ".dl", "video/dl" }, { ".dl", "video/x-dl" }, { ".doc", "application/msword" }, { ".dot", "application/msword" }, { ".dp", "application/commonground" }, { ".drw", "application/drafting" }, { ".dump", "application/octet-stream" }, { ".dv", "video/x-dv" }, { ".dvi", "application/x-dvi" }, { ".dwf", "drawing/x-dwf, (old)" }, { ".dwf", "model/vnd.dwf" }, { ".dwg", "application/acad" }, { ".dwg", "image/vnd.dwg" }, { ".dwg", "image/x-dwg" }, { ".dxf", "application/dxf" }, { ".dxf", "image/vnd.dwg" }, { ".dxf", "image/x-dwg" }, { ".dxr", "application/x-director" }, { ".el", "text/x-script.elisp" }, { ".elc", "application/x-bytecode.elisp, (compiled, elisp)" }, { ".elc", "application/x-elc" }, { ".env", "application/x-envoy" }, { ".eps", "application/postscript" }, { ".es", "application/x-esrehber" }, { ".etx", "text/x-setext" }, { ".evy", "application/envoy" }, { ".evy", "application/x-envoy" }, { ".exe", "application/octet-stream" }, { ".f", "text/plain" }, { ".f", "text/x-fortran" }, { ".f77", "text/x-fortran" }, { ".f90", "text/plain" }, { ".f90", "text/x-fortran" }, { ".fdf", "application/vnd.fdf" }, { ".fif", "application/fractals" }, { ".fif", "image/fif" }, { ".fli", "video/fli" }, { ".fli", "video/x-fli" }, { ".flo", "image/florian" }, { ".flx", "text/vnd.fmi.flexstor" }, { ".fmf", "video/x-atomic3d-feature" }, { ".for", "text/plain" }, { ".for", "text/x-fortran" }, { ".fpx", "image/vnd.fpx" }, { ".fpx", "image/vnd.net-fpx" }, { ".frl", "application/freeloader" }, { ".funk", "audio/make" }, { ".g", "text/plain" }, { ".g3", "image/g3fax" }, { ".gif", "image/gif" }, { ".gl", "video/gl" }, { ".gl", "video/x-gl" }, { ".gsd", "audio/x-gsm" }, { ".gsm", "audio/x-gsm" }, { ".gsp", "application/x-gsp" }, { ".gss", "application/x-gss" }, { ".gtar", "application/x-gtar" }, { ".gz", "application/x-compressed" }, { ".gz", "application/x-gzip" }, { ".gzip", "application/x-gzip" }, { ".gzip", "multipart/x-gzip" }, { ".h", "text/plain" }, { ".h", "text/x-h" }, { ".hdf", "application/x-hdf" }, { ".help", "application/x-helpfile" }, { ".hgl", "application/vnd.hp-hpgl" }, { ".hh", "text/plain" }, { ".hh", "text/x-h" }, { ".hlb", "text/x-script" }, { ".hlp", "application/hlp" }, { ".hlp", "application/x-helpfile" }, { ".hlp", "application/x-winhelp" }, { ".hpg", "application/vnd.hp-hpgl" }, { ".hpgl", "application/vnd.hp-hpgl" }, { ".hqx", "application/binhex" }, { ".hqx", "application/binhex4" }, { ".hqx", "application/mac-binhex" }, { ".hqx", "application/mac-binhex40" }, { ".hqx", "application/x-binhex40" }, { ".hqx", "application/x-mac-binhex40" }, { ".hta", "application/hta" }, { ".htc", "text/x-component" }, { ".htm", "text/html" }, { ".html", "text/html" }, { ".htmls", "text/html" }, { ".htt", "text/webviewhtml" }, { ".htx", "text/html" }, { ".ice", "x-conference/x-cooltalk" }, { ".ico", "image/x-icon" }, { ".idc", "text/plain" }, { ".ief", "image/ief" }, { ".iefs", "image/ief" }, { ".iges", "application/iges" }, { ".iges", "model/iges" }, { ".igs", "application/iges" }, { ".igs", "model/iges" }, { ".ima", "application/x-ima" }, { ".imap", "application/x-httpd-imap" }, { ".inf", "application/inf" }, { ".ins", "application/x-internett-signup" }, { ".ip", "application/x-ip2" }, { ".isu", "video/x-isvideo" }, { ".it", "audio/it" }, { ".iv", "application/x-inventor" }, { ".ivr", "i-world/i-vrml" }, { ".ivy", "application/x-livescreen" }, { ".jam", "audio/x-jam" }, { ".jav", "text/plain" }, { ".jav", "text/x-java-source" }, { ".java", "text/plain" }, { ".java", "text/x-java-source" }, { ".jcm", "application/x-java-commerce" }, { ".jfif", "image/jpeg" }, { ".jfif", "image/pjpeg" }, { ".jfif-tbnl", "image/jpeg" }, { ".jpe", "image/jpeg" }, { ".jpe", "image/pjpeg" }, { ".jpeg", "image/jpeg" }, { ".jpeg", "image/pjpeg" }, { ".jpg", "image/jpeg" }, { ".jpg", "image/pjpeg" }, { ".jps", "image/x-jps" }, { ".js", "application/x-javascript" }, { ".js", "application/javascript" }, { ".js", "application/ecmascript" }, { ".js", "text/javascript" }, { ".js", "text/ecmascript" }, { ".jut", "image/jutvision" }, { ".kar", "audio/midi" }, { ".kar", "music/x-karaoke" }, { ".ksh", "application/x-ksh" }, { ".ksh", "text/x-script.ksh" }, { ".la", "audio/nspaudio" }, { ".la", "audio/x-nspaudio" }, { ".lam", "audio/x-liveaudio" }, { ".latex", "application/x-latex" }, { ".lha", "application/lha" }, { ".lha", "application/octet-stream" }, { ".lha", "application/x-lha" }, { ".lhx", "application/octet-stream" }, { ".list", "text/plain" }, { ".lma", "audio/nspaudio" }, { ".lma", "audio/x-nspaudio" }, { ".log", "text/plain" }, { ".lsp", "application/x-lisp" }, { ".lsp", "text/x-script.lisp" }, { ".lst", "text/plain" }, { ".lsx", "text/x-la-asf" }, { ".ltx", "application/x-latex" }, { ".lzh", "application/octet-stream" }, { ".lzh", "application/x-lzh" }, { ".lzx", "application/lzx" }, { ".lzx", "application/octet-stream" }, { ".lzx", "application/x-lzx" }, { ".m", "text/plain" }, { ".m", "text/x-m" }, { ".m1v", "video/mpeg" }, { ".m2a", "audio/mpeg" }, { ".m2v", "video/mpeg" }, { ".m3u", "audio/x-mpequrl" }, { ".man", "application/x-troff-man" }, { ".map", "application/x-navimap" }, { ".mar", "text/plain" }, { ".mbd", "application/mbedlet" }, { ".mc$", "application/x-magic-cap-package-1.0" }, { ".mcd", "application/mcad" }, { ".mcd", "application/x-mathcad" }, { ".mcf", "image/vasa" }, { ".mcf", "text/mcf" }, { ".mcp", "application/netmc" }, { ".me", "application/x-troff-me" }, { ".mht", "message/rfc822" }, { ".mhtml", "message/rfc822" }, { ".mid", "application/x-midi" }, { ".mid", "audio/midi" }, { ".mid", "audio/x-mid" }, { ".mid", "audio/x-midi" }, { ".mid", "music/crescendo" }, { ".mid", "x-music/x-midi" }, { ".midi", "application/x-midi" }, { ".midi", "audio/midi" }, { ".midi", "audio/x-mid" }, { ".midi", "audio/x-midi" }, { ".midi", "music/crescendo" }, { ".midi", "x-music/x-midi" }, { ".mif", "application/x-frame" }, { ".mif", "application/x-mif" }, { ".mime", "message/rfc822" }, { ".mime", "www/mime" }, { ".mjf", "audio/x-vnd.audioexplosion.mjuicemediafile" }, { ".mjpg", "video/x-motion-jpeg" }, { ".mm", "application/base64" }, { ".mm", "application/x-meme" }, { ".mme", "application/base64" }, { ".mod", "audio/mod" }, { ".mod", "audio/x-mod" }, { ".moov", "video/quicktime" }, { ".mov", "video/quicktime" }, { ".movie", "video/x-sgi-movie" }, { ".mobileconfig", "application/x-apple-aspen-config" }, { ".mp2", "audio/mpeg" }, { ".mp2", "audio/x-mpeg" }, { ".mp2", "video/mpeg" }, { ".mp2", "video/x-mpeg" }, { ".mp2", "video/x-mpeq2a" }, { ".mp3", "audio/mpeg3" }, { ".mp3", "audio/x-mpeg-3" }, { ".mp3", "video/mpeg" }, { ".mp3", "video/x-mpeg" }, { ".mpa", "audio/mpeg" }, { ".mpa", "video/mpeg" }, { ".mpc", "application/x-project" }, { ".mpe", "video/mpeg" }, { ".mpeg", "video/mpeg" }, { ".mpg", "audio/mpeg" }, { ".mpg", "video/mpeg" }, { ".mpga", "audio/mpeg" }, { ".mpp", "application/vnd.ms-project" }, { ".mpt", "application/x-project" }, { ".mpv", "application/x-project" }, { ".mpx", "application/x-project" }, { ".mrc", "application/marc" }, { ".ms", "application/x-troff-ms" }, { ".mv", "video/x-sgi-movie" }, { ".my", "audio/make" }, { ".mzz", "application/x-vnd.audioexplosion.mzz" }, { ".nap", "image/naplps" }, { ".naplps", "image/naplps" }, { ".nc", "application/x-netcdf" }, { ".ncm", "application/vnd.nokia.configuration-message" }, { ".nif", "image/x-niff" }, { ".niff", "image/x-niff" }, { ".nix", "application/x-mix-transfer" }, { ".nsc", "application/x-conference" }, { ".nvd", "application/x-navidoc" }, { ".o", "application/octet-stream" }, { ".oda", "application/oda" }, { ".omc", "application/x-omc" }, { ".omcd", "application/x-omcdatamaker" }, { ".omcr", "application/x-omcregerator" }, { ".p", "text/x-pascal" }, { ".p10", "application/pkcs10" }, { ".p10", "application/x-pkcs10" }, { ".p12", "application/pkcs-12" }, { ".p12", "application/x-pkcs12" }, { ".p7a", "application/x-pkcs7-signature" }, { ".p7c", "application/pkcs7-mime" }, { ".p7c", "application/x-pkcs7-mime" }, { ".p7m", "application/pkcs7-mime" }, { ".p7m", "application/x-pkcs7-mime" }, { ".p7r", "application/x-pkcs7-certreqresp" }, { ".p7s", "application/pkcs7-signature" }, { ".part", "application/pro_eng" }, { ".pas", "text/pascal" }, { ".pbm", "image/x-portable-bitmap" }, { ".pcl", "application/vnd.hp-pcl" }, { ".pcl", "application/x-pcl" }, { ".pct", "image/x-pict" }, { ".pcx", "image/x-pcx" }, { ".pdb", "chemical/x-pdb" }, { ".pdf", "application/pdf" }, { ".pfunk", "audio/make" }, { ".pfunk", "audio/make.my.funk" }, { ".pgm", "image/x-portable-graymap" }, { ".pgm", "image/x-portable-greymap" }, { ".pic", "image/pict" }, { ".pict", "image/pict" }, { ".pkg", "application/x-newton-compatible-pkg" }, { ".pko", "application/vnd.ms-pki.pko" }, { ".pl", "text/plain" }, { ".pl", "text/x-script.perl" }, { ".plx", "application/x-pixclscript" }, { ".pm", "image/x-xpixmap" }, { ".pm", "text/x-script.perl-module" }, { ".pm4", "application/x-pagemaker" }, { ".pm5", "application/x-pagemaker" }, { ".png", "image/png" }, { ".pnm", "application/x-portable-anymap" }, { ".pnm", "image/x-portable-anymap" }, { ".pot", "application/mspowerpoint" }, { ".pot", "application/vnd.ms-powerpoint" }, { ".pov", "model/x-pov" }, { ".ppa", "application/vnd.ms-powerpoint" }, { ".ppm", "image/x-portable-pixmap" }, { ".pps", "application/mspowerpoint" }, { ".pps", "application/vnd.ms-powerpoint" }, { ".ppt", "application/mspowerpoint" }, { ".ppt", "application/powerpoint" }, { ".ppt", "application/vnd.ms-powerpoint" }, { ".ppt", "application/x-mspowerpoint" }, { ".ppz", "application/mspowerpoint" }, { ".pre", "application/x-freelance" }, { ".prt", "application/pro_eng" }, { ".ps", "application/postscript" }, { ".psd", "application/octet-stream" }, { ".pvu", "paleovu/x-pv" }, { ".pwz", "application/vnd.ms-powerpoint" }, { ".py", "text/x-script.phyton" }, { ".pyc", "applicaiton/x-bytecode.python" }, { ".qcp", "audio/vnd.qcelp" }, { ".qd3", "x-world/x-3dmf" }, { ".qd3d", "x-world/x-3dmf" }, { ".qif", "image/x-quicktime" }, { ".qt", "video/quicktime" }, { ".qtc", "video/x-qtc" }, { ".qti", "image/x-quicktime" }, { ".qtif", "image/x-quicktime" }, { ".ra", "audio/x-pn-realaudio" }, { ".ra", "audio/x-pn-realaudio-plugin" }, { ".ra", "audio/x-realaudio" }, { ".ram", "audio/x-pn-realaudio" }, { ".ras", "application/x-cmu-raster" }, { ".ras", "image/cmu-raster" }, { ".ras", "image/x-cmu-raster" }, { ".rast", "image/cmu-raster" }, { ".rexx", "text/x-script.rexx" }, { ".rf", "image/vnd.rn-realflash" }, { ".rgb", "image/x-rgb" }, { ".rm", "application/vnd.rn-realmedia" }, { ".rm", "audio/x-pn-realaudio" }, { ".rmi", "audio/mid" }, { ".rmm", "audio/x-pn-realaudio" }, { ".rmp", "audio/x-pn-realaudio" }, { ".rmp", "audio/x-pn-realaudio-plugin" }, { ".rng", "application/ringing-tones" }, { ".rng", "application/vnd.nokia.ringing-tone" }, { ".rnx", "application/vnd.rn-realplayer" }, { ".roff", "application/x-troff" }, { ".rp", "image/vnd.rn-realpix" }, { ".rpm", "audio/x-pn-realaudio-plugin" }, { ".rt", "text/richtext" }, { ".rt", "text/vnd.rn-realtext" }, { ".rtf", "application/rtf" }, { ".rtf", "application/x-rtf" }, { ".rtf", "text/richtext" }, { ".rtx", "application/rtf" }, { ".rtx", "text/richtext" }, { ".rv", "video/vnd.rn-realvideo" }, { ".s", "text/x-asm" }, { ".s3m", "audio/s3m" }, { ".saveme", "application/octet-stream" }, { ".sbk", "application/x-tbook" }, { ".scm", "application/x-lotusscreencam" }, { ".scm", "text/x-script.guile" }, { ".scm", "text/x-script.scheme" }, { ".scm", "video/x-scm" }, { ".sdml", "text/plain" }, { ".sdp", "application/sdp" }, { ".sdp", "application/x-sdp" }, { ".sdr", "application/sounder" }, { ".sea", "application/sea" }, { ".sea", "application/x-sea" }, { ".set", "application/set" }, { ".sgm", "text/sgml" }, { ".sgm", "text/x-sgml" }, { ".sgml", "text/sgml" }, { ".sgml", "text/x-sgml" }, { ".sh", "application/x-bsh" }, { ".sh", "application/x-sh" }, { ".sh", "application/x-shar" }, { ".sh", "text/x-script.sh" }, { ".shar", "application/x-bsh" }, { ".shar", "application/x-shar" }, { ".shtml", "text/html" }, { ".shtml", "text/x-server-parsed-html" }, { ".sid", "audio/x-psid" }, { ".sit", "application/x-sit" }, { ".sit", "application/x-stuffit" }, { ".skd", "application/x-koan" }, { ".skm", "application/x-koan" }, { ".skp", "application/x-koan" }, { ".skt", "application/x-koan" }, { ".sl", "application/x-seelogo" }, { ".smi", "application/smil" }, { ".smil", "application/smil" }, { ".snd", "audio/basic" }, { ".snd", "audio/x-adpcm" }, { ".sol", "application/solids" }, { ".spc", "application/x-pkcs7-certificates" }, { ".spc", "text/x-speech" }, { ".spl", "application/futuresplash" }, { ".spr", "application/x-sprite" }, { ".sprite", "application/x-sprite" }, { ".src", "application/x-wais-source" }, { ".ssi", "text/x-server-parsed-html" }, { ".ssm", "application/streamingmedia" }, { ".sst", "application/vnd.ms-pki.certstore" }, { ".step", "application/step" }, { ".stl", "application/sla" }, { ".stl", "application/vnd.ms-pki.stl" }, { ".stl", "application/x-navistyle" }, { ".stp", "application/step" }, { ".sv4cpio", "application/x-sv4cpio" }, { ".sv4crc", "application/x-sv4crc" }, { ".svf", "image/vnd.dwg" }, { ".svf", "image/x-dwg" }, { ".svr", "application/x-world" }, { ".svr", "x-world/x-svr" }, { ".swf", "application/x-shockwave-flash" }, { ".t", "application/x-troff" }, { ".talk", "text/x-speech" }, { ".tar", "application/x-tar" }, { ".tbk", "application/toolbook" }, { ".tbk", "application/x-tbook" }, { ".tcl", "application/x-tcl" }, { ".tcl", "text/x-script.tcl" }, { ".tcsh", "text/x-script.tcsh" }, { ".tex", "application/x-tex" }, { ".texi", "application/x-texinfo" }, { ".texinfo", "application/x-texinfo" }, { ".text", "application/plain" }, { ".text", "text/plain" }, { ".tgz", "application/gnutar" }, { ".tgz", "application/x-compressed" }, { ".tif", "image/tiff" }, { ".tif", "image/x-tiff" }, { ".tiff", "image/tiff" }, { ".tiff", "image/x-tiff" }, { ".tr", "application/x-troff" }, { ".tsi", "audio/tsp-audio" }, { ".tsp", "application/dsptype" }, { ".tsp", "audio/tsplayer" }, { ".tsv", "text/tab-separated-values" }, { ".turbot", "image/florian" }, { ".txt", "text/plain" }, { ".uil", "text/x-uil" }, { ".uni", "text/uri-list" }, { ".unis", "text/uri-list" }, { ".unv", "application/i-deas" }, { ".uri", "text/uri-list" }, { ".uris", "text/uri-list" }, { ".ustar", "application/x-ustar" }, { ".ustar", "multipart/x-ustar" }, { ".uu", "application/octet-stream" }, { ".uu", "text/x-uuencode" }, { ".uue", "text/x-uuencode" }, { ".vcd", "application/x-cdlink" }, { ".vcs", "text/x-vcalendar" }, { ".vda", "application/vda" }, { ".vdo", "video/vdo" }, { ".vew", "application/groupwise" }, { ".viv", "video/vivo" }, { ".viv", "video/vnd.vivo" }, { ".vivo", "video/vivo" }, { ".vivo", "video/vnd.vivo" }, { ".vmd", "application/vocaltec-media-desc" }, { ".vmf", "application/vocaltec-media-file" }, { ".voc", "audio/voc" }, { ".voc", "audio/x-voc" }, { ".vos", "video/vosaic" }, { ".vox", "audio/voxware" }, { ".vqe", "audio/x-twinvq-plugin" }, { ".vqf", "audio/x-twinvq" }, { ".vql", "audio/x-twinvq-plugin" }, { ".vrml", "application/x-vrml" }, { ".vrml", "model/vrml" }, { ".vrml", "x-world/x-vrml" }, { ".vrt", "x-world/x-vrt" }, { ".vsd", "application/x-visio" }, { ".vst", "application/x-visio" }, { ".vsw", "application/x-visio" }, { ".w60", "application/wordperfect6.0" }, { ".w61", "application/wordperfect6.1" }, { ".w6w", "application/msword" }, { ".wav", "audio/wav" }, { ".wav", "audio/x-wav" }, { ".wb1", "application/x-qpro" }, { ".wbmp", "image/vnd.wap.wbmp" }, { ".web", "application/vnd.xara" }, { ".wiz", "application/msword" }, { ".wk1", "application/x-123" }, { ".wmf", "windows/metafile" }, { ".wml", "text/vnd.wap.wml" }, { ".wmlc", "application/vnd.wap.wmlc" }, { ".wmls", "text/vnd.wap.wmlscript" }, { ".wmlsc", "application/vnd.wap.wmlscriptc" }, { ".word", "application/msword" }, { ".wp", "application/wordperfect" }, { ".wp5", "application/wordperfect" }, { ".wp5", "application/wordperfect6.0" }, { ".wp6", "application/wordperfect" }, { ".wpd", "application/wordperfect" }, { ".wpd", "application/x-wpwin" }, { ".wq1", "application/x-lotus" }, { ".wri", "application/mswrite" }, { ".wri", "application/x-wri" }, { ".wrl", "application/x-world" }, { ".wrl", "model/vrml" }, { ".wrl", "x-world/x-vrml" }, { ".wrz", "model/vrml" }, { ".wrz", "x-world/x-vrml" }, { ".wsc", "text/scriplet" }, { ".wsrc", "application/x-wais-source" }, { ".wtk", "application/x-wintalk" }, { ".xbm", "image/x-xbitmap" }, { ".xbm", "image/x-xbm" }, { ".xbm", "image/xbm" }, { ".xdr", "video/x-amt-demorun" }, { ".xgz", "xgl/drawing" }, { ".xif", "image/vnd.xiff" }, { ".xl", "application/excel" }, { ".xla", "application/excel" }, { ".xla", "application/x-excel" }, { ".xla", "application/x-msexcel" }, { ".xlb", "application/excel" }, { ".xlb", "application/vnd.ms-excel" }, { ".xlb", "application/x-excel" }, { ".xlc", "application/excel" }, { ".xlc", "application/vnd.ms-excel" }, { ".xlc", "application/x-excel" }, { ".xld", "application/excel" }, { ".xld", "application/x-excel" }, { ".xlk", "application/excel" }, { ".xlk", "application/x-excel" }, { ".xll", "application/excel" }, { ".xll", "application/vnd.ms-excel" }, { ".xll", "application/x-excel" }, { ".xlm", "application/excel" }, { ".xlm", "application/vnd.ms-excel" }, { ".xlm", "application/x-excel" }, { ".xls", "application/excel" }, { ".xls", "application/vnd.ms-excel" }, { ".xls", "application/x-excel" }, { ".xls", "application/x-msexcel" }, { ".xlt", "application/excel" }, { ".xlt", "application/x-excel" }, { ".xlv", "application/excel" }, { ".xlv", "application/x-excel" }, { ".xlw", "application/excel" }, { ".xlw", "application/vnd.ms-excel" }, { ".xlw", "application/x-excel" }, { ".xlw", "application/x-msexcel" }, { ".xm", "audio/xm" }, { ".xml", "application/xml" }, { ".xml", "text/xml" }, { ".xmz", "xgl/movie" }, { ".xpix", "application/x-vnd.ls-xpix" }, { ".xpm", "image/x-xpixmap" }, { ".xpm", "image/xpm" }, { ".x-png", "image/png" }, { ".xsr", "video/x-amt-showrun" }, { ".xwd", "image/x-xwd" }, { ".xwd", "image/x-xwindowdump" }, { ".xyz", "chemical/x-pdb" }, { ".z", "application/x-compress" }, { ".z", "application/x-compressed" }, { ".zip", "application/x-compressed" }, { ".zip", "application/x-zip-compressed" }, { ".zip", "application/zip" }, { ".zip", "multipart/x-zip" }, { ".zoo", "application/octet-stream" }, { ".zsh", "text/x-script.zsh" } ] @doc "Get the attachment struct for given by path file from the file system" def inline(file_path, file_name \\ nil) do case file_path |> Path.expand |> File.read do { :ok, data } -> { :ok, %Mailman.Attachment{ file_name: file_name || Path.basename(file_path), mime_type: mime_type_for_path(file_path), mime_sub_type: mime_sub_type_for_path(file_path), data: data } } { :error, message } -> { :error, message } end end @doc "Get the attachment struct for given by path file from the file system and throw an error if anything goes wrong." def inline!(file_path, file_name \\ nil) do case inline(file_path, file_name) do { :ok, attachment } -> attachment { :error, message } -> throw message end end def attach(url, file_name \\ nil) do case is_valid_url(url) do {:ok, uri} -> response = HTTPotion.get(url, [timeout: 60_000]) case response.status_code do 200 -> { :ok, %Mailman.Attachment{ file_name: file_name || Path.basename(url), mime_type: mime_type_for_path(url), mime_sub_type: mime_sub_type_for_path(url), data: response.body } } _ -> {:error, "File not found"} end {:error, message} -> {:error, message} end end def attach!(url, file_name \\ nil) do case attach(url, file_name) do { :ok, attachment } -> attachment { :error, message } -> throw message end end def mime_full_for_path(path) do extension = Path.extname(path) type = Enum.find mime_types, fn({ext, _}) -> ext == extension end case type do nil -> "application/octet-stream" _ -> elem(type, 1) end end def mime_type_for_path(path) do mime_full_for_path(path) |> String.split("/") |> List.first end def mime_sub_type_for_path(path) do mime_full_for_path(path) |> String.split("/") |> List.last end def mime_types do @mime_types end def is_valid_url(str) do uri = URI.parse(str) result = case uri do %URI{scheme: nil} -> {:error, uri} %URI{host: nil} -> {:error, uri} %URI{path: nil} -> {:error, uri} uri -> {:ok, uri} end case result do {:ok, uri} -> :inet.gethostbyname(to_char_list uri.host) _ -> result end end end