ePolyglot: Examination and development of multilanguage programming using Eiffel, Python, and Haskell | ||
---|---|---|
Prev | Chapter 9. User Classes | Next |
Sending SMTP mail is a relatively straightforward task for many users, and Python provides a module and class for doing just that. Eiffel, unfortunately, does not, and for this example we leave it to the PYTHON_USER_CLASS class and the make_eiffel_stub.py script to do the bulk of the work of using the Python smtplib.SMTP module from within Eiffel.
To do so and make things easier, we do add a few Make targets to the project's makefile:
Example 9-4. Makefile targets for generating the classes
#PYTHON and SCRIPTPATH are initialized elsewhere to point to #the Python interpreter and the path to the ePolyglot scripts GENERATED_EIFFEL_FILES = smtplib_smtp.e #generated by the ePolyglot script "make_eiffel_stub.py" $(GENERATED_EIFFEL_FILES) : $(PYTHON) $(SCRIPTPATH)/make_eiffel_stub.py smtplib SMTP > smtplib_smtp.e |
This way, the Eiffel source file can be generated each time the project is made from scratch, which simplifies the build a touch and means that the automatically-generated class file is always current with the Python class in question.
The source for our sample program is below:
Example 9-5. The mail_test program
class MAIL_TEST --a simple class designed to send a quick mail message out. --using the python smtplib.SMTP library class inherit PYTHON_CLIENT_WRAPPER creation make feature usage_text : STRING is "Usage:%N%Tmail_test from-address to-% %address message-text%N%N" joined_strings( strings : FIXED_ARRAY[STRING]; delimiter : STRING ) : STRING is --create a string made of all the strings in 'strings' --separated by the delimiter local i : INTEGER do create Result.make( 0 ) from i := strings.lower until not strings.valid_index( i ) loop Result.append( strings.item( i ) ) i := i + 1 if strings.valid_index( i ) then Result.append( delimiter ) end end end from_address : STRING is do Result := argument( 1 ) end to_address : STRING is do Result := argument( 2 ) end message : STRING is do Result := joined_strings( command_arguments.slice( 3, command_arguments.upper ), " " ) end make is local r : PYTHON_OBJECT smtp : SMTPLIB_SMTP do py_initialize create smtp.from_init( Void ) if argument_count < 3 then std_output.put_string( usage_text ) else std_output.put_string( "Sending message:%NFrom: " + from_address + "%NTo: " + to_address + "%NMessage: " + message + "%N" ) r := smtp.connect( <<>> ) r := smtp.sendmail( << from_address, to_address, message >> ) r := smtp.quit end rescue if not py_err_occurred.is_null then py_err_print end end end |
Which, when executed, gives results similar to the following:
Example 9-6. Sample output from mail_test
[vputz@yak_prime smtp]$ ./mail_test Usage: mail_test from-address to-address message-text [vputz@yak_prime smtp]$ ./mail_test vputz vputz@localhost This is a test Sending message: From: vputz To: vputz@localhost Message: This is a test [vputz@yak_prime smtp]$ mail Mail version 8.1 6/6/93. Type ? for help. "/var/spool/mail/vputz": 1 message 1 new >N 1 vputz@yak_prime.wing Tue Aug 15 16:29 11/436 & 1 Message 1: From vputz@yak_prime.wingedyak.com Tue Aug 15 16:29:01 2000 Date: Tue, 15 Aug 2000 16:29:00 -0600 From: "Victor B. Putz" <vputz@yak_prime.wingedyak.com> This is a test & d 1 & q [vputz@yak_prime smtp]$ |