From 5dd5a1c530960ecb6b2ce5fa35b561535c1242fe Mon Sep 17 00:00:00 2001 From: bbottema Date: Fri, 22 Jul 2016 20:35:42 +0200 Subject: [PATCH] Update documentation for 4.1.0 --- src/main/webapp/dist/app.bundle.js | 4 ++-- .../components/configuration/configuration.html | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/webapp/dist/app.bundle.js b/src/main/webapp/dist/app.bundle.js index f680a304e..dcc312992 100644 --- a/src/main/webapp/dist/app.bundle.js +++ b/src/main/webapp/dist/app.bundle.js @@ -1,4 +1,4 @@ -webpackJsonp([0],{0:function(e,n,r){"use strict";var t=r(1),a=r(160),i=r(4),o=r(280),s=r(301),l=r(323);r(358),i.enableProdMode(),a.bootstrap(l.SimpleJavaMailApp,[o.HTTP_PROVIDERS,s.ROUTER_PROVIDERS,i.provide(t.LocationStrategy,{useClass:t.HashLocationStrategy})])["catch"](function(e){return console.error(e)})},323:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(301),s=r(324),l=r(327),c=r(329),p=r(331),d=r(333),m=r(335),u=r(337),g=r(345);r(347);var h=function(){function e(e,n){this.router=e,this.el=n}return e.prototype.scrollToTop=function(){this.el.nativeElement.ownerDocument.body.scrollTop=0},e.prototype.ngAfterViewChecked=function(){return Prism.highlightAll()},e=t([i.Component({selector:"simple-java-mail-app",directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll],template:r(355),styles:[r(357)],encapsulation:i.ViewEncapsulation.None}),o.Routes([{path:"/about",component:l.About},{path:"/features",component:c.Features},{path:"/configuration",component:p.Configuration},{path:"/debugging",component:d.Debugging},{path:"/rfc",component:m.RfcCompliant},{path:"/download",component:u.Download},{path:"/contact",component:g.Contact},{path:"",component:l.About}]),a("design:paramtypes",[o.Router,i.ElementRef])],e)}();n.SimpleJavaMailApp=h},327:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(301),s=r(324),l=function(){function e(e){e.navigate(["/about"])}return e=t([i.Component({template:r(328),directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll]}),a("design:paramtypes",[o.Router])],e)}();n.About=l},328:function(e,n){e.exports='
\n\n

Simple Java Mail: Simple API, Complex Emails

\n\n
\n\n
\n
\n

Simple Java Mail is mailing library with a super clean API. It\'s the easiest to\n use Java mailing library in the world.

\n
\n

This library relieves you of having to deal with low level API such as MimeMessage, fuzzy try\n catch constructions, inner classes and other nonsense. You just want to send an email!

\n
\n

But don\'t let looks deceive you, this library does everything: it is a feature complete\n mailing library, yet it is small and lightweight. It is fully RFC compliant and looks good in all\n email clients.

\n
\n

It\'s also the only java mailing library in the world that can send through authenticated SOCKS proxy.

\n
\n\n
\n
// Everything together:\n\nConfigLoader.loadProperties("simplejavamail.properties"); // optional default\nConfigLoader.loadProperties("overrides.properties"); // optional extra\n\nEmail email = new Email();\n\nemail.addRecipient("lollypop", "lolly.pop@somemail.com", Message.RecipientType.TO);\nemail.setReplyToAddress("lollypop", "lolly.pop@othermail.com");\nemail.addRecipient("C. Cane", "candycane@candyshop.org", Message.RecipientType.TO);\nemail.addRecipient("C. Bo", "chocobo@candyshop.org", Message.RecipientType.CC);\nemail.setSubject("hey");\nemail.setText("We should meet up! ;)");\nemail.setTextHTML("<img src='cid:wink1'><b>We should meet up!</b><img src='cid:wink2'>");\nemail.addEmbeddedImage("wink1", imageByteArray, "image/png");\nemail.addEmbeddedImage("wink2", imageDatesource);\nemail.addAttachment("invitation", pdfByteArray, "application/pdf");\nemail.addAttachment("dresscode", odfDatasource);\n\nemail.signWithDomainKey(privateKeyData, "somemail.com", "selector");\n\nnew Mailer(\n		new ServerConfig("smtp.host.com", 587, "user@host.com", "password"),\n		TransportStrategy.SMTP_TLS,\n		new ProxyConfig("socksproxy.host.com", 1080, "proxy user", "proxy password")\n).sendMail(email);\n
\n
\n
\n\n\n §\n

Getting started

\n\n
\n
\n

Simple Java Mail is a thin layer on top of Oracle\'s SMTP JavaMail API. For logging purposes, SLF4J is used so\n you can use whatever\n logging framework you prefer.

\n

Once the dependencies are set up, simply copy the above examples and start mailing!

\n

\n Show Examples\n API\n Javadoc\n

\n
\n
\n
\n'},329:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(324),s=r(301),l=function(){function e(){o.SimplePageScrollConfig.defaultScrollOffset=0}return e=t([i.Component({template:r(330),directives:[s.ROUTER_DIRECTIVES,o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Features=l},330:function(e,n){e.exports='
\r\n\r\n

Simple Java Mail Features

\r\n\r\n
\r\n

\r\n Creating and sending emails is very simple with Simple Java Mail; you don\'t need to know about the mailing RFC, MimeMessage or any other low\r\n level javax.mail API. No anonymous inner classes needed and no large frameworks needed nor XML.\r\n

\r\n\r\n

\r\n On top of that, Simple Java Mail will do some basic validation checks so that your email is always populated with enough data. It even verifies\r\n email addresses against RFC-2822 using the only complete rfc2822 validator in java in the world.\r\n

\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n

Roadmap

\r\n
    \r\n
  • Asynchronous (threaded) mailing for batches
  • \r\n
\r\n
\r\n\r\n §\r\n

Basic usage

\r\n\r\n
\r\n
\r\n

\r\n Simply create an Email, populate it with your data, create a Mailer and send the Email\r\n instance. The mailer can be created with your own Session instance as well.\r\n

\r\n

\r\n A Mailer instance is reusable.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.setFromAddress("Michel Baker", "m.baker@mbakery.com");\r\nemail.addRecipient("mom", "jean.baker@hotmail.com", RecipientType.TO);\r\nemail.addRecipient("dad", "StevenOakly1963@hotmail.com", RecipientType.TO);\r\nemail.setSubject("My Bakery is finally open!");\r\nemail.setText("Mom, Dad. We did the opening ceremony of our bakery!!!");\r\n\r\nnew Mailer("server", "25", "username", "password").sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Using the fluent API with the Builder pattern

\r\n\r\n
\r\n
\r\n

\r\n The previous example becomes even more succinct by using the fluent API.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new EmailBuilder()\r\n    .from("Michel Baker", "m.baker@mbakery.com")\r\n    .to("mom", "jean.baker@hotmail.com")\r\n    .to("dad", "StevenOakly1963@hotmail.com")\r\n    .subject("My Bakery is finally open!")\r\n    .text("Mom, Dad. We did the opening ceremony of our bakery!!!")\r\n    .build();\r\n\r\nnew Mailer("server", "25", "username", "password").sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Configure once, reuse many times

\r\n\r\n
\r\n
\r\n

\r\n You can preconfigure a Mailer and use it many times.\r\n

\r\n
\r\n\r\n
\r\n
Mailer inhouseMailer = new Mailer("server", "25", "username", "password");\r\n\r\ninhouseMailer.sendMail(email);\r\ninhouseMailer.sendMail(anotherEmail);\r\n
\r\n Or as preconfigured Spring bean:\r\n
\r\n<bean id="inhouseMailer" class="org.codemonkey.simplejavamail.Mailer">\r\n   <constructor-arg value="server" />\r\n   <constructor-arg value="25" />\r\n   <constructor-arg value="username" />\r\n   <constructor-arg value="password" />\r\n</bean>\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Asynchronous parallel batch sending

\r\n\r\n
\r\n
\r\n

\r\n The default mode is to send emails synchronously, blocking execution until the email was processed completely and the STMP server send a\r\n succesful result.\r\n

\r\n

\r\n You can also sent anyschronously in parallel or batches, or simply send in a fire-and-forget way. If an authenticated proxy is used, the proxy briding server is kept alive until the last email has been sent.

\r\n

\r\n Depending on the SMTP server (and proxy server if used) this can greatly influence how fast emails are sent.\r\n

\r\n
\r\n\r\n
\r\n
mailer.sendMail(email, true);\r\n
\r\n

Refer to the configuration section\r\n on how to set the thread pool size default.

\r\n
\r\n
\r\n\r\n\r\n §\r\n

Sending with your own Session instance

\r\n\r\n
\r\n
\r\n

\r\n If you prefer to use your own preconfigured Session instance and still benefit from Simple Java Mail, you can!\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n...\r\n\r\nnew Mailer(yourSession).sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Sending with SSL and TLS

\r\n\r\n
\r\n
\r\n

\r\n Activating SSL or TLS is super easy. Just use the appropriate TransportStrategy enum.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nmailer.sendMail(email, TransportStrategy.SMTP_PLAIN); // default if omitted\r\nmailer.sendMail(email, TransportStrategy.SMTP_SSL);\r\nmailer.sendMail(email, TransportStrategy.SMTP_TLS);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

SSL and TLS with Google mail

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example of SSL and TLS using gMail.\r\n

\r\n

\r\n If you have two-factor login turned on, you need to generate an application\r\n specific\r\n password\r\n from your Google account.\r\n

\r\n
\r\n\r\n
\r\n
new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);\r\nnew Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);\r\nnew Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Adding attachments

\r\n\r\n
\r\n
\r\n

\r\n You can add attachments very easily, but you\'ll have to provide the data yourself. Simple Java Mail accepts byte[]\r\n and DataSource objects.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addAttachment("dresscode.txt", new ByteArrayDataSource("Black Tie Optional", "text/plain"));\r\nemail.addAttachment("location.txt", "On the moon!".getBytes(Charset.defaultCharset()), "text/plain");\r\n\r\n// ofcourse it can be anything: a pdf, doc, image, csv or anything else\r\n\r\nemail.addAttachment("invitation.pdf", new FileDataSource("invitation_v8.3.pdf"));\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Embedding images

\r\n\r\n
\r\n
\r\n

\r\n Embedding images is simple, but you have to add the placeholders in the HTML yourself.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addEmbeddedImage("smiley", new FileDataSource("smiley.jpg"));\r\n// this example is included in the demo package in MailTestApp.java\r\nString base64String = "iVBORw0KGgoAAAANSUhEUgAAA ...snip";\r\nemail.addEmbeddedImage("thumbsup", parseBase64Binary(base64String), "image/png");\r\n\r\n// the corresponding HTML should contain the placeholders\r\n<p>Let's go!</p><img src='cid:thumbsup'><br/>\r\n<p>Smile!</p><img src='cid:smiley'>\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Setting custom headers

