[{"data":1,"prerenderedAt":1317},["ShallowReactive",2],{"post:forms-3-sending-emails":3},{"id":4,"title":5,"body":6,"date":1304,"description":12,"draft":1305,"extension":1306,"meta":1307,"navigation":861,"path":1308,"seo":1309,"stem":1310,"tags":1311,"__hash__":1316},"posts\u002Fposts\u002Fforms-3-sending-emails.md","Form Processing in CFScript Part Three: Sending Email Notifications",{"type":7,"value":8,"toc":1293},"minimark",[9,13,16,21,24,107,111,129,243,262,306,309,313,320,381,384,388,400,480,495,582,586,606,683,705,713,717,731,734,737,751,754,812,815,825,892,896,903,984,987,1049,1053,1056,1153,1164,1205,1215,1282,1286,1289],[10,11,12],"p",{},"In this series so far, we've looked at how to validate a form entry and how to save that form entry to the database. Today we'll see how we can notify a person (usually a site admin or editor) that a new form entry has been submitted and processed by simply sending an email.",[10,14,15],{},"Email works well for form notifications because the entire entry will usually fit in a single email, and replying to an email can send a message to the original user who filled out the form. Contrast that with SMS messages, which are limited in content length and do not support rich formatting or reply-to functionality.",[17,18,20],"h2",{"id":19},"sending-emails-via-configured-smtp-server","Sending Emails via Configured SMTP Server",[10,22,23],{},"If your web server also has an SMTP server installed (Postfix, anyone?) and configured in your ColdFusion or Lucee administrator, sending the email is as easy as specifying the to address, from address, and subject.",[25,26,31],"pre",{"className":27,"code":28,"language":29,"meta":30,"style":30},"language-js shiki shiki-themes github-light github-dark","cfmail(\n    to=\"admin@mysite.com\",\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    \u002F\u002F email contents go here\n}\n","js","",[32,33,34,47,64,77,88,94,101],"code",{"__ignoreMap":30},[35,36,39,43],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"sScJk","cfmail",[35,44,46],{"class":45},"sVt8B","(\n",[35,48,50,53,57,61],{"class":37,"line":49},2,[35,51,52],{"class":45},"    to",[35,54,56],{"class":55},"szBVR","=",[35,58,60],{"class":59},"sZZnC","\"admin@mysite.com\"",[35,62,63],{"class":45},",\n",[35,65,67,70,72,75],{"class":37,"line":66},3,[35,68,69],{"class":45},"    from",[35,71,56],{"class":55},[35,73,74],{"class":59},"\"noreply@mysite.com\"",[35,76,63],{"class":45},[35,78,80,83,85],{"class":37,"line":79},4,[35,81,82],{"class":45},"    subject",[35,84,56],{"class":55},[35,86,87],{"class":59},"\"New form submission from #form.name#\"\n",[35,89,91],{"class":37,"line":90},5,[35,92,93],{"class":45},"){\n",[35,95,97],{"class":37,"line":96},6,[35,98,100],{"class":99},"sJ8bj","    \u002F\u002F email contents go here\n",[35,102,104],{"class":37,"line":103},7,[35,105,106],{"class":45},"}\n",[17,108,110],{"id":109},"sending-emails-via-mailgun-smtp","Sending Emails via Mailgun SMTP",[10,112,113,114,117,118,117,121,124,125,128],{},"If you don't have an SMTP server installed or configured, you can use the ",[32,115,116],{},"server",", ",[32,119,120],{},"port",[32,122,123],{},"username"," and ",[32,126,127],{},"password"," arguments to send via the Mailgun SMTP server, for example.",[25,130,132],{"className":27,"code":131,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\",\n    server=server.system.environment.SMTP_HOST,\n    port=server.system.environment.SMTP_PORT,\n    username=server.system.environment.SMTP_USERNAME,\n    password=server.system.environment.SMTP_PASSWORD\n){\n    \u002F\u002F email contents go here\n}\n",[32,133,134,140,150,160,171,187,201,215,228,233,238],{"__ignoreMap":30},[35,135,136,138],{"class":37,"line":38},[35,137,42],{"class":41},[35,139,46],{"class":45},[35,141,142,144,146,148],{"class":37,"line":49},[35,143,52],{"class":45},[35,145,56],{"class":55},[35,147,60],{"class":59},[35,149,63],{"class":45},[35,151,152,154,156,158],{"class":37,"line":66},[35,153,69],{"class":45},[35,155,56],{"class":55},[35,157,74],{"class":59},[35,159,63],{"class":45},[35,161,162,164,166,169],{"class":37,"line":79},[35,163,82],{"class":45},[35,165,56],{"class":55},[35,167,168],{"class":59},"\"New form submission from #form.name#\"",[35,170,63],{"class":45},[35,172,173,176,178,181,185],{"class":37,"line":90},[35,174,175],{"class":45},"    server",[35,177,56],{"class":55},[35,179,180],{"class":45},"server.system.environment.",[35,182,184],{"class":183},"sj4cs","SMTP_HOST",[35,186,63],{"class":45},[35,188,189,192,194,196,199],{"class":37,"line":96},[35,190,191],{"class":45},"    port",[35,193,56],{"class":55},[35,195,180],{"class":45},[35,197,198],{"class":183},"SMTP_PORT",[35,200,63],{"class":45},[35,202,203,206,208,210,213],{"class":37,"line":103},[35,204,205],{"class":45},"    username",[35,207,56],{"class":55},[35,209,180],{"class":45},[35,211,212],{"class":183},"SMTP_USERNAME",[35,214,63],{"class":45},[35,216,218,221,223,225],{"class":37,"line":217},8,[35,219,220],{"class":45},"    password",[35,222,56],{"class":55},[35,224,180],{"class":45},[35,226,227],{"class":183},"SMTP_PASSWORD\n",[35,229,231],{"class":37,"line":230},9,[35,232,93],{"class":45},[35,234,236],{"class":37,"line":235},10,[35,237,100],{"class":99},[35,239,241],{"class":37,"line":240},11,[35,242,106],{"class":45},[10,244,245,246,257,258,261],{},"Here I'm using ",[247,248,252,253,256],"a",{"href":249,"rel":250},"https:\u002F\u002Fblog.simplicityweb.co.uk\u002F109\u002Flucee-5-simpler-access-to-environment-variables",[251],"nofollow","environment variables stored in Lucee's ",[32,254,255],{},"server.system.environment"," struct"," to send via Mailgun's SMTP server. These environment variables could be set in the ",[32,259,260],{},"\u002Fenv\u002Fenvironment"," file or your bash profile to look something like this:",[25,263,267],{"className":264,"code":265,"language":266,"meta":30,"style":30},"language-bash shiki shiki-themes github-light github-dark","SMTP_HOST=smtp.mailgun.org\nSMTP_PORT=587\nSMTP_USERNAME=postmaster@mail.mysite.com\nSMTP_PASSWORD=123A923BCB6BGA7B*3\n","bash",[32,268,269,278,287,296],{"__ignoreMap":30},[35,270,271,273,275],{"class":37,"line":38},[35,272,184],{"class":45},[35,274,56],{"class":55},[35,276,277],{"class":59},"smtp.mailgun.org\n",[35,279,280,282,284],{"class":37,"line":49},[35,281,198],{"class":45},[35,283,56],{"class":55},[35,285,286],{"class":59},"587\n",[35,288,289,291,293],{"class":37,"line":66},[35,290,212],{"class":45},[35,292,56],{"class":55},[35,294,295],{"class":59},"postmaster@mail.mysite.com\n",[35,297,298,301,303],{"class":37,"line":79},[35,299,300],{"class":45},"SMTP_PASSWORD",[35,302,56],{"class":55},[35,304,305],{"class":59},"123A923BCB6BGA7B*3\n",[10,307,308],{},"The exact functionality depends on your system, but generally these variables will be loaded into your environment on system startup or on profile startup.",[17,310,312],{"id":311},"setting-the-email-reply-to","Setting the Email Reply To",[10,314,315,316,319],{},"Setting the ",[32,317,318],{},"replyto"," email address will let us reply to the user who filled out the form:",[25,321,323],{"className":27,"code":322,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    replyto=\"#form.email#\"\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    \u002F\u002F email contents go here\n}\n",[32,324,325,331,341,351,361,369,373,377],{"__ignoreMap":30},[35,326,327,329],{"class":37,"line":38},[35,328,42],{"class":41},[35,330,46],{"class":45},[35,332,333,335,337,339],{"class":37,"line":49},[35,334,52],{"class":45},[35,336,56],{"class":55},[35,338,60],{"class":59},[35,340,63],{"class":45},[35,342,343,346,348],{"class":37,"line":66},[35,344,345],{"class":45},"    replyto",[35,347,56],{"class":55},[35,349,350],{"class":59},"\"#form.email#\"\n",[35,352,353,355,357,359],{"class":37,"line":79},[35,354,69],{"class":45},[35,356,56],{"class":55},[35,358,74],{"class":59},[35,360,63],{"class":45},[35,362,363,365,367],{"class":37,"line":90},[35,364,82],{"class":45},[35,366,56],{"class":55},[35,368,87],{"class":59},[35,370,371],{"class":37,"line":96},[35,372,93],{"class":45},[35,374,375],{"class":37,"line":103},[35,376,100],{"class":99},[35,378,379],{"class":37,"line":217},[35,380,106],{"class":45},[10,382,383],{},"This is awesome because it allows admins to quickly respond to the original user. You simply can't do this when delivering via other mediums like SMS or Slack.",[17,385,387],{"id":386},"cfmail-body-output","CFMail Body Output",[10,389,390,391,395,396,399],{},"Here's where we output (or ",[392,393,394],"em",{},"render",") the form submission in the body of the email. This is pretty simple - we use the ",[32,397,398],{},"writeOutput()"," function to output HTML and the form values right in the email body:",[25,401,403],{"className":27,"code":402,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    replyto=\"#form.email#\"\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    writeOutput(\"New form submission by #form.name#\");\n    writeOutput(\"#form.message#\");\n}\n",[32,404,405,411,421,429,439,447,451,465,476],{"__ignoreMap":30},[35,406,407,409],{"class":37,"line":38},[35,408,42],{"class":41},[35,410,46],{"class":45},[35,412,413,415,417,419],{"class":37,"line":49},[35,414,52],{"class":45},[35,416,56],{"class":55},[35,418,60],{"class":59},[35,420,63],{"class":45},[35,422,423,425,427],{"class":37,"line":66},[35,424,345],{"class":45},[35,426,56],{"class":55},[35,428,350],{"class":59},[35,430,431,433,435,437],{"class":37,"line":79},[35,432,69],{"class":45},[35,434,56],{"class":55},[35,436,74],{"class":59},[35,438,63],{"class":45},[35,440,441,443,445],{"class":37,"line":90},[35,442,82],{"class":45},[35,444,56],{"class":55},[35,446,87],{"class":59},[35,448,449],{"class":37,"line":96},[35,450,93],{"class":45},[35,452,453,456,459,462],{"class":37,"line":103},[35,454,455],{"class":41},"    writeOutput",[35,457,458],{"class":45},"(",[35,460,461],{"class":59},"\"New form submission by #form.name#\"",[35,463,464],{"class":45},");\n",[35,466,467,469,471,474],{"class":37,"line":217},[35,468,455],{"class":41},[35,470,458],{"class":45},[35,472,473],{"class":59},"\"#form.message#\"",[35,475,464],{"class":45},[35,477,478],{"class":37,"line":230},[35,479,106],{"class":45},[10,481,482,483,486,487,490,491,494],{},"Note that the MIME type of the email will be ",[32,484,485],{},"text\u002Fplain"," by default. For rendering HTML in our email we'll need to set the mime type via ",[32,488,489],{},"type=\"text\u002Fhtml\""," or even just ",[32,492,493],{},"type=\"html\"",":",[25,496,498],{"className":27,"code":497,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    replyto=\"#form.email#\"\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\",\n    type=\"html\"\n){\n    writeOutput(\"New form submission by #form.name#\");\n    writeOutput(\"#form.message#\");\n}\n",[32,499,500,506,516,524,534,544,554,558,568,578],{"__ignoreMap":30},[35,501,502,504],{"class":37,"line":38},[35,503,42],{"class":41},[35,505,46],{"class":45},[35,507,508,510,512,514],{"class":37,"line":49},[35,509,52],{"class":45},[35,511,56],{"class":55},[35,513,60],{"class":59},[35,515,63],{"class":45},[35,517,518,520,522],{"class":37,"line":66},[35,519,345],{"class":45},[35,521,56],{"class":55},[35,523,350],{"class":59},[35,525,526,528,530,532],{"class":37,"line":79},[35,527,69],{"class":45},[35,529,56],{"class":55},[35,531,74],{"class":59},[35,533,63],{"class":45},[35,535,536,538,540,542],{"class":37,"line":90},[35,537,82],{"class":45},[35,539,56],{"class":55},[35,541,168],{"class":59},[35,543,63],{"class":45},[35,545,546,549,551],{"class":37,"line":96},[35,547,548],{"class":45},"    type",[35,550,56],{"class":55},[35,552,553],{"class":59},"\"html\"\n",[35,555,556],{"class":37,"line":103},[35,557,93],{"class":45},[35,559,560,562,564,566],{"class":37,"line":217},[35,561,455],{"class":41},[35,563,458],{"class":45},[35,565,461],{"class":59},[35,567,464],{"class":45},[35,569,570,572,574,576],{"class":37,"line":230},[35,571,455],{"class":41},[35,573,458],{"class":45},[35,575,473],{"class":59},[35,577,464],{"class":45},[35,579,580],{"class":37,"line":235},[35,581,106],{"class":45},[17,583,585],{"id":584},"avoiding-xss-in-emails","Avoiding XSS in Emails",[10,587,588,589,592,593,598,599,602,603,494],{},"Please don't output user-submitted data (form variables) without encoding them! The last thing you want to do is send a spammer's script tag (think ",[32,590,591],{},"\u003Cscript src=\"http:\u002F\u002Fbadwebsite.com\u002Fjs\u002Fpayload.js\">\u003C\u002Fscript>"," tag) to your client's email address. That's what you call ",[247,594,597],{"href":595,"rel":596},"https:\u002F\u002Fwww.acunetix.com\u002Fwebsitesecurity\u002Fcross-site-scripting\u002F",[251],"Cross-Site-Scripting",", and in CFML it's easy to avoid - just wrap every ",[32,600,601],{},"#form.field#"," with ",[32,604,605],{},"encodeForHTML()",[25,607,609],{"className":27,"code":608,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    replyto=\"#form.email#\"\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    writeOutput(\"New form submission by #encodeForHTML( form.name )#\");\n    writeOutput(\"#encodeForHTML( form.message )#\");\n}\n",[32,610,611,617,627,635,645,653,657,668,679],{"__ignoreMap":30},[35,612,613,615],{"class":37,"line":38},[35,614,42],{"class":41},[35,616,46],{"class":45},[35,618,619,621,623,625],{"class":37,"line":49},[35,620,52],{"class":45},[35,622,56],{"class":55},[35,624,60],{"class":59},[35,626,63],{"class":45},[35,628,629,631,633],{"class":37,"line":66},[35,630,345],{"class":45},[35,632,56],{"class":55},[35,634,350],{"class":59},[35,636,637,639,641,643],{"class":37,"line":79},[35,638,69],{"class":45},[35,640,56],{"class":55},[35,642,74],{"class":59},[35,644,63],{"class":45},[35,646,647,649,651],{"class":37,"line":90},[35,648,82],{"class":45},[35,650,56],{"class":55},[35,652,87],{"class":59},[35,654,655],{"class":37,"line":96},[35,656,93],{"class":45},[35,658,659,661,663,666],{"class":37,"line":103},[35,660,455],{"class":41},[35,662,458],{"class":45},[35,664,665],{"class":59},"\"New form submission by #encodeForHTML( form.name )#\"",[35,667,464],{"class":45},[35,669,670,672,674,677],{"class":37,"line":217},[35,671,455],{"class":41},[35,673,458],{"class":45},[35,675,676],{"class":59},"\"#encodeForHTML( form.message )#\"",[35,678,464],{"class":45},[35,680,681],{"class":37,"line":230},[35,682,106],{"class":45},[10,684,685,686,689,690,124,697,704],{},"There are a bunch of ",[32,687,688],{},"encodeFor*()"," functions designed for certain contexts, such as ",[247,691,694],{"href":692,"rel":693},"https:\u002F\u002Fcfdocs.org\u002Fencodeforurl",[251],[32,695,696],{},"encodeForURL()",[247,698,701],{"href":699,"rel":700},"https:\u002F\u002Fcfdocs.org\u002Fencodeforhtmlattribute",[251],[32,702,703],{},"encodeForHTMLAttribute()",". I can't demo all those, but I can write a more detailed XSS blog post if you'd like me to!",[10,706,707,708,712],{},"Note that our email templates are looking larger and more complex. Real-world code can be large, complex and messy, so let's clean it up by ",[709,710,711],"strong",{},"not using CFScript",".",[17,714,716],{"id":715},"the-best-dang-template-syntax","The Best Dang Template Syntax",[10,718,719,720,723,724,727,728,712],{},"Outputting HTML from a scripting language is - ",[392,721,722],{},"lets be honest"," - ",[709,725,726],{},"awkward",". It's awkward in Javascript (though much improved lately with template literals), it's awkward in PHP and it's certainly awkward in CFScript. Template engines like Twig, Jade, and Mustache solve this for other languages, but in ColdFusion we have the ",[709,729,730],{},"best dang template syntax in the world",[10,732,733],{},"So why not use it?",[10,735,736],{},"CFML lets us switch between script syntax and tag syntax as necessary - no libraries, no extra compiling and no need to learn a funky template syntax.",[10,738,739,740,743,744,747,748,712],{},"I recommend creating a ",[32,741,742],{},"views\u002Femails\u002F"," directory for email templates. Then each new email can be a separate file named after the contact form, like ",[32,745,746],{},"views\u002Femails\u002Fdonate-thankyou.cfm"," or ",[32,749,750],{},"views\u002Fforms\u002Fforgotpassword.cfm",[10,752,753],{},"Here's a quick example:",[25,755,757],{"className":27,"code":756,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    include \"\u002Fviews\u002Fforms\u002Fcontact\u002Femail.cfm\";\n}\n",[32,758,759,765,775,785,793,797,808],{"__ignoreMap":30},[35,760,761,763],{"class":37,"line":38},[35,762,42],{"class":41},[35,764,46],{"class":45},[35,766,767,769,771,773],{"class":37,"line":49},[35,768,52],{"class":45},[35,770,56],{"class":55},[35,772,60],{"class":59},[35,774,63],{"class":45},[35,776,777,779,781,783],{"class":37,"line":66},[35,778,69],{"class":45},[35,780,56],{"class":55},[35,782,74],{"class":59},[35,784,63],{"class":45},[35,786,787,789,791],{"class":37,"line":79},[35,788,82],{"class":45},[35,790,56],{"class":55},[35,792,87],{"class":59},[35,794,795],{"class":37,"line":90},[35,796,93],{"class":45},[35,798,799,802,805],{"class":37,"line":96},[35,800,801],{"class":45},"    include ",[35,803,804],{"class":59},"\"\u002Fviews\u002Fforms\u002Fcontact\u002Femail.cfm\"",[35,806,807],{"class":45},";\n",[35,809,810],{"class":37,"line":103},[35,811,106],{"class":45},[10,813,814],{},"With this setup, our email-sending code looks much cleaner and the email template looks much better as well.",[10,816,817,818,124,821,824],{},"We can even create a standardized email header and footer in ",[32,819,820],{},"_head.cfm",[32,822,823],{},"_foot.cfm"," and include those from the main email template:",[25,826,830],{"className":827,"code":828,"language":829,"meta":30,"style":30},"language-html shiki shiki-themes github-light github-dark","\u003Ccfinclude template=\".\u002F_head.cfm\" \u002F>\n\u003C!---\n\n        EMAIL BODY GOES HERE\n\n--->\n\u003Ccfinclude template=\".\u002F_foot_.cfm\" \u002F>\n","html",[32,831,832,852,857,863,868,872,877],{"__ignoreMap":30},[35,833,834,837,841,844,846,849],{"class":37,"line":38},[35,835,836],{"class":45},"\u003C",[35,838,840],{"class":839},"s7hpK","cfinclude",[35,842,843],{"class":41}," template",[35,845,56],{"class":45},[35,847,848],{"class":59},"\".\u002F_head.cfm\"",[35,850,851],{"class":45}," \u002F>\n",[35,853,854],{"class":37,"line":49},[35,855,856],{"class":99},"\u003C!---\n",[35,858,859],{"class":37,"line":66},[35,860,862],{"emptyLinePlaceholder":861},true,"\n",[35,864,865],{"class":37,"line":79},[35,866,867],{"class":99},"        EMAIL BODY GOES HERE\n",[35,869,870],{"class":37,"line":90},[35,871,862],{"emptyLinePlaceholder":861},[35,873,874],{"class":37,"line":96},[35,875,876],{"class":99},"--->\n",[35,878,879,881,883,885,887,890],{"class":37,"line":103},[35,880,836],{"class":45},[35,882,840],{"class":839},[35,884,843],{"class":41},[35,886,56],{"class":45},[35,888,889],{"class":59},"\".\u002F_foot_.cfm\"",[35,891,851],{"class":45},[17,893,895],{"id":894},"formatting-form-entries-in-an-email","Formatting Form Entries In An Email",[10,897,898,899,902],{},"For a quick get-er-done notification email, you can loop over ",[32,900,901],{},"form.fieldnames"," to dynamically output each form field:",[25,904,906],{"className":827,"code":905,"language":829,"meta":30,"style":30},"\u003Cp>\n\u003Ccfloop list=\"#form.fieldnames#\" index=\"field\">\n    \u003Cstrong>#encodeForHTML( field )#:\u003C\u002Fstrong>\n    #encodeForHTML( form[ field ] )#\u003Cbr>\n\u003C\u002Fcfloop>\n\u003C\u002Fp>\n",[32,907,908,918,943,957,967,976],{"__ignoreMap":30},[35,909,910,912,915],{"class":37,"line":38},[35,911,836],{"class":45},[35,913,10],{"class":914},"s9eBZ",[35,916,917],{"class":45},">\n",[35,919,920,922,925,928,930,933,936,938,941],{"class":37,"line":49},[35,921,836],{"class":45},[35,923,924],{"class":839},"cfloop",[35,926,927],{"class":41}," list",[35,929,56],{"class":45},[35,931,932],{"class":59},"\"#form.fieldnames#\"",[35,934,935],{"class":41}," index",[35,937,56],{"class":45},[35,939,940],{"class":59},"\"field\"",[35,942,917],{"class":45},[35,944,945,948,950,953,955],{"class":37,"line":66},[35,946,947],{"class":45},"    \u003C",[35,949,709],{"class":914},[35,951,952],{"class":45},">#encodeForHTML( field )#:\u003C\u002F",[35,954,709],{"class":914},[35,956,917],{"class":45},[35,958,959,962,965],{"class":37,"line":79},[35,960,961],{"class":45},"    #encodeForHTML( form[ field ] )#\u003C",[35,963,964],{"class":914},"br",[35,966,917],{"class":45},[35,968,969,972,974],{"class":37,"line":90},[35,970,971],{"class":45},"\u003C\u002F",[35,973,924],{"class":839},[35,975,917],{"class":45},[35,977,978,980,982],{"class":37,"line":96},[35,979,971],{"class":45},[35,981,10],{"class":914},[35,983,917],{"class":45},[10,985,986],{},"If you want high quality email templates, you might want something more like this:",[25,988,990],{"className":827,"code":989,"language":829,"meta":30,"style":30},"\u003Ch1>New form submission by #encodeForHTML( form.email )#\u003C\u002Fh1>\n\u003Cp>Message: #encodeForHTML( form.message )#\u003C\u002Fp>\n\u003Cp>\n    Name: #encodeForHTML( form.name )#\u003Cbr>\n    Email: #encodeForHTML( form.email )#\n\u003C\u002Fp>\n",[32,991,992,1006,1019,1027,1036,1041],{"__ignoreMap":30},[35,993,994,996,999,1002,1004],{"class":37,"line":38},[35,995,836],{"class":45},[35,997,998],{"class":914},"h1",[35,1000,1001],{"class":45},">New form submission by #encodeForHTML( form.email )#\u003C\u002F",[35,1003,998],{"class":914},[35,1005,917],{"class":45},[35,1007,1008,1010,1012,1015,1017],{"class":37,"line":49},[35,1009,836],{"class":45},[35,1011,10],{"class":914},[35,1013,1014],{"class":45},">Message: #encodeForHTML( form.message )#\u003C\u002F",[35,1016,10],{"class":914},[35,1018,917],{"class":45},[35,1020,1021,1023,1025],{"class":37,"line":66},[35,1022,836],{"class":45},[35,1024,10],{"class":914},[35,1026,917],{"class":45},[35,1028,1029,1032,1034],{"class":37,"line":79},[35,1030,1031],{"class":45},"    Name: #encodeForHTML( form.name )#\u003C",[35,1033,964],{"class":914},[35,1035,917],{"class":45},[35,1037,1038],{"class":37,"line":90},[35,1039,1040],{"class":45},"    Email: #encodeForHTML( form.email )#\n",[35,1042,1043,1045,1047],{"class":37,"line":96},[35,1044,971],{"class":45},[35,1046,10],{"class":914},[35,1048,917],{"class":45},[17,1050,1052],{"id":1051},"email-attachments","Email Attachments",[10,1054,1055],{},"Let's say we have a job application form with a place to upload a resume file:",[25,1057,1059],{"className":827,"code":1058,"language":829,"meta":30,"style":30},"\u003Cform enctype=\"multipart\u002Fform-data\" action=\"processApplication.cfm\">\n    \u003Clabel for=\"resumeFile\">Please add your resume in PDF format\u003C\u002Flabel>\n    \u003Cinput type=\"file\" id=\"resumeFile\" name=\"resume\">\n    \u003C!--- more form here --->\n\u003C\u002Fform>\n",[32,1060,1061,1086,1108,1140,1145],{"__ignoreMap":30},[35,1062,1063,1065,1068,1071,1073,1076,1079,1081,1084],{"class":37,"line":38},[35,1064,836],{"class":45},[35,1066,1067],{"class":914},"form",[35,1069,1070],{"class":41}," enctype",[35,1072,56],{"class":45},[35,1074,1075],{"class":59},"\"multipart\u002Fform-data\"",[35,1077,1078],{"class":41}," action",[35,1080,56],{"class":45},[35,1082,1083],{"class":59},"\"processApplication.cfm\"",[35,1085,917],{"class":45},[35,1087,1088,1090,1093,1096,1098,1101,1104,1106],{"class":37,"line":49},[35,1089,947],{"class":45},[35,1091,1092],{"class":914},"label",[35,1094,1095],{"class":41}," for",[35,1097,56],{"class":45},[35,1099,1100],{"class":59},"\"resumeFile\"",[35,1102,1103],{"class":45},">Please add your resume in PDF format\u003C\u002F",[35,1105,1092],{"class":914},[35,1107,917],{"class":45},[35,1109,1110,1112,1115,1118,1120,1123,1126,1128,1130,1133,1135,1138],{"class":37,"line":66},[35,1111,947],{"class":45},[35,1113,1114],{"class":914},"input",[35,1116,1117],{"class":41}," type",[35,1119,56],{"class":45},[35,1121,1122],{"class":59},"\"file\"",[35,1124,1125],{"class":41}," id",[35,1127,56],{"class":45},[35,1129,1100],{"class":59},[35,1131,1132],{"class":41}," name",[35,1134,56],{"class":45},[35,1136,1137],{"class":59},"\"resume\"",[35,1139,917],{"class":45},[35,1141,1142],{"class":37,"line":79},[35,1143,1144],{"class":99},"    \u003C!--- more form here --->\n",[35,1146,1147,1149,1151],{"class":37,"line":90},[35,1148,971],{"class":45},[35,1150,1067],{"class":914},[35,1152,917],{"class":45},[10,1154,1155,1156,1163],{},"Files sent via a POST request are stored in the server's temp directory. To attach the file to the email, we first need to save the file to a semi-permanent location so it doesn't get cleaned up (i.e. deleted) before the spooled email is sent out. The ",[247,1157,1160],{"href":1158,"rel":1159},"https:\u002F\u002Fcfdocs.org\u002Ffileupload",[251],[32,1161,1162],{},"fileUpload()"," function works well for this:",[25,1165,1167],{"className":27,"code":1166,"language":29,"meta":30,"style":30},"var uploadedFile = fileUpload( \"\u002Ffiles\u002Fresume\u002F\", \"resume\", \"application\u002Fpdf\", \"makeunique\" );\n",[32,1168,1169],{"__ignoreMap":30},[35,1170,1171,1174,1177,1179,1182,1185,1188,1190,1192,1194,1197,1199,1202],{"class":37,"line":38},[35,1172,1173],{"class":55},"var",[35,1175,1176],{"class":45}," uploadedFile ",[35,1178,56],{"class":55},[35,1180,1181],{"class":41}," fileUpload",[35,1183,1184],{"class":45},"( ",[35,1186,1187],{"class":59},"\"\u002Ffiles\u002Fresume\u002F\"",[35,1189,117],{"class":45},[35,1191,1137],{"class":59},[35,1193,117],{"class":45},[35,1195,1196],{"class":59},"\"application\u002Fpdf\"",[35,1198,117],{"class":45},[35,1200,1201],{"class":59},"\"makeunique\"",[35,1203,1204],{"class":45}," );\n",[10,1206,1207,1208,494],{},"Once we have the file saved we can attach the file to our email by using ",[247,1209,1212],{"href":1210,"rel":1211},"https:\u002F\u002Fcfdocs.org\u002Fcfmailparam",[251],[32,1213,1214],{},"cfmailparam()",[25,1216,1218],{"className":27,"code":1217,"language":29,"meta":30,"style":30},"cfmail(\n    to=\"admin@mysite.com\",\n    from=\"noreply@mysite.com\",\n    subject=\"New form submission from #form.name#\"\n){\n    \u002F\u002F Email body here\n    cfmailparam( file=\"#uploadedFile.serverfile#\" );\n}\n",[32,1219,1220,1226,1236,1246,1254,1258,1263,1278],{"__ignoreMap":30},[35,1221,1222,1224],{"class":37,"line":38},[35,1223,42],{"class":41},[35,1225,46],{"class":45},[35,1227,1228,1230,1232,1234],{"class":37,"line":49},[35,1229,52],{"class":45},[35,1231,56],{"class":55},[35,1233,60],{"class":59},[35,1235,63],{"class":45},[35,1237,1238,1240,1242,1244],{"class":37,"line":66},[35,1239,69],{"class":45},[35,1241,56],{"class":55},[35,1243,74],{"class":59},[35,1245,63],{"class":45},[35,1247,1248,1250,1252],{"class":37,"line":79},[35,1249,82],{"class":45},[35,1251,56],{"class":55},[35,1253,87],{"class":59},[35,1255,1256],{"class":37,"line":90},[35,1257,93],{"class":45},[35,1259,1260],{"class":37,"line":96},[35,1261,1262],{"class":99},"    \u002F\u002F Email body here\n",[35,1264,1265,1268,1271,1273,1276],{"class":37,"line":103},[35,1266,1267],{"class":41},"    cfmailparam",[35,1269,1270],{"class":45},"( file",[35,1272,56],{"class":55},[35,1274,1275],{"class":59},"\"#uploadedFile.serverfile#\"",[35,1277,1204],{"class":45},[35,1279,1280],{"class":37,"line":217},[35,1281,106],{"class":45},[17,1283,1285],{"id":1284},"conclusion","Conclusion",[10,1287,1288],{},"Emails are fantastic for form notifications. CFML is fantastic for emails. This guide ended up much longer than I expected - hopefully you enjoyed it and can use it as a handy reference for your first CF app!",[1290,1291,1292],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":30,"searchDepth":49,"depth":49,"links":1294},[1295,1296,1297,1298,1299,1300,1301,1302,1303],{"id":19,"depth":49,"text":20},{"id":109,"depth":49,"text":110},{"id":311,"depth":49,"text":312},{"id":386,"depth":49,"text":387},{"id":584,"depth":49,"text":585},{"id":715,"depth":49,"text":716},{"id":894,"depth":49,"text":895},{"id":1051,"depth":49,"text":1052},{"id":1284,"depth":49,"text":1285},"2019-08-14T16:13:57-04:00",false,"md",{},"\u002Fposts\u002Fforms-3-sending-emails",{"title":5,"description":12},"posts\u002Fforms-3-sending-emails",[1312,1313,1314,1315],"coldfusion","lucee","cfml","cfscript","NbBrl0iCURMnf8-7dQgxpPfgpy171Uxv1p8az0nRx4c",1790471527775]