#!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; # Configuration my $from_address = 'morena@morena.rip'; # Sender email address my $rdns_domain = 'rat.morena.rip'; # Sender's domain for HELO my $editor = '/usr/bin/ovi'; # Set editor to 'ovi' # Get the current date and time in local CET/CEST format my ($sec, $min, $hour, $day, $month, $year, $wday, $yday, $isdst) = localtime(); $year += 1900; # Correct the year $month += 1; # Correct the month (January is 0 in localtime) # Format the date in RFC 5322 format my $date = sprintf("%s, %02d %s %4d %02d:%02d:%02d %s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday], $day, qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[$month], $year, $hour, $min, $sec, ($isdst ? "+0200" : "+0100") # CEST (+0200) if DST, otherwise CET (+0100) ); # Get recipient's email and domain print "Enter recipient (To): "; my $to_address = ; chomp $to_address; # Extract the domain part from the email address my ($user, $domain) = split('@', $to_address); # Execute nslookup command to get MX records my $nslookup_output = `nslookup -type=MX $domain`; if ($? != 0) { die "Failed to query MX records for domain $domain: $!\n"; } # Parse the nslookup output to find the MX records, excluding the priority number my @mx_records = $nslookup_output =~ /mail exchanger\s+=\s+\d+\s+(\S+)/g; # Declare $mail_server before using it my $mail_server; if (@mx_records) { # Get the first mail server (the one with the lowest priority) $mail_server = $mx_records[0]; # Assuming nslookup returns the correct MX server print "Using mail server: $mail_server\n"; } else { die "No MX records found for domain $domain.\n"; } # Get subject from user input print "Enter subject: "; my $subject = ; chomp $subject; # Temporary file to hold the email body my $tempfile = "/tmp/email_body.txt"; # Open the text editor to compose the message body print "Opening text editor ($editor) to compose the message body...\n"; system("$editor", $tempfile); # Read the contents of the temporary file (email body) open my $fh, '<', $tempfile or die "Cannot open temporary file $tempfile: $!\n"; my $message_body = do { local $/; <$fh> }; close $fh; # Remove the temporary file after reading the email body unlink $tempfile; # Create a socket to the recipient's mail server (MX record) my $sock = IO::Socket::INET->new( PeerHost => $mail_server, PeerPort => 25, Proto => 'tcp', ) or die "Failed to connect to $mail_server:25 - $!\n"; # Read server greeting my $response = <$sock>; print $response; # Print server greeting (e.g., 220 message) # Send HELO command with the sender's domain (rat.morena.rip) print $sock "HELO $rdns_domain\r\n"; $response = <$sock>; print $response; # Print server response # Send MAIL FROM command print $sock "MAIL FROM:<$from_address>\r\n"; $response = <$sock>; print $response; # Send RCPT TO command print $sock "RCPT TO:<$to_address>\r\n"; $response = <$sock>; print $response; # Send DATA command print $sock "DATA\r\n"; $response = <$sock>; print $response; # Write the email headers print $sock "From: $from_address\r\n"; print $sock "To: $to_address\r\n"; print $sock "Subject: $subject\r\n"; print $sock "Date: $date\r\n"; print $sock "MIME-Version: 1.0\r\n"; print $sock "Content-Type: text/plain; charset=\"UTF-8\"\r\n"; print $sock "\r\n"; # Blank line between headers and body # Write the email body print $sock "$message_body\r\n"; # End the DATA section with a single period (.) print $sock ".\r\n"; $response = <$sock>; print $response; # Send QUIT command to end the session print $sock "QUIT\r\n"; $response = <$sock>; print $response; # Close the socket close($sock); print "Email sent successfully!\n";