\r\n\r\n
\r\n
\r\n

\r\n Sometimes you need extra headers in your email because your email server, recipient server or your email client needs it. Or perhaps you have\r\n a proxy or monitoring setup in between mail servers. Whatever the case, adding headers is easy.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addHeader("X-Priority", 2);\r\nemail.addHeader("X-MC-GoogleAnalyticsCampaign", "halloween_sale");\r\nemail.addHeader("X-MEETUP-RECIP-ID", "71415272");\r\nemail.addHeader("X-my-custom-header", "foo");\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Setting custom properties on the internal Session

\r\n\r\n
\r\n
\r\n

\r\n In case you need to modify the internal Session object itself, because you need a tailored configuration that is supported by the underlying\r\n javax.mail, that too is very easy.\r\n

\r\n
\r\n\r\n
\r\n
Properties props = new Properties();\r\nprops.setProperty("mail.smtp.timeout", 30 * 1000);\r\nprops.setProperty("mail.smtp.connectiontimeout", 10 * 1000);\r\n\r\nMailer mailer = new Mailer();\r\nmailer.applyProperties(props);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Direct access to the internal Session

\r\n\r\n
\r\n
\r\n

\r\n For emergencies, you can also get a hold of the internal Session instance itself. You should never need this however and if\r\n you do it means Simple Java Mail failed to simplify the configuration process for you. Please let us know how we can help alleviate\r\n this need.\r\n

\r\n
\r\n\r\n
\r\n
Mailer mailer = new Mailer();\r\n\r\nSession session = mailer.getSession();\r\n// do your thing with session\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Signing emails with DKIM

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail also supports signing with DKIM\r\n domain keys. It uses java-utils-mail-dkim (dependency packaged along) to\r\n perform the DNS DKIM record check on the given domain.\r\n

\r\n
\r\n\r\n
\r\n
Email signedEmail = new Email();\r\n\r\nsignedEmail.signWithDomainKey(\r\n   privateKey byte[] / File / InputStream,\r\n   "your_domain.org",\r\n   "your_selector");\r\n\r\nnew Mailer().sendMail(signedEmail);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Validating Email Addresses

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail can validate your email addresses. It\'s not just a simple regex check, but a complete and robust full validation against RFC-2822. It does this by including email-rfc2822-validator in the library.\r\n

\r\n
\r\n\r\n
\r\n
EmailAddressValidator.isValid("your_address@domain.com",\r\n   EmailAddressCriteria.RFC_COMPLIANT);\r\n\r\n// or, fine-tuned to be less strict:\r\nEmailAddressValidator.isValid("your_address@domain.com",\r\n   of(ALLOW_QUOTED_IDENTIFIERS, ALLOW_PARENS_IN_LOCALPART));\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Generating a MimeMessage from an Email

\r\n\r\n
\r\n
\r\n

\r\n If for some reason you need a MimeMessage, you can still benefit from the easy API Simple Java Mail offers. Behold.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email()\r\n// populate email, the builder is great for this\r\n\r\n// then\r\nMimeMessage message = Mailer.produceMimeMessage(email);\r\n// or\r\nMimeMessage message = Mailer.produceMimeMessage(email, yourSession);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Generating an Email from a MimeMessage

\r\n\r\n
\r\n
\r\n

\r\n If you already have a MimeMessage, you can easily convert it into a ready-to-use Email instance, complete with embedded images and attachment\r\n intact.\r\n

\r\n
\r\n\r\n
\r\n
MimeMessage mimeMessage = ...;\r\nEmail email = new Email(mimeMessage);\r\n\r\nnew Mailer().sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Send using a proxy

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail supports sending emails through a proxy. It is also the only java mailing framework in the world that supports sending emails\r\n through authenticated proxies.\r\n

\r\n

\r\n The reason for this is that the underlying native Javax Mail framework supports\r\n anonymous SOCKS5 proxies, but not authenticated proxies.\r\n

\r\n

\r\n To make this work with authentication, Simple Java Mail uses a trick: it sets up a temporary anonymous proxy server for Javax Mail to connect\r\n to and then relays the connection to the target proxy performing the authentication outside of Javax Mail.\r\n

\r\n

\r\n This temporary server is referred to as the Proxy Bridging Server.\r\n

\r\n
\r\n\r\n
\r\n
// anonymous proxy\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080));\r\n\r\n// authenticated proxy\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080, "proxy username", "proxy password"));\r\n
\r\n

Refer to the configuration section\r\n on how to set proxy server defaults and the port on which the proxy bridge runs.

\r\n
\r\n
\r\n\r\n
\r\n'},331:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(324),s=function(){function e(){}return e=t([i.Component({template:r(332),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Configuration=s},332:function(e,n){e.exports='
\r\n\r\n

Configuration

\r\n\r\n
\r\n

\r\n Simple Java Mail provides full configuration through programmatic API as well as system variables, environment\r\n variables\r\n and properties files. For each level of configuration detail, a simple constructor is available as well.\r\n

\r\n

\r\n The Java API and config files complement each other; the more you configure in a properties file, the less you can provide through the\r\n programmatic API. If you provide the overlapping configuration, the programmatic API takes priority, overriding system and environment values,\r\n overriding property values.\r\n

\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n §\r\n

Programmatic API

\r\n\r\n
\r\n
\r\n

\r\n Everything can be configured through the java API.\r\n

\r\n
\r\n\r\n
\r\n
// the simplest constructor, this is how the library started!\r\nnew Mailer("smtp.host.com", 25, "username", "password");\r\n
\r\n
\r\n// the same as the basic constructor, but with a config object\r\nnew Mailer(new ServerConfig("smtp.host.com", 25, "username", "password"));\r\n\r\n// you can even leave out some details for an anonymous SMTP server\r\nnew Mailer(new ServerConfig("smtp.host.com", 25));\r\n\r\n// adding the transport strategy...\r\nnew Mailer("smtp.host.com", 587, "username", "password", TransportStrategy.SMTP_TLS);\r\nnew Mailer(serverConfig, TransportStrategy.SMTP_TLS);\r\n\r\n// or instead adding anonymous proxy configuration\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080));\r\n\r\n// or authenticated proxy\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080, "proxy username", "proxy password"));\r\n
\r\n
\r\n// anonymous smtp + anonymous proxy + default SMTP_PLAIN strategy\r\nnew Mailer(new ServerConfig("smtp.host.com", 25), new ProxyConfig("proxy.host.com", 1080));\r\n
\r\n
\r\n// configure everything!\r\nnew Mailer(\r\n		new ServerConfig("smtp.host.com", 587, "user@host.com", "password"),\r\n		TransportStrategy.SMTP_TLS,\r\n		new ProxyConfig("socksproxy.host.com", 1080, "proxy user", "proxy password")\r\n).sendMail(email);\r\n
\r\n
\r\n// preconfigured Session?\r\nnew Mailer(session);\r\n\r\n// preconfigured but you need anonymous proxy?\r\nnew Mailer(session, new ProxyConfig("proxy.host.com", 1080));\r\n\r\n// preconfigured but you need authenticated proxy?\r\nnew Mailer(session, new ProxyConfig("proxy.host.com", 1080, "proxy user", "proxy password"));\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Other settings

\r\n\r\n
\r\n
\r\n

\r\n Aside from the constructors, there are a few other settings.\r\n

\r\n
\r\n\r\n
\r\n
// make javax.mail produce more logging\r\nmailer.setDebug(true);\r\n
\r\n
\r\n// change email validation strategy, or deactivate completely\r\nmailer.setEmailAddressCriteria(EmailAddressCriteria.DEFAULT);\r\nmailer.setEmailAddressCriteria(EmailAddressCriteria.RFC_COMPLIANT);\r\nmailer.setEmailAddressCriteria(EnumSet\r\n       .of(ALLOW_QUOTED_IDENTIFIERS, ALLOW_PARENS_IN_LOCALPART));\r\nmailer.setEmailAddressCriteria(null);\r\n
\r\n
\r\n// change SOCKS5 bridge port in case of authenticated proxy\r\nProxyconfig proxyConfig = new ProxyConfig(...);\r\nproxyConfig.setProxyBridgePort(1081); // is always localhost\r\n
\r\n
\r\n// change maximum number of threads when sending asynchronously\r\nmailer.setThreadPoolSize(20);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Properties files

\r\n\r\n
\r\n
\r\n

\r\n With properties files you can define defaults and overrides. You can also provide overriding value by defining system variables.\r\n

\r\n

\r\n Simple Java Mail will automatically load properties from simplejavamail.properties, if available on the classpath.\r\n Alternatively, you can manually load additional properties files in a number of ways.\r\n

\r\n

\r\n Properties are loaded in order of priority from high to low:\r\n

\r\n
    \r\n
  1. Programmatic values
  2. \r\n
  3. System variables
  4. \r\n
  5. Environment variables
  6. \r\n
  7. Properties from config files
  8. \r\n
\r\n
\r\n\r\n
\r\n
ConfigLoader.loadProperties("overrides-on-classpath.properties", /* addProperties = */ true);\r\nConfigLoader.loadProperties(new File("d:/replace-from-environment.properties"), /* addProperties = */ false);\r\nConfigLoader.loadProperties(usingMyOwnInputStream, addProperties);\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Available properties

\r\n\r\n
\r\n
\r\n

\r\n The default recipients are like admin features, where you notify a person whenever a mail goes out from a certain mailer.\r\n

\r\n
\r\n\r\n
\r\n
simplejavamail.javaxmail.debug=true\r\nsimplejavamail.transportstrategy=SMTP_SSL\r\nsimplejavamail.smtp.host=smtp.default.com\r\nsimplejavamail.smtp.port=25\r\nsimplejavamail.smtp.username=username\r\nsimplejavamail.smtp.password=password\r\nsimplejavamail.proxy.host=proxy.default.com\r\nsimplejavamail.proxy.port=1080\r\nsimplejavamail.proxy.username=username proxy\r\nsimplejavamail.proxy.password=password proxy\r\nsimplejavamail.proxy.socks5bridge.port=1081\r\nsimplejavamail.defaults.subject=Sweet News\r\nsimplejavamail.defaults.from.name=From Default\r\nsimplejavamail.defaults.from.address=from@default.com\r\nsimplejavamail.defaults.replyto.name=Reply-To Default\r\nsimplejavamail.defaults.replyto.address=reply-to@default.com\r\nsimplejavamail.defaults.to.name=To Default\r\nsimplejavamail.defaults.to.address=to@default.com\r\nsimplejavamail.defaults.cc.name=CC Default\r\nsimplejavamail.defaults.cc.address=cc@default.com\r\nsimplejavamail.defaults.bcc.name=BCC Default\r\nsimplejavamail.defaults.bcc.address=bcc@default.com\r\nsimplejavamail.defaults.poolsize=10\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Combining both for multiple environments

