Sending Email using Dyalog and .Net
Note: This example uses the .Net namespace 'System.Web.Mail', which Microsoft's documentation now lists as deprecated. For an example of using the newer 'System.Mail' namespace, see this page. (The code listed is APLX-specific, but easily adapted to Dyalog). |
Here's a way to send email messages using Dyalog and .Net's System.Web.Mail namespace.
Ingredients
- Dyalog v12+
- .Net framework
- a sympathetic SMTP server
Obstacles to negotiate
Spam emails plague the Net and administrators place all kinds of obstacles in their way. Your messages need to avoid these obstacles.
SMTP credentials: some SMTP servers demand credentials before they will send your messages. If you have to present credentials to your server, you will need to dig further into the System.Web.Mail namespace.
- Some servers are wary of processing messages with many recipients. So this process sends messages to individual list members.
- Some servers 'throttle' outgoing messages or just reject them if they arrive too quickly from the same sender. So this process waits between sending messages.
Clearly, you can adjust some or all of this in the following not-exactly-difficult source code.
Usage
mm←⎕NEW MailMan mm.Attachments←'C:\Temp\figures.xls' mm.Body←'Here are the figures I promised you.' 'Good weekend!' 'Tony' mm.From←'A.N. Other <otheran@somewhere.com>' mm.SmtpServer←'smtp.somewhere.com' mm.Subject←'Figures you asked for' mm.To←'M.E. Kick <kickme@somewhere.com>' 'R. Supwards<supwards@domain.com>' mm.Send
Notes
Body can be a flat character vector, a nested character vector, or a matrix.
Attachments can be a simple or nested character vector.
Messages are sent in a For loop. Although they could easily be dispatched using the each operator, suspending and restarting the expression would resend all the messages already sent.
The vocabulary defines LF and CR using ⎕UCS. For versions of Dyalog earlier than 12, LF CR←⎕TC[3 2].
Note the use of a vocabulary of simple functions and operators to keep the Send method clear.
Note the use of the if operator to handle different forms of Body and Attachments
.Net namespace System.Web.Mail is now deprecated. (Can anyone update this to work with System.Net.Mail instead?
Source
:Class MailMan ⍝ Send an email message, with one or more attachments, to one or more addressees ⍝ If To is a nested vector, the message is sent individually to each element ⍝ Body may be flat, matrix or nested char vector; ⍝ if flat, CRs (0x0D) are replaced with CRLFs (0x0D 0x0A) ⍝ Stephen Taylor sjt@dyalog.com May 2008 ⎕USING←'System.Web.Mail,System.Web.dll' :Field Public Attachments←'' :Field Public Body←'' :Field Public From←'' :Field Public MessageDelay←1 ⍝ seconds delay between repeated sends :Field Public Subject←'' :Field Public SmtpServer←'' :Field Public To←'' ∇ Send;msg;to :Access Public :If 0∊⊃∘⍴¨Body From Subject To 'INCOMPLETE MESSAGE'⎕SIGNAL 11 :ElseIf 0∊⍴SmtpServer 'UNIDENTIFIED SMTP SERVER'⎕SIGNAL 11 :Else SmtpMail.SmtpServer←SmtpServer msg←⎕NEW MailMessage msg.(From Subject)←From Subject msg.Body←LF CR join(CR∘part∘,if simple)∘(rtb¨∘↓if matrix)Body :If ×⍴Attachments {}msg.Attachments.Add¨{⎕NEW MailAttachment(⊂⍵)}¨⊂if simple Attachments :EndIf :For to :In ⊂if simple To msg.To←to SmtpMail.Send msg ⎕DL MessageDelay :EndFor :EndIf ∇ ⍝ vocabulary ________________________________________________________________ LF CR←⎕UCS 10 13 if←{(⍺⍺⍣(⍵⍵ ⍵))⍵} ⍝ eg ⊂if simple join←{⊃,∘(⍺∘,)/⍵} ⍝ join strings in ⍵ with ⍺ matrix←{2=⊃⍴⍴⍵} part←{(⍴,⍺)↓¨⊂where(⍺∘⍷)⍺,⍵} ⍝ partition ⍵ at occurrences of ⍺ scalar←0∘=∘≡ simple←0 1∘(∊⍨)∘≡ where←{(⍵⍵ ⍵)⍺⍺ ⍵} ⍝ or {⍵ ⍺⍺⍨⍵⍵ ⍵} or {⍺⍺⍨∘⍵⍵⍨⍵} rtb←↓where{-+/∧\' '=⌽⍵} ⍝ remove trailing blanks :EndClass
Author: StephenTaylor
CategoryDotNet - CategoryDyalogDotNet - CategoryDyalogExamplesDotNet - CategoryEmail