#!/usr/bin/gawk -f # ########################################################################################## # # AWK script containing a simple SMTP client using the gtk-server. No error checking. # # (C) October 22, 2003 Peter van Eerten # # Please check your environment settings "LC_ALL" and "LD_LIBRARY_PATH", e.g.: # # BASH: export LC_ALL=nl_NL (or use your own locale) # BASH: export LD_LIBRARY_PATH=/usr/X11R6/lib # # Changed to GTK-server 1.2 at October 10, 2004 # Changed to GTK-server 1.3 at December 6, 2004 # ########################################################################################## function Build_Gui() { # Define WINDOW print "gtk_init NULL NULL" |& GTK; GTK |& getline print "gtk_window_new 0" |& GTK; GTK |& getline WINDOW print "gtk_window_set_title " WINDOW " \"GNU Awk SMTP client using the gtk-server with STDIN\"" |& GTK; GTK |& getline print "gtk_widget_set_size_request " WINDOW " 500 400" |& GTK; GTK |& getline print "gtk_window_set_position " WINDOW " 1" |& GTK; GTK |& getline # Define table print "gtk_table_new 50 50 1" |& GTK; GTK |& getline TABLE print "gtk_container_add " WINDOW " " TABLE |& GTK; GTK |& getline # Define sender's mail entry print "gtk_label_new \"Sender's mail:\"" |& GTK; GTK |& getline LABEL1 print "gtk_misc_set_alignment " LABEL1 " 0 0" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " LABEL1 " 1 12 2 5" |& GTK; GTK |& getline print "gtk_entry_new" |& GTK; GTK |& getline ENTRY1 print "gtk_table_attach_defaults " TABLE " " ENTRY1 " 12 49 2 5" |& GTK; GTK |& getline # Define recipient entry print "gtk_label_new \"Recipient's mail:\"" |& GTK; GTK |& getline LABEL2 print "gtk_misc_set_alignment " LABEL2 " 0 0" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " LABEL2 " 1 12 7 10" |& GTK; GTK |& getline print "gtk_entry_new" |& GTK; GTK |& getline ENTRY2 print "gtk_table_attach_defaults " TABLE " " ENTRY2 " 12 49 7 10" |& GTK; GTK |& getline # Define name entry print "gtk_label_new \"Sender's name:\"" |& GTK; GTK |& getline LABEL3 print "gtk_misc_set_alignment " LABEL3 " 0 0" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " LABEL3 " 1 12 12 15" |& GTK; GTK |& getline print "gtk_entry_new" |& GTK; GTK |& getline ENTRY3 print "gtk_table_attach_defaults " TABLE " " ENTRY3 " 12 24 12 15" |& GTK; GTK |& getline # Define subject entry print "gtk_label_new Subject:" |& GTK; GTK |& getline LABEL5 print "gtk_misc_set_alignment " LABEL5 " 0 0" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " LABEL5 " 25 31 12 15" |& GTK; GTK |& getline print "gtk_entry_new" |& GTK; GTK |& getline ENTRY5 print "gtk_table_attach_defaults " TABLE " " ENTRY5 " 31 49 12 15" |& GTK; GTK |& getline # Define message area print "gtk_text_new NULL NULL" |& GTK; GTK |& getline TEXT print "gtk_text_set_editable " TEXT " 1" |& GTK; GTK |& getline print "gtk_text_set_word_wrap " TEXT " 1" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " TEXT " 1 47 17 42" |& GTK; GTK |& getline print "gtk_adjustment_new 0 0 100 1 1 5" |& GTK; GTK |& getline ADJ print "gtk_text_set_adjustments " TEXT " NULL " ADJ |& GTK; GTK |& getline print "gtk_vscrollbar_new " ADJ |& GTK ; GTK |& getline SCROLL print "gtk_table_attach_defaults " TABLE " " SCROLL " 47 49 17 42" |& GTK; GTK |& getline # Define SMTP server entry print "gtk_label_new \"SMTP server:\"" |& GTK; GTK |& getline LABEL4 print "gtk_misc_set_alignment " LABEL4 " 0 0" |& GTK; GTK |& getline print "gtk_table_attach_defaults " TABLE " " LABEL4 " 1 12 45 48" |& GTK; GTK |& getline print "gtk_entry_new" |& GTK; GTK |& getline ENTRY4 print "gtk_table_attach_defaults " TABLE " " ENTRY4 " 12 25 45 48" |& GTK; GTK |& getline # Define SEND button print "gtk_button_new_with_label Send" |& GTK; GTK |& getline SENDBUTTON print "gtk_table_attach_defaults " TABLE " " SENDBUTTON " 36 42 44 49" |& GTK; GTK |& getline # Define EXIT button print "gtk_button_new_with_label Exit" |& GTK; GTK |& getline EXITBUTTON print "gtk_table_attach_defaults " TABLE " " EXITBUTTON " 43 49 44 49" |& GTK; GTK |& getline # Show all widgets print "gtk_widget_show_all " WINDOW |& GTK; GTK |& getline # Put focus to name entry print "gtk_widget_grab_focus " ENTRY2 |& GTK; GTK |& getline # Fill in some defaults print "gtk_entry_set_text " ENTRY1 " \"name@somewhere.com\"" |& GTK; GTK |& getline print "gtk_entry_set_text " ENTRY3 " \"Your Name\"" |& GTK; GTK |& getline print "gtk_entry_set_text " ENTRY4 " \"localhost\"" |& GTK; GTK |& getline } ################################################################################# function Send_Mail (l_smtp, l_from, l_name, l_to, l_sub, l_data, l_mail, l_tmp) { print "gtk_entry_get_text " ENTRY1 |& GTK; GTK |& getline l_from print "gtk_entry_get_text " ENTRY2 |& GTK; GTK |& getline l_to print "gtk_entry_get_text " ENTRY3 |& GTK; GTK |& getline l_name print "gtk_entry_get_text " ENTRY4 |& GTK; GTK |& getline l_smtp print "gtk_entry_get_text " ENTRY5 |& GTK; GTK |& getline l_sub print "gtk_editable_get_chars " TEXT " 0 -1" |& GTK; GTK |& getline l_data # Setup connection to mailserver l_mail = "/inet/tcp/0/" l_smtp "/25" print "EHLO localhost" |& l_mail; l_mail |& getline print "MAIL FROM: <" l_from ">" |& l_mail; l_mail |& getline print "RCPT TO: <" l_to ">" |& l_mail; l_mail |& getline print "DATA" |& l_mail; l_mail |& getline print "From: " l_name " <" l_from ">" |& l_mail print "To: <" l_to ">" |& l_mail print "Reply-To: " l_name " <" l_from ">" |& l_mail print "User-Agent: GNU Awk GTK-SERVER" |& l_mail print "Subject: " l_sub |& l_mail print l_data |& l_mail print "." |& l_mail; l_mail |& getline print "QUIT" |& l_mail; l_mail |& getline # Cleanup text entry's print "gtk_editable_delete_text " ENTRY2 " 0 -1" |& GTK; GTK |& getline print "gtk_editable_delete_text " ENTRY5 " 0 -1" |& GTK; GTK |& getline # Cleanup mail message print "gtk_text_set_point " TEXT " 0" |& GTK; GTK |& getline print "gtk_text_get_length " TEXT |& GTK; GTK |& getline l_tmp print "gtk_text_forward_delete " TEXT " " l_tmp |& GTK ; GTK |& getline # Put focus to name entry print "gtk_widget_grab_focus " ENTRY2 |& GTK; GTK |& getline # In case of large mails flush all AWK output buffers to avoid SMTP connection time-out fflush (l_mail) # Terminate SMTP connection close (l_mail) } ################################################################################# BEGIN{ GTK = "gtk-server stdin" Build_Gui() do { print "gtk_server_callback wait" |& GTK; GTK |& getline EVENT if (EVENT == SENDBUTTON) Send_Mail() } while (EVENT != EXITBUTTON) print "gtk_exit 0" |& GTK close(GTK) fflush("") }