\r\n\r\n
\r\n
\r\n

\r\n Let\'s set up configuration for a test, acceptance and production environment.\r\n

\r\n

Properties for the environments

\r\n
\r\n
\r\n
/* global default properties (simplejavamail.properties on classpath) */\r\n\r\n    // anonoymous SMTP inside \'safe\' DMZ\r\n    simplejavamail.smtp.host=dmz.smtp.candyshop.com\r\n    simplejavamail.smtp.port=25\r\n\r\n    // default sender and reply-to address\r\n    simplejavamail.defaults.from.name=The Candy App\r\n    simplejavamail.defaults.from.address=candyapp@candystore.com\r\n    simplejavamail.defaults.replyto.name=Candystore Helpdesk\r\n    simplejavamail.defaults.replyto.address=helpdesk@candystore.com\r\n
\r\n
/* overrides from TEST and UAT .../config/candystore/simplejavamail.properties */\r\n\r\n    // always send a copy to test archive\r\n    simplejavamail.defaults.bcc.name=Archive TST UAT\r\n    simplejavamail.defaults.bcc.address=test-archive@candyshop.com\r\n
\r\n
/* overrides from PRODUCTION .../config/candystore/simplejavamail.properties */\r\n\r\n    // always send a copy to production archive\r\n    simplejavamail.defaults.bcc.name=Archive PRODUCTION\r\n    simplejavamail.defaults.bcc.address=prod-archive@candyshop.com\r\n\r\n    // smtp server in production is protected\r\n    simplejavamail.smtp.username=creamcake\r\n    simplejavamail.smtp.password=crusty_l0llyp0p\r\n\r\n    // sending mails in production must go through proxy\r\n    simplejavamail.proxy.host=proxy.candyshop.com\r\n    simplejavamail.proxy.port=1080\r\n    simplejavamail.proxy.username=candyman\r\n    simplejavamail.proxy.password=I has the sugarcanes!!1!\r\n
\r\n
\r\n\r\n

Now for the programmatic part

\r\n\r\n
\r\n
// simplejavamail.properties is automatically loaded\r\n\r\n// assume that every environment provides its own property file\r\nConfigLoader.loadProperties(new File(".../config/candystore/simplejavamail.properties"));\r\n
\r\n
\r\n// see if we need to do some specific override for some reason\r\nif (someSpecialCondition) {\r\n  ConfigLoader.loadProperties("special-override.properties", true);\r\n}\r\n
\r\n
\r\n// or maybe we want to ditch all defaults and trust someone else\'s config completely\r\nif (ditchOwnAndTrustOtherSource) {\r\n  ConfigLoader.loadProperties(someFileOrInputSource, false);\r\n}\r\n
\r\n
\r\n// maybe the config service has something?\r\nConfigLoader.loadProperties(socket.getInpuStream(), true);\r\n
\r\n\r\n

\r\n Maybe we want to connect slightly different for some reason:\r\n

\r\n\r\n
// override only the port and connection type, leave everything else to config files\r\nMailer mailer = new Mailer(new ServerConfig(null, 587), TransportStrategy.SMTP_TLS);\r\n
\r\n
\r\n
\r\n\r\n
\r\n'; -},333:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(324),s=function(){function e(){}return e=t([i.Component({template:r(334),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Debugging=s},334:function(e,n){e.exports='
\r\n\r\n

Logging & Debugging

\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n §\r\n

Enable javax.mail debug logging

\r\n\r\n
\r\n
\r\n

\r\n By default javax.mail\'s debug logging is turned off, but you can turn it on for more diagnostic info. All this does is enabling debug mode on\r\n the internal Session instance.\r\n

\r\n
\r\n\r\n
\r\n
Mailer mailer = new Mailer(...);\r\nmailer.setDebug(true);\r\n\r\n// or\r\nmailer.getSession().setDebug(true);\r\n\r\n// or\r\nyourSession.setDebug(true);\r\nMailer mailer = new Mailer(yourSession);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Catching exceptions

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail throws a MailException if something goes wrong and logs these by default using SLF4J. This\r\n includes checked exceptions thrown by underlying frameworks. An exception might be thrown when:\r\n

\r\n
    \r\n
  1. 1. sending an email
  2. \r\n
  3. 2. signing an email with DKIM
  4. \r\n
  5. 3. converting from MimeMessage to Email
  6. \r\n
