In this day and age, applications are expected to communicate with users by sending email/text messages to alert them about applicative events (“IBM stock purchased @$99.99” or “House is on fire!”). Matlab has included the sendmail function to handle this for many years. Unfortunately, sendmail requires some tweaking to be useful on all but the most basic/insecure mail servers. Today’s post will hopefully fill the missing gaps.
None of the information I’ll present today is really new – it was all there already if you just knew what to search for online. But hopefully today’s post will concentrate all these loose ends in a single place, so it may have some value:
- Using a secure mail server
- Emailing multiple recipients
- Sending text messages
- User configuration panel
Using a secure mail server
All modern mail servers use end-to-end TLS/SSL encryption. The sendmail function needs extra configuration to handle such connections, since it is configured for a non-encrypted connection by default. Here’s the code that does this for gmail, using SMTP server smtp.gmail.com
and default port #465 (for other SMTP servers, see here):
setpref('Internet', 'E_mail', from_address); % sender "from" address, typically same as username, e.g. 'xyz@gmail.com' setpref('Internet', 'SMTP_Username', username); setpref('Internet', 'SMTP_Password', password); setpref('Internet', 'SMTP_Server', 'smtp.gmail.com'); props = java.lang.System.getProperties; props.setProperty('mail.smtp.auth', 'true'); % Note: 'true' as a string, not a logical value! props.setProperty('mail.smtp.starttls.enable', 'true'); % Note: 'true' as a string, not a logical value! props.setProperty('mail.smtp.socketFactory.port', '465'); % Note: '465' as a string, not a numeric value! props.setProperty('mail.smtp.socketFactory.class', 'javax.net.ssl.SSLSocketFactory'); sendmail(recipient, title, body, attachments); % e.g., sendmail('recipient@gmail.com', 'Hello world', 'What a nice day!', 'C:\images\sun.jpg') |
All this is not enough to enable Matlab to connect to gmail’s SMTP servers. In addition, we need to set the Google account to allow access from “less secure apps” (details, direct link). Without this, Google will not allow Matlab to relay emails. Other mail servers may require similar server-side account configurations to enable Matlab’s access.
Note: This code snippet uses a bit of Java as you can see. Under the hood, all networking code in Matlab relies on Java, and sendmail is no exception. For some reason that I don’t fully understand, MathWorks chose to label the feature of using sendmail with secure mail servers as a feature that relies on “undocumented commands” and is therefore not listed in sendmail‘s documentation. Considering the fact that all modern mail servers are secure, this seems to make sendmail rather useless without the undocumented extension. I assume that TMW are well aware of this, which is the reason they posted a partial documentation in the form of an official tech-support answer. I hope that one day MathWorks will incorporate it into sendmail as optional input args, so that using sendmail with secure servers would become fully documented and officially supported.
Emailing multiple recipients
To specify multiple email recipients, it is not enough to set sendmail‘s recipient
input arg to a string with , or ; delimiters. Instead, we need to provide a cell array of individual recipient strings. For example:
sendmail({'recipient1@gmail.com','recipient2@gmail.com'}, 'Hello world', 'What a nice day!') |
Note: this feature is actually fully documented in sendmail‘s doc-page, but for some reason I see that some users are not aware of it (to which it might be said: RTFM!).
Sending phone text (SMS) messages
With modern smartphones, text (SMS) messages have become rather outdated, as most users get push notifications of incoming emails. Still, for some users text messages may still be a useful. To send such messages, all we need is to determine our mobile carrier’s email gateway for SMS messages, and send a simple text message to that email address. For example, to send a text message to T-Mobile number 123-456-7890 in the US, simply email the message to 1234567890@tmomail.net (details).
Ke Feng posted a nice Matlab File Exchange utility that wraps this messaging for a wide variety of US carriers.
User configuration panel
Many GUI programs contain configuration panels/tabs/windows. Enabling the user to set up their own email provider is a typical use-case for such a configuration. Naturally, you’d want your config panel not to display plain-text password, nor non-integer port numbers. You’d also want the user to be able to test the email connection.
Here’s a sample implementation for such a panel that I implemented for a recent project – I plan to discuss the implementation details of the password and port (spinner) controls in my next post, so stay tuned:
User configuration of emails in Matlab GUI (click to zoom-in)
wow!
I did not know it was possible to use Matlab to send emails. The nicest part is it can even send sms though it is as Basic as it can be.
I have a coouple of questions, though. Do we have to use gmail? what if we want to use another Server?
Thanks for sharing!
@Andreea – yes it is possible, all you need to do is to provide the correct SMTP information (IP address, port number, username, password)
This is a great teaching post
thanks
Could this function (Sending Text Messages) useful outside USA?
Secondly Is there any possibility available to communicate with WhatsApp via Matlab
Thanks
@Muhammad – you can use this feature to send text messages as long as your phone operator supports an email-to-text feature. You need to contact your operator to find out the specific details.
As far as I know WhatsApp does not enable outside programs to communicate with it, and has no plans to do so in the near future.
Hey Yair,
It looks like in MATLAB 2019 you need to set ‘E_mail’ property, in addition to what you mentioned above:
Otherwise MATLAB gives the next error: