Send email: Difference between revisions
m Put in netowrking cat |
|||
Line 140: | Line 140: | ||
=={{header|Ruby}}== |
=={{header|Ruby}}== |
||
Uses the {{libheader|RubyGems}}gem [http://tmail.rubyforge.org TMail] |
Uses the {{libheader|RubyGems}} gem [http://tmail.rubyforge.org TMail] |
||
<lang ruby>require 'base64' |
<lang ruby>require 'base64' |
||
require 'net/smtp' |
require 'net/smtp' |
||
require 'rubygems' |
|||
require 'tmail' |
require 'tmail' |
||
Revision as of 19:48, 25 August 2009
You are encouraged to solve this task according to the task description, using any language you may know.
Write a function to send an email. The function should have parameters for setting From, To and Cc addresses; the Subject, and the message text, and optionally fields for the server name and login details.
- If appropriate, explain what notifications of problems/success are given.
- Solutions using libraries or functions from the language are preferred, but failing that, external programs can be used with an explanation.
- Note how portable the solution given is between operating systems when multi-OS languages are used.
(Remember to obfuscate any sensitive data used in examples)
AutoHotkey
ahk discussion
<lang autohotkey>sSubject:= "greeting" sText := "hello" sFrom := "ahk@rosettacode" sTo := "whomitmayconcern"
sServer := "smtp.gmail.com" ; specify your SMTP server nPort := 465 ; 25 bTLS := True ; False inputbox, sUsername, Username inputbox, sPassword, password
COM_Init() pmsg := COM_CreateObject("CDO.Message") pcfg := COM_Invoke(pmsg, "Configuration") pfld := COM_Invoke(pcfg, "Fields")
COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/sendusing", 2) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout", 60) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/smtpserver", sServer) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/smtpserverport", nPort) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/smtpusessl", bTLS) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/sendusername", sUsername) COM_Invoke(pfld, "Item", "http://schemas.microsoft.com/cdo/configuration/sendpassword", sPassword) COM_Invoke(pfld, "Update")
COM_Invoke(pmsg, "Subject", sSubject) COM_Invoke(pmsg, "From", sFrom) COM_Invoke(pmsg, "To", sTo) COM_Invoke(pmsg, "TextBody", sText) COM_Invoke(pmsg, "Send")
COM_Release(pfld) COM_Release(pcfg) COM_Release(pmsg) COM_Term()
- Include COM.ahk</lang>
Mathematica
Mathematica has the built-in function SendMail, example: <lang Mathematica> SendMail["From" -> "from@email.com", "To" -> "to@email.com",
"Subject" -> "Sending Email from Mathematica", "Body" -> "Hello world!", "Server" -> "smtp.email.com"]
</lang> The following options can be specified: <lang Mathematica> "To" "Cc" "Bcc" "Subject" "Body" "Attachments" "From" "Server" "EncryptionProtocol" "Fullname" "Password" "PortNumber" "ReplyTo" "ServerAuthentication" "UserName" </lang> Possible options for EncryptionProtocol are: "SSL","StartTLS" and "TLS". This function should work fine on all the OS's Mathematica runs, which includes the largest 3: Windows, Linux, Mac OSX.
OCaml
- using the library smtp-mail-0.1.3
<lang ocaml>let h = Smtp.connect "smtp.gmail.fr";; Smtp.helo h "hostname";; Smtp.mail h "<john.smith@example.com>";; Smtp.rcpt h "<john-doe@example.com>";; let email_header = "\ From: John Smith <john.smith@example.com> To: John Doe <john-doe@example.com> Subject: surprise";; let email_msg = "Happy Birthday";; Smtp.data h (email_header ^ "\r\n\r\n" ^ email_msg);; Smtp.quit h;;</lang>
Python
The function returns a dict of any addresses it could not forward to; other connection problems raise errors.
Tested on Windows, it should work on all POSIX platforms.
<lang python>import smtplib
def sendemail(from_addr, to_addr_list, cc_addr_list,
subject, message, login, password, smtpserver='smtp.gmail.com:587'): header = 'From: %s\n' % from_addr header += 'To: %s\n' % ','.join(to_addr_list) header += 'Cc: %s\n' % ','.join(cc_addr_list) header += 'Subject: %s\n\n' % subject message = header + message server = smtplib.SMTP(smtpserver) server.starttls() server.login(login,password) problems = server.sendmail(from_addr, to_addr_list, message) server.quit() return problems</lang>
Example use: <lang python>sendemail(from_addr = 'python@RC.net',
to_addr_list = ['RC@gmail.com'], cc_addr_list = ['RC@xx.co.uk'], subject = 'Howdy', message = 'Howdy from a python function', login = 'pythonuser', password = 'XXXXX')
</lang>
Sample Email received:
Message-ID: <4a4a1e78.0717d00a.1ba8.ffcfdbdd@xx.google.com> Date: Tue, 30 Jun 2009 22:04:56 -0700 (PDT) From: python@RC.net To: RC@gmail.com Cc: RC@xx.co.uk Subject: Howdy Howdy from a python function
R
R does not have a built-in facility for sending emails though some code for this, written by Ben Bolker, is available here.
Ruby
Uses the
gem TMail
<lang ruby>require 'base64' require 'net/smtp' require 'tmail'
module SendEmail
def self.send_email(from, to, subject, body, options={}) opts = handle_options(options) msg = build_email(from, to, subject, body, opts) args = [opts[:server], opts[:port], opts[:helo], opts[:username], opts[:password], opts[:authtype]] Net::SMTP.start(*args) do |smtp| smtp.send_message(msg.to_s, msg.from[0], msg.to) end end
def self.handle_options(options) opts = {:attachments => [], :server => 'localhost'} unless options.nil? options.each do |key, value| # ensure keys are lower case symbols opts[key.to_s.downcase.to_sym] = value end end opts end
def self.build_email(from, to, subject, body, opts) msg = TMail::Mail.new msg.from = from msg.to = to msg.subject = subject msg.body = body msg.cc = opts[:cc] if opts[:cc] msg.bcc = opts[:bcc] if opts[:bcc] # attach attachments opts[:attachments].select {|file| File.readable?(file)}.each do |file| attach = TMail::Mail.new attach.body = Base64.encode64(File.read(file)) attach.transfer_encoding = 'base64' attach.set_disposition("attachment", {:filename => file}) msg.parts << attach end msg end
end
SendEmail.send_email(
'sender@sender.invalid', %w{ recip1@recipient.invalid recip2@example.com }, 'the subject', "the body\nhas lines", { :attachments => %w{ file1 file2 file3 }, :server => 'mail.example.com', :helo => 'sender.invalid', :username => 'user', :password => 'secret' }
)</lang>
Tcl
Also may use the tls package (needed for sending via gmail). <lang tcl>package require smtp package require mime package require tls
set gmailUser ******* set gmailPass hunter2; # Hello, bash.org!
proc send_simple_message {recipient subject body} {
global gmailUser gmailPass
# Build the message set token [mime::initialize -canonical text/plain -string $body] mime::setheader $token Subject $subject
# Send it! smtp::sendmessage $token -userame $gamilUser -password $gmailPass \ -recipients $recipient -servers smtp.gmail.com -ports 587
# Clean up mime::finalize $token
}
send_simple_message recipient@example.com "Testing" "This is a test message."</lang>