\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\ntry {\r\n   new Mailer().sendMail(email);\r\n} catch (MailException e) {\r\n   // handle the exception (but it is already logged through SLF4J)\r\n}\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Logging output

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail uses SLF4J to log, which means you can use any logging framework you like that supports\r\n it. Also read this excellent summary of how to configure\r\n slf4j with\r\n log4j2.\r\n

\r\n

\r\n There are three parts of Simple Java Mail that may produce logging: "org.codemonkey.simplejavamail", "socks5bridge" and\r\n "org.codemonkey.simplejavamail.internal.socks". The latter two are for the proxy bridge that is used for authenticated proxy connections .\r\n

\r\n

\r\n If you wish to know where and how the properties are loaded, you can increase logging for "org.simplejavamail.internal.util.ConfigLoader".\r\n This will tell you which properties are loaded by API and which from config file and which were properties are without values.\r\n

\r\n

\r\n When using maven, Simple Java Mail provides some default XML configuration for log4j2, but you can easily switch to something else. Below are\r\n some examples.\r\n

\r\n
\r\n
\r\n\r\n §\r\n

Example with log4j12

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for log4j12, make sure you have the\r\n slf4j-to-log4j impl included on the classpath as well as log4j12 itself and the log4j.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">\r\n<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">\r\n\r\n    <appender name="console" class="org.apache.log4j.ConsoleAppender">\r\n        <layout class="org.apache.log4j.PatternLayout">\r\n            <param name="ConversionPattern" value="%d [%t] %-5p %c{1} - %m%n"/>\r\n        </layout>\r\n    </appender>\r\n    <appender name="simpleConsole" class="org.apache.log4j.ConsoleAppender">\r\n        <layout class="org.apache.log4j.PatternLayout">\r\n            <param name="ConversionPattern" value="%d Simple Java Mail SOCKS5 bridge - %p %m%n"/>\r\n        </layout>\r\n    </appender>\r\n\r\n    <logger name="org.codemonkey.simplejavamail">\r\n        <level value="trace"/>\r\n        <appender-ref ref="console"/>\r\n    </logger\r\n    <!-- in case you're using authenticated proxy -->\r\n    <logger name="socks5bridge" additivity="false">\r\n        <level value="info"/>\r\n        <appender-ref ref="simpleConsole"/>\r\n    </logger>\r\n    <logger name="org.codemonkey.simplejavamail.internal.socks">\r\n        <level value="warn"/>\r\n    </logger>\r\n\r\n</log4j:configuration>\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Example with log4j2

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for log4j2, make sure you have the log4j-slf4j-impl impl\r\n included on the classpath as well as log4j2 itself and the log4j2.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<configuration status="OFF">\r\n    <appenders>\r\n        <Console name="console" target="SYSTEM_OUT">\r\n            <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %c{1} - %msg%n" />\r\n        </Console>\r\n        <Console name="simpleConsole" target="SYSTEM_OUT">\r\n            <PatternLayout pattern="%d Simple Java Mail SOCKS5 bridge - %level %m%n" />\r\n        </Console>\r\n    </appenders>\r\n    <Loggers>\r\n        <Logger name="org.codemonkey.simplejavamail" level="trace"/>\r\n        <!-- in case you're using authenticated proxy -->\r\n        <Logger name="socks5bridge" level="info" additivity="false">\r\n            <AppenderRef ref="simpleConsole" />\r\n        </Logger>\r\n        <Logger name="org.codemonkey.simplejavamail.internal.socks" level="warn"/>\r\n\r\n        <Root level="warn">\r\n            <AppenderRef ref="console" />\r\n        </Root>\r\n    </Loggers>\r\n</configuration>\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Example with logback

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for logback, make sure you have the logback-classic included on the\r\n classpath as well as logback-core and the logback.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<configuration>\r\n    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">\r\n        <encoder>\r\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %c{1} - %msg%n</pattern>\r\n        </encoder>\r\n    </appender>\r\n    <appender name="simpleConsole" class="ch.qos.logback.core.ConsoleAppender">\r\n        <encoder>\r\n            <pattern>%d Simple Java Mail SOCKS5 bridge - %level %m%n</pattern>\r\n        </encoder>\r\n    </appender>\r\n\r\n    <logger name="org.codemonkey.simplejavamail" level="TRACE"/>\r\n    <!-- in case you're using authenticated proxy -->\r\n    <logger name="socks5bridge" level="INFO" additivity="false">\r\n        <appender-ref ref="simpleConsole" />\r\n    </logger>\r\n    <logger name="org.codemonkey.simplejavamail.internal.socks" level="WARN"/>\r\n\r\n    <root level="WARN">\r\n        <appender-ref ref="console" />\r\n    </root>\r\n</configuration>\r\n
\r\n
\r\n
\r\n\r\n
\r\n'},335:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(324),s=function(){function e(){o.SimplePageScrollConfig.defaultScrollOffset=0}return e=t([i.Component({template:r(336),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.RfcCompliant=s},336:function(e,n){e.exports='
\n\n

Simple Java Mail is fully RFC compliant

\n\n
\n \n
\n\n §\n

Why RFC compliancy matters

\n\n
\n
\n

\n One thing that plagues other smaller libraries is the lack of true RFC compliance. Though fine for simple mails,\n this becomes a testing nightmare if for example you need to send an HTML mail (with text fall-back?) using both\n attachment and embedded images.\n

\n

\n The problem becomes evident when testing the mail in various e-mail clients (desktop, web based, mobile) by the\n fact that the e-mails will be displayed completely inconsistent and sporadic. Symptoms include:\n

\n
    \n
  • not seeing embedded images, or
  • \n
  • embedded images are displayed as attachments,
  • \n
  • not seeing the HTML version if a text version is present,
  • \n
  • not seeing the text version if a HTML version is present,
  • \n
  • not seeing attachments,
  • \n
  • attachments aren\'t handled correctly according to mime type, or
  • \n
  • header information is missing or incorrect so you can\'t see how long a download will take,
  • \n
  • from/to addresses being malformed (like missing the<name> part in <name> adres@domain.com)\n
  • \n
\n\n

The research has been done and Simple Java Mail is RFC compliant for simple to complex mails. Furthermore, it\n has been tested in a range of known clients such as Outlook, Thunderbird, Gmail, Hotmail, Android, iPhone\n etc.

\n
\n
\n\n\n §\n

How is Simple Java Mail RFC compliant?

\n\n
\n
\n

Simple Java Mail is in two ways RFC (MIME) compliant:

\n
    \n
  1. It is built on top of JavaMail, which is java\'s\n standard email library used by all other mail libraries. JavaMail itself implements various RFC\'s (including\n those for SMTP, POP3, IMAP etc).\n
  2. \n
  3. What makes Simple Java Mail unique is that it combines all the RFC\'s implemented by JavaMail in the correct\n way that works in all email clients. Where all other popular mailing libraries let you figure out the low\n level details of this through MimeMessage, BodyPart, MimeMultipart etc. as described in the individual RFC\'s,\n Simple Java Mail takes care of this for you and hides all this behind a super clean API. Now you can focus on\n the content of the email, rather than email\'s technical low level structure.\n
  4. \n
\n
\n
\n
\n'},337:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(301),s=r(324),l=r(338),c=function(){function e(){}return e=t([i.Component({template:r(344),directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll,l.MavenDependencyDisplay]}),a("design:paramtypes",[])],e)}();n.Download=c},338:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(339),s=r(342).sprintf,l=function(){function e(e){this.mavenSearchService=e}return e.prototype.ngOnInit=function(){var n=this;this.output=s(e.DISPLAY_TEMPLATE,this.groupId,this.artifact,"..."),this.mavenSearchService.fetchLatestVersion(this.groupId,this.artifact).subscribe(function(r){return n.output=s(e.DISPLAY_TEMPLATE,n.groupId,n.artifact,r)})},e.DISPLAY_TEMPLATE='
<dependency>\n	<groupId>%s</groupId>\n	<artifactId>%s</artifactId>\n	<version>%s</version>\n</dependency>
',t([i.Input(),a("design:type",String)],e.prototype,"groupId",void 0),t([i.Input(),a("design:type",String)],e.prototype,"artifact",void 0),e=t([i.Component({selector:"maven-dependency-display",template:r(343),providers:[o.MavenSearchService]}),a("design:paramtypes",[o.MavenSearchService])],e)}();n.MavenDependencyDisplay=l},339:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=r(280);r(340);var s=r(37),l=r(342).sprintf,c=function(){function e(e){this.http=e,this.latestVersion=new s.Subject}return e.prototype.fetchLatestVersion=function(n,r){var t=this;return this.http.get(l(e.endpoint,n,r)).map(function(e){return e.json().value.replace("v","")}).subscribe(function(e){return t.latestVersion.next(e)}),this.latestVersion},e.endpoint="https://img.shields.io/maven-central/v/%s/%s.json",e=t([i.Injectable(),a("design:paramtypes",[o.Http])],e)}();n.MavenSearchService=c},340:function(e,n,r){"use strict";var t=r(38),a=r(341);t.Observable.prototype.map=a.map},341:function(e,n,r){"use strict";function t(e,n){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return this.lift(new o(e,n))}var a=this&&this.__extends||function(e,n){function r(){this.constructor=e}for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t]);e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)},i=r(43);n.map=t;var o=function(){function e(e,n){this.project=e,this.thisArg=n}return e.prototype.call=function(e,n){return n._subscribe(new s(e,this.project,this.thisArg))},e}(),s=function(e){function n(n,r,t){e.call(this,n),this.project=r,this.count=0,this.thisArg=t||this}return a(n,e),n.prototype._next=function(e){var n;try{n=this.project.call(this.thisArg,e,this.count++)}catch(r){return void this.destination.error(r)}this.destination.next(n)},n}(i.Subscriber)},343:function(e,n){e.exports='
\r\n'},344:function(e,n){e.exports='
\r\n\r\n

Download Simple Java Mail

\r\n\r\n
\r\n
\r\n

Simple Java Mail is open source, and you can use it for free in any personal or commercial product under the Apache\r\n v2 license.

\r\n\r\n

Simple Java Mail is available in Maven central as dependency and you can also download the jar distribution directly from there.

\r\n\r\n \r\n\r\n \r\n Download sources, javadoc, distribution directly from Maven Central\r\n
\r\n
\r\n\r\n
\r\n Help and contact
\r\n Release information about the latest version
\r\n Complete changelist\r\n
\r\n\r\n\r\n

License

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail is released under Apache v2 license\r\n

\r\n

In short this means you can do whatever you want as long as you\r\n include the same license, the original (possibly ammended) notice, copyright and that state your changes.

\r\n
\r\n
\r\n\r\n\r\n

Repository

\r\n\r\n
\r\n
\r\n

You can visit the repository Simple Java Mail on gitHub.

\r\n
\r\n
\r\n
\r\n'},345:function(e,n,r){"use strict";var t=this&&this.__decorate||function(e,n,r,t){var a,i=arguments.length,o=3>i?n:null===t?t=Object.getOwnPropertyDescriptor(n,r):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,r,t);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,r,o):a(n,r))||o);return i>3&&o&&Object.defineProperty(n,r,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=r(4),o=function(){function e(){}return e=t([i.Component({template:r(346)}),a("design:paramtypes",[])],e)}();n.Contact=o},346:function(e,n){e.exports='
\n\n

Contact

\n\n

Get help, request features, post bugs

\n\n
\n
\n

Simple Java Mail is a robust library, but there\'s always room for improvement: suggest anything you can think of!

\n\n

The Simple Java Mail GitHub repository and the issue tracker are used to discuss feature requests and issues.\n

\n\n

You can also refer to the API documentation.

\n\n

If you need more general help, you\'ll usually get an answer by posting a question on StackOverflow. And you can always post an issue in the issue tracker, I get an email as soon as something\n gets posted.\n

\n\n \n
\n
\n\n\n

About myself

\n\n
\n
\n

You can find more about me on bennybottema.com. At the bottom of the page you can shoot me an email\n if you want a quick answer.

\n
\n
\n
\n'},355:function(e,n,r){e.exports='\n Fork me on GitHub\n\n\n
\n

Simple Java Mail

\n

Simple API, Complex Emails

\n\n
\n
\n
Email email = new EmailBuilder()\n    .from("lollypop", "lolly.pop@pretzelfun.com")\n    .to("C. Cane", "candycane@candyshop.org")\n    .to("C. Bo", "chocobo@candyshop.org")\n    .subject("hey")\n    .text("We should meet up! ;)")\n    .build();\n\nnew Mailer().sendMail(email);\n
\n Download Simple Java Mail\n
\n
\n
\n\n\n\n
\n \n
\n\n\n\n'},356:function(e,n){e.exports="data:image/png;base64,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"; +webpackJsonp([0],{0:function(e,n,t){"use strict";var r=t(1),a=t(160),i=t(4),o=t(280),s=t(301),l=t(323);t(358),i.enableProdMode(),a.bootstrap(l.SimpleJavaMailApp,[o.HTTP_PROVIDERS,s.ROUTER_PROVIDERS,i.provide(r.LocationStrategy,{useClass:r.HashLocationStrategy})])["catch"](function(e){return console.error(e)})},323:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(301),s=t(324),l=t(327),c=t(329),p=t(331),d=t(333),m=t(335),u=t(337),g=t(345);t(347);var h=function(){function e(e,n){this.router=e,this.el=n}return e.prototype.scrollToTop=function(){this.el.nativeElement.ownerDocument.body.scrollTop=0},e.prototype.ngAfterViewChecked=function(){return Prism.highlightAll()},e=r([i.Component({selector:"simple-java-mail-app",directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll],template:t(355),styles:[t(357)],encapsulation:i.ViewEncapsulation.None}),o.Routes([{path:"/about",component:l.About},{path:"/features",component:c.Features},{path:"/configuration",component:p.Configuration},{path:"/debugging",component:d.Debugging},{path:"/rfc",component:m.RfcCompliant},{path:"/download",component:u.Download},{path:"/contact",component:g.Contact},{path:"",component:l.About}]),a("design:paramtypes",[o.Router,i.ElementRef])],e)}();n.SimpleJavaMailApp=h},327:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(301),s=t(324),l=function(){function e(e){e.navigate(["/about"])}return e=r([i.Component({template:t(328),directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll]}),a("design:paramtypes",[o.Router])],e)}();n.About=l},328:function(e,n){e.exports='
\n\n

Simple Java Mail: Simple API, Complex Emails

\n\n
\n\n
\n
\n

Simple Java Mail is mailing library with a super clean API. It\'s the easiest to\n use Java mailing library in the world.

\n
\n

This library relieves you of having to deal with low level API such as MimeMessage, fuzzy try\n catch constructions, inner classes and other nonsense. You just want to send an email!

\n
\n

But don\'t let looks deceive you, this library does everything: it is a feature complete\n mailing library, yet it is small and lightweight. It is fully RFC compliant and looks good in all\n email clients.

\n
\n

It\'s also the only java mailing library in the world that can send through authenticated SOCKS proxy.

\n
\n\n
\n
// Everything together:\n\nConfigLoader.loadProperties("simplejavamail.properties"); // optional default\nConfigLoader.loadProperties("overrides.properties"); // optional extra\n\nEmail email = new Email();\n\nemail.addRecipient("lollypop", "lolly.pop@somemail.com", Message.RecipientType.TO);\nemail.setReplyToAddress("lollypop", "lolly.pop@othermail.com");\nemail.addRecipient("C. Cane", "candycane@candyshop.org", Message.RecipientType.TO);\nemail.addRecipient("C. Bo", "chocobo@candyshop.org", Message.RecipientType.CC);\nemail.setSubject("hey");\nemail.setText("We should meet up! ;)");\nemail.setTextHTML("<img src='cid:wink1'><b>We should meet up!</b><img src='cid:wink2'>");\nemail.addEmbeddedImage("wink1", imageByteArray, "image/png");\nemail.addEmbeddedImage("wink2", imageDatesource);\nemail.addAttachment("invitation", pdfByteArray, "application/pdf");\nemail.addAttachment("dresscode", odfDatasource);\n\nemail.signWithDomainKey(privateKeyData, "somemail.com", "selector");\n\nnew Mailer(\n		new ServerConfig("smtp.host.com", 587, "user@host.com", "password"),\n		TransportStrategy.SMTP_TLS,\n		new ProxyConfig("socksproxy.host.com", 1080, "proxy user", "proxy password")\n).sendMail(email);\n
\n
\n
\n\n\n §\n

Getting started

\n\n
\n
\n

Simple Java Mail is a thin layer on top of Oracle\'s SMTP JavaMail API. For logging purposes, SLF4J is used so\n you can use whatever\n logging framework you prefer.

\n

Once the dependencies are set up, simply copy the above examples and start mailing!

\n

\n Show Examples\n API\n Javadoc\n

\n
\n
\n
\n'},329:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(324),s=t(301),l=function(){function e(){o.SimplePageScrollConfig.defaultScrollOffset=0}return e=r([i.Component({template:t(330),directives:[s.ROUTER_DIRECTIVES,o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Features=l},330:function(e,n){e.exports='
\r\n\r\n

Simple Java Mail Features

\r\n\r\n
\r\n

\r\n Creating and sending emails is very simple with Simple Java Mail; you don\'t need to know about the mailing RFC, MimeMessage or any other low\r\n level javax.mail API. No anonymous inner classes needed and no large frameworks needed nor XML.\r\n

\r\n\r\n

\r\n On top of that, Simple Java Mail will do some basic validation checks so that your email is always populated with enough data. It even verifies\r\n email addresses against RFC-2822 using the only complete rfc2822 validator in java in the world.\r\n

\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n

Roadmap

\r\n
    \r\n
  • Asynchronous (threaded) mailing for batches
  • \r\n
\r\n
\r\n\r\n §\r\n

Basic usage

\r\n\r\n
\r\n
\r\n

\r\n Simply create an Email, populate it with your data, create a Mailer and send the Email\r\n instance. The mailer can be created with your own Session instance as well.\r\n

\r\n

\r\n A Mailer instance is reusable.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.setFromAddress("Michel Baker", "m.baker@mbakery.com");\r\nemail.addRecipient("mom", "jean.baker@hotmail.com", RecipientType.TO);\r\nemail.addRecipient("dad", "StevenOakly1963@hotmail.com", RecipientType.TO);\r\nemail.setSubject("My Bakery is finally open!");\r\nemail.setText("Mom, Dad. We did the opening ceremony of our bakery!!!");\r\n\r\nnew Mailer("server", "25", "username", "password").sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Using the fluent API with the Builder pattern

\r\n\r\n
\r\n
\r\n

\r\n The previous example becomes even more succinct by using the fluent API.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new EmailBuilder()\r\n    .from("Michel Baker", "m.baker@mbakery.com")\r\n    .to("mom", "jean.baker@hotmail.com")\r\n    .to("dad", "StevenOakly1963@hotmail.com")\r\n    .subject("My Bakery is finally open!")\r\n    .text("Mom, Dad. We did the opening ceremony of our bakery!!!")\r\n    .build();\r\n\r\nnew Mailer("server", "25", "username", "password").sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Configure once, reuse many times

\r\n\r\n
\r\n
\r\n

\r\n You can preconfigure a Mailer and use it many times.\r\n

\r\n
\r\n\r\n
\r\n
Mailer inhouseMailer = new Mailer("server", "25", "username", "password");\r\n\r\ninhouseMailer.sendMail(email);\r\ninhouseMailer.sendMail(anotherEmail);\r\n
\r\n Or as preconfigured Spring bean:\r\n
\r\n<bean id="inhouseMailer" class="org.codemonkey.simplejavamail.Mailer">\r\n   <constructor-arg value="server" />\r\n   <constructor-arg value="25" />\r\n   <constructor-arg value="username" />\r\n   <constructor-arg value="password" />\r\n</bean>\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Asynchronous parallel batch sending

\r\n\r\n
\r\n
\r\n

\r\n The default mode is to send emails synchronously, blocking execution until the email was processed completely and the STMP server send a\r\n succesful result.\r\n

\r\n

\r\n You can also sent anyschronously in parallel or batches, or simply send in a fire-and-forget way. If an authenticated proxy is used, the proxy briding server is kept alive until the last email has been sent.

\r\n

\r\n Depending on the SMTP server (and proxy server if used) this can greatly influence how fast emails are sent.\r\n

\r\n
\r\n\r\n
\r\n
mailer.sendMail(email, true);\r\n
\r\n

Refer to the configuration section\r\n on how to set the thread pool size default.

\r\n
\r\n
\r\n\r\n\r\n §\r\n

Sending with your own Session instance

\r\n\r\n
\r\n
\r\n

\r\n If you prefer to use your own preconfigured Session instance and still benefit from Simple Java Mail, you can!\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n...\r\n\r\nnew Mailer(yourSession).sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Sending with SSL and TLS

\r\n\r\n
\r\n
\r\n

\r\n Activating SSL or TLS is super easy. Just use the appropriate TransportStrategy enum.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nmailer.sendMail(email, TransportStrategy.SMTP_PLAIN); // default if omitted\r\nmailer.sendMail(email, TransportStrategy.SMTP_SSL);\r\nmailer.sendMail(email, TransportStrategy.SMTP_TLS);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

SSL and TLS with Google mail

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example of SSL and TLS using gMail.\r\n

\r\n

\r\n If you have two-factor login turned on, you need to generate an application\r\n specific\r\n password\r\n from your Google account.\r\n

\r\n
\r\n\r\n
\r\n
new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);\r\nnew Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email);\r\nnew Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Adding attachments

\r\n\r\n
\r\n
\r\n

\r\n You can add attachments very easily, but you\'ll have to provide the data yourself. Simple Java Mail accepts byte[]\r\n and DataSource objects.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addAttachment("dresscode.txt", new ByteArrayDataSource("Black Tie Optional", "text/plain"));\r\nemail.addAttachment("location.txt", "On the moon!".getBytes(Charset.defaultCharset()), "text/plain");\r\n\r\n// ofcourse it can be anything: a pdf, doc, image, csv or anything else\r\n\r\nemail.addAttachment("invitation.pdf", new FileDataSource("invitation_v8.3.pdf"));\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Embedding images

\r\n\r\n
\r\n
\r\n

\r\n Embedding images is simple, but you have to add the placeholders in the HTML yourself.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addEmbeddedImage("smiley", new FileDataSource("smiley.jpg"));\r\n// this example is included in the demo package in MailTestApp.java\r\nString base64String = "iVBORw0KGgoAAAANSUhEUgAAA ...snip";\r\nemail.addEmbeddedImage("thumbsup", parseBase64Binary(base64String), "image/png");\r\n\r\n// the corresponding HTML should contain the placeholders\r\n<p>Let's go!</p><img src='cid:thumbsup'><br/>\r\n<p>Smile!</p><img src='cid:smiley'>\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Setting custom headers

\r\n\r\n
\r\n
\r\n

\r\n Sometimes you need extra headers in your email because your email server, recipient server or your email client needs it. Or perhaps you have\r\n a proxy or monitoring setup in between mail servers. Whatever the case, adding headers is easy.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\nemail.addHeader("X-Priority", 2);\r\nemail.addHeader("X-MC-GoogleAnalyticsCampaign", "halloween_sale");\r\nemail.addHeader("X-MEETUP-RECIP-ID", "71415272");\r\nemail.addHeader("X-my-custom-header", "foo");\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Setting custom properties on the internal Session

\r\n\r\n
\r\n
\r\n

\r\n In case you need to modify the internal Session object itself, because you need a tailored configuration that is supported by the underlying\r\n javax.mail, that too is very easy.\r\n

\r\n
\r\n\r\n
\r\n
Properties props = new Properties();\r\nprops.setProperty("mail.smtp.timeout", 30 * 1000);\r\nprops.setProperty("mail.smtp.connectiontimeout", 10 * 1000);\r\n\r\nMailer mailer = new Mailer();\r\nmailer.applyProperties(props);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Direct access to the internal Session

\r\n\r\n
\r\n
\r\n

\r\n For emergencies, you can also get a hold of the internal Session instance itself. You should never need this however and if\r\n you do it means Simple Java Mail failed to simplify the configuration process for you. Please let us know how we can help alleviate\r\n this need.\r\n

\r\n
\r\n\r\n
\r\n
Mailer mailer = new Mailer();\r\n\r\nSession session = mailer.getSession();\r\n// do your thing with session\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Signing emails with DKIM

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail also supports signing with DKIM\r\n domain keys. It uses java-utils-mail-dkim (dependency packaged along) to\r\n perform the DNS DKIM record check on the given domain.\r\n

\r\n
\r\n\r\n
\r\n
Email signedEmail = new Email();\r\n\r\nsignedEmail.signWithDomainKey(\r\n   privateKey byte[] / File / InputStream,\r\n   "your_domain.org",\r\n   "your_selector");\r\n\r\nnew Mailer().sendMail(signedEmail);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Validating Email Addresses

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail can validate your email addresses. It\'s not just a simple regex check, but a complete and robust full validation against RFC-2822. It does this by including email-rfc2822-validator in the library.\r\n

\r\n
\r\n\r\n
\r\n
EmailAddressValidator.isValid("your_address@domain.com",\r\n   EmailAddressCriteria.RFC_COMPLIANT);\r\n\r\n// or, fine-tuned to be less strict:\r\nEmailAddressValidator.isValid("your_address@domain.com",\r\n   of(ALLOW_QUOTED_IDENTIFIERS, ALLOW_PARENS_IN_LOCALPART));\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Generating a MimeMessage from an Email

\r\n\r\n
\r\n
\r\n

\r\n If for some reason you need a MimeMessage, you can still benefit from the easy API Simple Java Mail offers. Behold.\r\n

\r\n
\r\n\r\n
\r\n
Email email = new Email()\r\n// populate email, the builder is great for this\r\n\r\n// then\r\nMimeMessage message = Mailer.produceMimeMessage(email);\r\n// or\r\nMimeMessage message = Mailer.produceMimeMessage(email, yourSession);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Generating an Email from a MimeMessage

\r\n\r\n
\r\n
\r\n

\r\n If you already have a MimeMessage, you can easily convert it into a ready-to-use Email instance, complete with embedded images and attachment\r\n intact.\r\n

\r\n
\r\n\r\n
\r\n
MimeMessage mimeMessage = ...;\r\nEmail email = new Email(mimeMessage);\r\n\r\nnew Mailer().sendMail(email);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Send using a proxy

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail supports sending emails through a proxy. It is also the only java mailing framework in the world that supports sending emails\r\n through authenticated proxies.\r\n

\r\n

\r\n The reason for this is that the underlying native Javax Mail framework supports\r\n anonymous SOCKS5 proxies, but not authenticated proxies.\r\n

\r\n

\r\n To make this work with authentication, Simple Java Mail uses a trick: it sets up a temporary anonymous proxy server for Javax Mail to connect\r\n to and then relays the connection to the target proxy performing the authentication outside of Javax Mail.\r\n

\r\n

\r\n This temporary server is referred to as the Proxy Bridging Server.\r\n

\r\n
\r\n\r\n
\r\n
// anonymous proxy\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080));\r\n\r\n// authenticated proxy\r\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080, "proxy username", "proxy password"));\r\n
\r\n

Refer to the configuration section\r\n on how to set proxy server defaults and the port on which the proxy bridge runs.

\r\n
\r\n
\r\n\r\n
\r\n'},331:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(324),s=function(){function e(){}return e=r([i.Component({template:t(332),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Configuration=s},332:function(e,n){e.exports='
\n\n

Configuration

\n\n
\n

\n Simple Java Mail provides full configuration through programmatic API as well as system variables, environment\n variables\n and properties files. For each level of configuration detail, a simple constructor is available as well.\n

\n

\n The Java API and config files complement each other; the more you configure in a properties file, the less you can provide through the\n programmatic API. If you provide the overlapping configuration, the programmatic API takes priority, overriding system and environment values,\n overriding property values.\n

\n
\n\n
\n \n
\n\n\n §\n

Programmatic API

\n\n
\n
\n

\n Everything can be configured through the java API.\n

\n
\n\n
\n
// the simplest constructor, this is how the library started!\nnew Mailer("smtp.host.com", 25, "username", "password");\n
\n
\n// the same as the basic constructor, but with a config object\nnew Mailer(new ServerConfig("smtp.host.com", 25, "username", "password"));\n\n// you can even leave out some details for an anonymous SMTP server\nnew Mailer(new ServerConfig("smtp.host.com", 25));\n\n// adding the transport strategy...\nnew Mailer("smtp.host.com", 587, "username", "password", TransportStrategy.SMTP_TLS);\nnew Mailer(serverConfig, TransportStrategy.SMTP_TLS);\n\n// or instead adding anonymous proxy configuration\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080));\n\n// or authenticated proxy\nnew Mailer(serverConfig, new ProxyConfig("proxy.host.com", 1080, "proxy username", "proxy password"));\n
\n
\n// anonymous smtp + anonymous proxy + default SMTP_PLAIN strategy\nnew Mailer(new ServerConfig("smtp.host.com", 25), new ProxyConfig("proxy.host.com", 1080));\n
\n
\n// configure everything!\nnew Mailer(\n		new ServerConfig("smtp.host.com", 587, "user@host.com", "password"),\n		TransportStrategy.SMTP_TLS,\n		new ProxyConfig("socksproxy.host.com", 1080, "proxy user", "proxy password")\n).sendMail(email);\n
\n
\n// preconfigured Session?\nnew Mailer(session);\n\n// preconfigured but you need anonymous proxy?\nnew Mailer(session, new ProxyConfig("proxy.host.com", 1080));\n\n// preconfigured but you need authenticated proxy?\nnew Mailer(session, new ProxyConfig("proxy.host.com", 1080, "proxy user", "proxy password"));\n
\n
\n
\n\n\n §\n

Other settings

\n\n
\n
\n

\n Aside from the constructors, there are a few other settings.\n

\n
\n\n
\n
// make javax.mail produce more logging\nmailer.setDebug(true);\n
\n
\n// change email validation strategy, or deactivate completely\nmailer.setEmailAddressCriteria(EmailAddressCriteria.DEFAULT);\nmailer.setEmailAddressCriteria(EmailAddressCriteria.RFC_COMPLIANT);\nmailer.setEmailAddressCriteria(EnumSet\n       .of(ALLOW_QUOTED_IDENTIFIERS, ALLOW_PARENS_IN_LOCALPART));\nmailer.setEmailAddressCriteria(null);\n
\n
\n// change SOCKS5 bridge port in case of authenticated proxy\nProxyconfig proxyConfig = new ProxyConfig(...);\nproxyConfig.setProxyBridgePort(1081); // is always localhost\n
\n
\n// set custom properties\nProperties props = new Properties();\nprops.setProperty("mail.smtp.sendpartial", true);\nmailer.applyProperties(props);\n  \n// or:\nmailer.getSession().getProperties().setProperty("mail.smtp.sendpartial", true);\n
\n
\n// trust all hosts for SSL connections, don\'t validate keys\nmailer.trustAllSSLHosts(true)\n
\n
\n// white list hosts for SSL connections, don\'t validate keys for these\nmailer.trustSSLHosts("a", "b", "c", ...);\n
\n
\n
\n\n\n §\n

Properties files

\n\n
\n
\n

\n With properties files you can define defaults and overrides. You can also provide overriding value by defining system variables.\n

\n

\n Simple Java Mail will automatically load properties from simplejavamail.properties, if available on the classpath.\n Alternatively, you can manually load additional properties files in a number of ways.\n

\n

\n Properties are loaded in order of priority from high to low:\n

\n
    \n
  1. Programmatic values
  2. \n
  3. System variables
  4. \n
  5. Environment variables
  6. \n
  7. Properties from config files
  8. \n
\n
\n\n
\n
ConfigLoader.loadProperties("overrides-on-classpath.properties", /* addProperties = */ true);\nConfigLoader.loadProperties(new File("d:/replace-from-environment.properties"), /* addProperties = */ false);\nConfigLoader.loadProperties(usingMyOwnInputStream, addProperties);\n
\n
\n
\n\n §\n

Available properties

\n\n
\n
\n

\n The default recipients are like admin features, where you notify a person whenever a mail goes out from a certain mailer.\n

\n
\n\n
\n
simplejavamail.javaxmail.debug=true\nsimplejavamail.transportstrategy=SMTP_SSL\nsimplejavamail.smtp.host=smtp.default.com\nsimplejavamail.smtp.port=25\nsimplejavamail.smtp.username=username\nsimplejavamail.smtp.password=password\nsimplejavamail.proxy.host=proxy.default.com\nsimplejavamail.proxy.port=1080\nsimplejavamail.proxy.username=username proxy\nsimplejavamail.proxy.password=password proxy\nsimplejavamail.proxy.socks5bridge.port=1081\nsimplejavamail.defaults.subject=Sweet News\nsimplejavamail.defaults.from.name=From Default\nsimplejavamail.defaults.from.address=from@default.com\nsimplejavamail.defaults.replyto.name=Reply-To Default\nsimplejavamail.defaults.replyto.address=reply-to@default.com\nsimplejavamail.defaults.to.name=To Default\nsimplejavamail.defaults.to.address=to@default.com\nsimplejavamail.defaults.cc.name=CC Default\nsimplejavamail.defaults.cc.address=cc@default.com\nsimplejavamail.defaults.bcc.name=BCC Default\nsimplejavamail.defaults.bcc.address=bcc@default.com\nsimplejavamail.defaults.poolsize=10\n
\n
\n
\n\n §\n

Combining both for multiple environments

\n\n
\n
\n

\n Let\'s set up configuration for a test, acceptance and production environment.\n

\n

Properties for the environments

\n
\n
\n
/* global default properties (simplejavamail.properties on classpath) */\n\n    // anonoymous SMTP inside \'safe\' DMZ\n    simplejavamail.smtp.host=dmz.smtp.candyshop.com\n    simplejavamail.smtp.port=25\n\n    // default sender and reply-to address\n    simplejavamail.defaults.from.name=The Candy App\n    simplejavamail.defaults.from.address=candyapp@candystore.com\n    simplejavamail.defaults.replyto.name=Candystore Helpdesk\n    simplejavamail.defaults.replyto.address=helpdesk@candystore.com\n
\n
/* overrides from TEST and UAT .../config/candystore/simplejavamail.properties */\n\n    // always send a copy to test archive\n    simplejavamail.defaults.bcc.name=Archive TST UAT\n    simplejavamail.defaults.bcc.address=test-archive@candyshop.com\n
\n
/* overrides from PRODUCTION .../config/candystore/simplejavamail.properties */\n\n    // always send a copy to production archive\n    simplejavamail.defaults.bcc.name=Archive PRODUCTION\n    simplejavamail.defaults.bcc.address=prod-archive@candyshop.com\n\n    // smtp server in production is protected\n    simplejavamail.smtp.username=creamcake\n    simplejavamail.smtp.password=crusty_l0llyp0p\n\n    // sending mails in production must go through proxy\n    simplejavamail.proxy.host=proxy.candyshop.com\n    simplejavamail.proxy.port=1080\n    simplejavamail.proxy.username=candyman\n    simplejavamail.proxy.password=I has the sugarcanes!!1!\n
\n
\n\n

Now for the programmatic part

\n\n
\n
// simplejavamail.properties is automatically loaded\n\n// assume that every environment provides its own property file\nConfigLoader.loadProperties(new File(".../config/candystore/simplejavamail.properties"));\n
\n
\n// see if we need to do some specific override for some reason\nif (someSpecialCondition) {\n  ConfigLoader.loadProperties("special-override.properties", true);\n}\n
\n
\n// or maybe we want to ditch all defaults and trust someone else\'s config completely\nif (ditchOwnAndTrustOtherSource) {\n  ConfigLoader.loadProperties(someFileOrInputSource, false);\n}\n
\n
\n// maybe the config service has something?\nConfigLoader.loadProperties(socket.getInpuStream(), true);\n
\n\n

\n Maybe we want to connect slightly different for some reason:\n

\n\n
// override only the port and connection type, leave everything else to config files\nMailer mailer = new Mailer(new ServerConfig(null, 587), TransportStrategy.SMTP_TLS);\n
\n
\n
\n\n
\n'; +},333:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(324),s=function(){function e(){}return e=r([i.Component({template:t(334),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.Debugging=s},334:function(e,n){e.exports='
\r\n\r\n

Logging & Debugging

\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n §\r\n

Enable javax.mail debug logging

\r\n\r\n
\r\n
\r\n

\r\n By default javax.mail\'s debug logging is turned off, but you can turn it on for more diagnostic info. All this does is enabling debug mode on\r\n the internal Session instance.\r\n

\r\n
\r\n\r\n
\r\n
Mailer mailer = new Mailer(...);\r\nmailer.setDebug(true);\r\n\r\n// or\r\nmailer.getSession().setDebug(true);\r\n\r\n// or\r\nyourSession.setDebug(true);\r\nMailer mailer = new Mailer(yourSession);\r\n
\r\n
\r\n
\r\n\r\n\r\n §\r\n

Catching exceptions

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail throws a MailException if something goes wrong and logs these by default using SLF4J. This\r\n includes checked exceptions thrown by underlying frameworks. An exception might be thrown when:\r\n

\r\n
    \r\n
  1. 1. sending an email
  2. \r\n
  3. 2. signing an email with DKIM
  4. \r\n
  5. 3. converting from MimeMessage to Email
  6. \r\n
\r\n
\r\n\r\n
\r\n
Email email = new Email();\r\n\r\ntry {\r\n   new Mailer().sendMail(email);\r\n} catch (MailException e) {\r\n   // handle the exception (but it is already logged through SLF4J)\r\n}\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Logging output

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail uses SLF4J to log, which means you can use any logging framework you like that supports\r\n it. Also read this excellent summary of how to configure\r\n slf4j with\r\n log4j2.\r\n

\r\n

\r\n There are three parts of Simple Java Mail that may produce logging: "org.codemonkey.simplejavamail", "socks5bridge" and\r\n "org.codemonkey.simplejavamail.internal.socks". The latter two are for the proxy bridge that is used for authenticated proxy connections .\r\n

\r\n

\r\n If you wish to know where and how the properties are loaded, you can increase logging for "org.simplejavamail.internal.util.ConfigLoader".\r\n This will tell you which properties are loaded by API and which from config file and which were properties are without values.\r\n

\r\n

\r\n When using maven, Simple Java Mail provides some default XML configuration for log4j2, but you can easily switch to something else. Below are\r\n some examples.\r\n

\r\n
\r\n
\r\n\r\n §\r\n

Example with log4j12

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for log4j12, make sure you have the\r\n slf4j-to-log4j impl included on the classpath as well as log4j12 itself and the log4j.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">\r\n<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">\r\n\r\n    <appender name="console" class="org.apache.log4j.ConsoleAppender">\r\n        <layout class="org.apache.log4j.PatternLayout">\r\n            <param name="ConversionPattern" value="%d [%t] %-5p %c{1} - %m%n"/>\r\n        </layout>\r\n    </appender>\r\n    <appender name="simpleConsole" class="org.apache.log4j.ConsoleAppender">\r\n        <layout class="org.apache.log4j.PatternLayout">\r\n            <param name="ConversionPattern" value="%d Simple Java Mail SOCKS5 bridge - %p %m%n"/>\r\n        </layout>\r\n    </appender>\r\n\r\n    <logger name="org.codemonkey.simplejavamail">\r\n        <level value="trace"/>\r\n        <appender-ref ref="console"/>\r\n    </logger\r\n    <!-- in case you're using authenticated proxy -->\r\n    <logger name="socks5bridge" additivity="false">\r\n        <level value="info"/>\r\n        <appender-ref ref="simpleConsole"/>\r\n    </logger>\r\n    <logger name="org.codemonkey.simplejavamail.internal.socks">\r\n        <level value="warn"/>\r\n    </logger>\r\n\r\n</log4j:configuration>\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Example with log4j2

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for log4j2, make sure you have the log4j-slf4j-impl impl\r\n included on the classpath as well as log4j2 itself and the log4j2.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<configuration status="OFF">\r\n    <appenders>\r\n        <Console name="console" target="SYSTEM_OUT">\r\n            <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %c{1} - %msg%n" />\r\n        </Console>\r\n        <Console name="simpleConsole" target="SYSTEM_OUT">\r\n            <PatternLayout pattern="%d Simple Java Mail SOCKS5 bridge - %level %m%n" />\r\n        </Console>\r\n    </appenders>\r\n    <Loggers>\r\n        <Logger name="org.codemonkey.simplejavamail" level="trace"/>\r\n        <!-- in case you're using authenticated proxy -->\r\n        <Logger name="socks5bridge" level="info" additivity="false">\r\n            <AppenderRef ref="simpleConsole" />\r\n        </Logger>\r\n        <Logger name="org.codemonkey.simplejavamail.internal.socks" level="warn"/>\r\n\r\n        <Root level="warn">\r\n            <AppenderRef ref="console" />\r\n        </Root>\r\n    </Loggers>\r\n</configuration>\r\n
\r\n
\r\n
\r\n\r\n §\r\n

Example with logback

\r\n\r\n
\r\n
\r\n

\r\n Here\'s an example configuration for logback, make sure you have the logback-classic included on the\r\n classpath as well as logback-core and the logback.xml with the config.\r\n

\r\n
\r\n\r\n
\r\n
<?xml version="1.0" encoding="UTF-8"?>\r\n<configuration>\r\n    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">\r\n        <encoder>\r\n            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %c{1} - %msg%n</pattern>\r\n        </encoder>\r\n    </appender>\r\n    <appender name="simpleConsole" class="ch.qos.logback.core.ConsoleAppender">\r\n        <encoder>\r\n            <pattern>%d Simple Java Mail SOCKS5 bridge - %level %m%n</pattern>\r\n        </encoder>\r\n    </appender>\r\n\r\n    <logger name="org.codemonkey.simplejavamail" level="TRACE"/>\r\n    <!-- in case you're using authenticated proxy -->\r\n    <logger name="socks5bridge" level="INFO" additivity="false">\r\n        <appender-ref ref="simpleConsole" />\r\n    </logger>\r\n    <logger name="org.codemonkey.simplejavamail.internal.socks" level="WARN"/>\r\n\r\n    <root level="WARN">\r\n        <appender-ref ref="console" />\r\n    </root>\r\n</configuration>\r\n
\r\n
\r\n
\r\n\r\n
\r\n'},335:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(324),s=function(){function e(){o.SimplePageScrollConfig.defaultScrollOffset=0}return e=r([i.Component({template:t(336),directives:[o.SimplePageScroll]}),a("design:paramtypes",[])],e)}();n.RfcCompliant=s},336:function(e,n){e.exports='
\n\n

Simple Java Mail is fully RFC compliant

\n\n
\n \n
\n\n §\n

Why RFC compliancy matters

\n\n
\n
\n

\n One thing that plagues other smaller libraries is the lack of true RFC compliance. Though fine for simple mails,\n this becomes a testing nightmare if for example you need to send an HTML mail (with text fall-back?) using both\n attachment and embedded images.\n

\n

\n The problem becomes evident when testing the mail in various e-mail clients (desktop, web based, mobile) by the\n fact that the e-mails will be displayed completely inconsistent and sporadic. Symptoms include:\n

\n
    \n
  • not seeing embedded images, or
  • \n
  • embedded images are displayed as attachments,
  • \n
  • not seeing the HTML version if a text version is present,
  • \n
  • not seeing the text version if a HTML version is present,
  • \n
  • not seeing attachments,
  • \n
  • attachments aren\'t handled correctly according to mime type, or
  • \n
  • header information is missing or incorrect so you can\'t see how long a download will take,
  • \n
  • from/to addresses being malformed (like missing the<name> part in <name> adres@domain.com)\n
  • \n
\n\n

The research has been done and Simple Java Mail is RFC compliant for simple to complex mails. Furthermore, it\n has been tested in a range of known clients such as Outlook, Thunderbird, Gmail, Hotmail, Android, iPhone\n etc.

\n
\n
\n\n\n §\n

How is Simple Java Mail RFC compliant?

\n\n
\n
\n

Simple Java Mail is in two ways RFC (MIME) compliant:

\n
    \n
  1. It is built on top of JavaMail, which is java\'s\n standard email library used by all other mail libraries. JavaMail itself implements various RFC\'s (including\n those for SMTP, POP3, IMAP etc).\n
  2. \n
  3. What makes Simple Java Mail unique is that it combines all the RFC\'s implemented by JavaMail in the correct\n way that works in all email clients. Where all other popular mailing libraries let you figure out the low\n level details of this through MimeMessage, BodyPart, MimeMultipart etc. as described in the individual RFC\'s,\n Simple Java Mail takes care of this for you and hides all this behind a super clean API. Now you can focus on\n the content of the email, rather than email\'s technical low level structure.\n
  4. \n
\n
\n
\n
\n'},337:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(301),s=t(324),l=t(338),c=function(){function e(){}return e=r([i.Component({template:t(344),directives:[o.ROUTER_DIRECTIVES,s.SimplePageScroll,l.MavenDependencyDisplay]}),a("design:paramtypes",[])],e)}();n.Download=c},338:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(339),s=t(342).sprintf,l=function(){function e(e){this.mavenSearchService=e}return e.prototype.ngOnInit=function(){var n=this;this.output=s(e.DISPLAY_TEMPLATE,this.groupId,this.artifact,"..."),this.mavenSearchService.fetchLatestVersion(this.groupId,this.artifact).subscribe(function(t){return n.output=s(e.DISPLAY_TEMPLATE,n.groupId,n.artifact,t)})},e.DISPLAY_TEMPLATE='
<dependency>\n	<groupId>%s</groupId>\n	<artifactId>%s</artifactId>\n	<version>%s</version>\n</dependency>
',r([i.Input(),a("design:type",String)],e.prototype,"groupId",void 0),r([i.Input(),a("design:type",String)],e.prototype,"artifact",void 0),e=r([i.Component({selector:"maven-dependency-display",template:t(343),providers:[o.MavenSearchService]}),a("design:paramtypes",[o.MavenSearchService])],e)}();n.MavenDependencyDisplay=l},339:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=t(280);t(340);var s=t(37),l=t(342).sprintf,c=function(){function e(e){this.http=e,this.latestVersion=new s.Subject}return e.prototype.fetchLatestVersion=function(n,t){var r=this;return this.http.get(l(e.endpoint,n,t)).map(function(e){return e.json().value.replace("v","")}).subscribe(function(e){return r.latestVersion.next(e)}),this.latestVersion},e.endpoint="https://img.shields.io/maven-central/v/%s/%s.json",e=r([i.Injectable(),a("design:paramtypes",[o.Http])],e)}();n.MavenSearchService=c},340:function(e,n,t){"use strict";var r=t(38),a=t(341);r.Observable.prototype.map=a.map},341:function(e,n,t){"use strict";function r(e,n){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return this.lift(new o(e,n))}var a=this&&this.__extends||function(e,n){function t(){this.constructor=e}for(var r in n)n.hasOwnProperty(r)&&(e[r]=n[r]);e.prototype=null===n?Object.create(n):(t.prototype=n.prototype,new t)},i=t(43);n.map=r;var o=function(){function e(e,n){this.project=e,this.thisArg=n}return e.prototype.call=function(e,n){return n._subscribe(new s(e,this.project,this.thisArg))},e}(),s=function(e){function n(n,t,r){e.call(this,n),this.project=t,this.count=0,this.thisArg=r||this}return a(n,e),n.prototype._next=function(e){var n;try{n=this.project.call(this.thisArg,e,this.count++)}catch(t){return void this.destination.error(t)}this.destination.next(n)},n}(i.Subscriber)},343:function(e,n){e.exports='
\r\n'},344:function(e,n){e.exports='
\r\n\r\n

Download Simple Java Mail

\r\n\r\n
\r\n
\r\n

Simple Java Mail is open source, and you can use it for free in any personal or commercial product under the Apache\r\n v2 license.

\r\n\r\n

Simple Java Mail is available in Maven central as dependency and you can also download the jar distribution directly from there.

\r\n\r\n \r\n\r\n \r\n Download sources, javadoc, distribution directly from Maven Central\r\n
\r\n
\r\n\r\n
\r\n Help and contact
\r\n Release information about the latest version
\r\n Complete changelist\r\n
\r\n\r\n\r\n

License

\r\n\r\n
\r\n
\r\n

\r\n Simple Java Mail is released under Apache v2 license\r\n

\r\n

In short this means you can do whatever you want as long as you\r\n include the same license, the original (possibly ammended) notice, copyright and that state your changes.

\r\n
\r\n
\r\n\r\n\r\n

Repository

\r\n\r\n
\r\n
\r\n

You can visit the repository Simple Java Mail on gitHub.

\r\n
\r\n
\r\n
\r\n'},345:function(e,n,t){"use strict";var r=this&&this.__decorate||function(e,n,t,r){var a,i=arguments.length,o=3>i?n:null===r?r=Object.getOwnPropertyDescriptor(n,t):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,n,t,r);else for(var s=e.length-1;s>=0;s--)(a=e[s])&&(o=(3>i?a(o):i>3?a(n,t,o):a(n,t))||o);return i>3&&o&&Object.defineProperty(n,t,o),o},a=this&&this.__metadata||function(e,n){return"object"==typeof Reflect&&"function"==typeof Reflect.metadata?Reflect.metadata(e,n):void 0},i=t(4),o=function(){function e(){}return e=r([i.Component({template:t(346)}),a("design:paramtypes",[])],e)}();n.Contact=o},346:function(e,n){e.exports='
\n\n

Contact

\n\n

Get help, request features, post bugs

\n\n
\n
\n

Simple Java Mail is a robust library, but there\'s always room for improvement: suggest anything you can think of!

\n\n

The Simple Java Mail GitHub repository and the issue tracker are used to discuss feature requests and issues.\n

\n\n

You can also refer to the API documentation.

\n\n

If you need more general help, you\'ll usually get an answer by posting a question on StackOverflow. And you can always post an issue in the issue tracker, I get an email as soon as something\n gets posted.\n

\n\n \n
\n
\n\n\n

About myself

\n\n
\n
\n

You can find more about me on bennybottema.com. At the bottom of the page you can shoot me an email\n if you want a quick answer.

\n
\n
\n
\n'},355:function(e,n,t){e.exports='\n Fork me on GitHub\n\n\n
\n

Simple Java Mail

\n

Simple API, Complex Emails

\n\n
\n
\n
Email email = new EmailBuilder()\n    .from("lollypop", "lolly.pop@pretzelfun.com")\n    .to("C. Cane", "candycane@candyshop.org")\n    .to("C. Bo", "chocobo@candyshop.org")\n    .subject("hey")\n    .text("We should meet up! ;)")\n    .build();\n\nnew Mailer().sendMail(email);\n
\n Download Simple Java Mail\n
\n
\n
\n\n\n\n
\n \n
\n\n\n\n'},356:function(e,n){e.exports="data:image/png;base64,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"; },357:function(e,n){e.exports='*{-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin:0;border:0}html{font:400 18px/1.75 \'Open Sans\';background-color:#EEEEDD}a.copyright:link,a.copyright:visited{color:black}.content a:link,.content a:visited{color:#888888}.content a.button:link,.content a.button:visited{color:white}pre{overflow:auto}code.small{font-size:14px}code.extra-small{font-size:12px}code.inline{font-family:Consolas,\'Liberation Mono\',Menlo,Courier,monospace}button{background:#8ad2d3;font:700 11px/30px Arial;text-transform:uppercase;padding:0 15px;border-radius:4px;border-bottom:2px solid rgba(0,0,0,0.1);color:white;cursor:pointer;margin:15px 5px 0 0}input{padding:10px}input,select{border:1px solid #bfbfbf;margin:15px 10px 10px 0}h1{font:600 50px "Open Sans";letter-spacing:-3px;margin-bottom:30px}h2{font:400 30px "Open Sans";letter-spacing:-2px}h3{font:600 20px "Open Sans";letter-spacing:-1px}h4{font:600 20px "Open Sans";letter-spacing:-1px;margin-bottom:20px}p{margin-bottom:10px;max-width:650px}p.wide{margin-bottom:10px;max-width:initial}section{display:table;table-layout:fixed;width:100%;margin-bottom:30px;padding-bottom:30px;border-bottom:1px solid #ddd}section,.jump{clear:both;overflow:hidden}.content,footer{margin:0 auto;max-width:100%;width:1400px;padding:0 50px 100px}footer{padding:0 0 0 50px}.introduction{margin-bottom:30px}.bar-group{text-align:center;background:#66BBAA;margin-bottom:40px}.bar-link{color:#FFF;text-decoration:none;padding:20px 15px;display:inline-block}.bar-link:hover,.bar-link.active{background:rgba(255,255,255,0.4)}.viewer-header{cursor:pointer;display:block;border-bottom:5px solid rgba(0,0,0,0.1);background:#BDCDCD;margin-top:10px;font:700 14px \'Open Sans\';padding:10px}.viewer-header:before{content:"(Click to show code) ";font:400 12px Arial}.viewer-content{overflow:hidden;max-height:0;-webkit-transition:max-height 300ms;transition:max-height 300ms}.viewer-header.open{background:#95C4B0}.viewer-header.open:before{content:""}.viewer-header.open+.viewer-content{max-height:2000px}.options{padding:0 30px 10px 10px}.options>strong{display:block;margin-top:10px}.example{position:relative;padding:20px 60px 50px 30px;margin:20px 0;overflow:hidden}.example.overflow{overflow:visible}.example-val{font:400 12px Arial;color:#888;display:block;margin:15px 0}.example-val:before{content:"Value: ";font:700 12px Arial}.example.vertical{width:120px}.example.vertical .noUi-target{height:150px}.before-example~.example{margin-top:0}.before-example~.example.vertical .noUi-target{height:220px}.quick{max-width:550px;margin:0 auto}.quick .noUi-target{max-width:300px;margin:20px auto 30px}.quick pre{background:#F3F3F3 !important;padding:10px 30px 25px;margin:10px auto;border:1px solid #BDBDBD}.logger{overflow:hidden;margin-top:20px;text-align:center}.logger div{background-color:#FFF;-webkit-transition:all .25s;transition:all .25s;padding:0 5px;display:inline-block;margin:0 2px;font:700 10px/26px Arial;color:#BBB;text-transform:uppercase;text-align:center;border-radius:4px;border:1px solid #ddd}.logger div.tShow{background-color:#008CBA;color:#FFF}.logger button{display:inline-block;margin:2px}.pro-list{max-width:300px;font-size:17px;margin:30px;list-style:none;padding:0}.pro-list li{margin-bottom:5px;position:relative}.pro-list li:before{content:"\\2713\\0020";display:block;font-size:21px;position:absolute;left:-22px;top:50%;margin-top:-14px;color:Teal}.data-table td{padding:10px;vertical-align:top}.data-table td:first-child,.data-table th:first-child{text-align:right}.styling-table{table-layout:fixed;width:80%;text-align:left}.styling-table th{padding:10px}.events-table{width:100%;table-layout:fixed;text-align:center}.events-no{color:#fff}.events-yes{text-indent:-9999px}.events-yes span{display:block;border-radius:999px;width:10px;height:10px;margin:0 auto;background:#95C4B0}.section-link{float:left;color:#999;padding-right:10px;display:block;text-decoration:none;line-height:normal}.section-link.h2{font-size:32px}.section-link.h3{font-size:20px}.section-link:hover{color:#333}.button{background:#DD9977;display:table;text-decoration:none;margin:30px auto;font-size:19px;padding:13px 25px;text-align:center;clear:left;color:#FFF}.button-group{margin-top:1.5em}.button-group>.button{display:inline;margin-left:15px;margin-right:15px}.button-group>.button:first-child{margin-left:0}.button:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.quotable{font-style:italic;color:#00A0B0;font-size:24px;font-weight:400}.index-demo{padding:50px 30px;background:#444444}.index-demo h1{text-align:center;font-weight:700;font-size:40px;color:#EEEEDD;margin:0}.index-demo h2{text-align:center;color:#EEEEDD}.index-demo-dl{color:#FFF;font-size:22px;letter-spacing:-1px;text-decoration:none;display:table;border-bottom:1px solid #FFF;margin:30px auto 10px;text-shadow:0 1px rgba(0,0,0,0.3)}.index-demo,.bar-group,.button{box-shadow:0 2px 10px 0 rgba(0,0,0,0.16),0 2px 5px 0 rgba(0,0,0,0.26)}.noUi-tooltip{font:700 12px/12px Arial}.indent{margin-left:3em}.paragraph{margin-top:1em;margin-bottom:2em}@media (min-width:800px){.index-demo{padding:100px 0 60px}.index-demo h1{line-height:100%;font-family:Trebuchet MS;font-size:100px;margin:0 auto}.index-demo h2{text-align:right;font-size:28px;margin:-10px auto 30px;padding-right:35px;font-size:20px;font-family:Courier;max-width:480px}}@media (min-width:1100px){.view,.side,.view-more{display:table-cell;vertical-align:top}.view{width:490px;padding:10px 70px 10px 0}.view p{max-width:690px}.view-more{width:690px;padding:10px 70px 10px 0}}@media (max-width:800px){:not(pre)>code[class*="language-"]{white-space:pre-wrap}.content{padding:20px}}'},358:function(e,n){e.exports='\r\n\r\n \r\n \r\n Simple Java Mail\r\n \r\n \r\n \r\n \r\n \r\n Loading...\r\n \r\n \r\n\r\n'}}); //# sourceMappingURL=app.map \ No newline at end of file diff --git a/src/main/webapp/src/app/components/configuration/configuration.html b/src/main/webapp/src/app/components/configuration/configuration.html index 47d494a09..509a8f363 100644 --- a/src/main/webapp/src/app/components/configuration/configuration.html +++ b/src/main/webapp/src/app/components/configuration/configuration.html @@ -109,8 +109,21 @@

Other settings

proxyConfig.setProxyBridgePort(1081); // is always localhost

-// change maximum number of threads when sending asynchronously
-mailer.setThreadPoolSize(20);
+// set custom properties
+Properties props = new Properties();
+props.setProperty("mail.smtp.sendpartial", true);
+mailer.applyProperties(props);
+  
+// or:
+mailer.getSession().getProperties().setProperty("mail.smtp.sendpartial", true);
+
+

+// trust all hosts for SSL connections, don't validate keys
+mailer.trustAllSSLHosts(true)
+
+

+// white list hosts for SSL connections, don't validate keys for these
+mailer.trustSSLHosts("a", "b", "c", ...);