takg

Using _INetSmtpMailCom.au3 with Gmail

10 posts in this topic

I can't get _INetSmtpMailCom.au3 to work with Gmail, SMTP, TLS/SSL on port 587. After a long delay I get message "The transport failed to connect to the server."

I have been using telnet and openssl to try to troubleshoot. For some reason, the only port that works in telnet and openssl is 587 (on Windows 7 Pro and 8 Pro, both 64-bit). Port 25 and 465 never connect (black screen in telnet and crash with openssl). I don't think this is a firewall issue but not sure it matters as long as 587 connects.

The Gmail account has 2-step authentication off and "Access for less secure apps" is allowed in accounts.google.com. I know I need a App password if I want to use 2-step authentication (eventually I'd like to use the App password method but it is off for now).

I have gotten openssl to log into the account but it requires the username and password be converted to base64. Does the  _INetSmtpMailCom.au3  need the base64 encoded username and password as well?

The openssl line that gets into account is:

openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf

Not sure it is relevant, but with openssl I can't get past MAIL FROM: (error 555). I have tried base64 as well as plain text with and without the angle brackets (e.g., test@gmail.com and <test@gmail.com>)

I will post code if needed but I think this has something to do with the formatting of the parameters.

 

 

 

Share this post


Link to post
Share on other sites



It only works for me with port 465 and get the same error with 587.

I have the 2 step authentication switched on.

Jos


Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

telnet smtp.gmail.com 465 doesn't do anything for me; I just get a blank screen. So, I think the problem is with my setup. Maybe Verizon FIOS is blocking 465.

If I use telnet smtp.gmail.com 587 I get: 220 mx.google.com ESMTP h35sm4399067qgd.26 - gsmtp. Does that mean it worked?

 
Do you use plain text in the _INetSmtpMailCom username and password parameters?

Share this post


Link to post
Share on other sites

 

telnet smtp.gmail.com 465 doesn't do anything for me; I just get a blank screen. So, I think the problem is with my setup. Maybe Verizon FIOS is blocking 465.

If I use telnet smtp.gmail.com 587 I get: 220 mx.google.com ESMTP h35sm4399067qgd.26 - gsmtp. Does that mean it worked?

 
Do you use plain text in the _INetSmtpMailCom username and password parameters?

 

Don't know if telnet should work as it is supposed to be a ssl encrypted connection.

Jos


Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

Ok, with your advice and this link I at least have it working in openssl:

http://pastebin.com/r0LiwdZy

I also realized I had IMAP disabled in the Gmail account I was using. Not sure if that matters.

It looks like you don't need the " -starttls smtp" command in openssl and just typing openssl on the command line alone to put it in openssl prompt seems to work better.

In openssl I still have to encode username and password to base64. I used this app to encode (don't trust online converters):

http://www.activexdev.com/app-base64-tools-software.htm

Can anyone tell me if _INetSmtpMailCom.au3 needs to have username and password converted to base64? My guess is no but I would like someone to confirm. 

I will post again if I get this working in autoit.

Share this post


Link to post
Share on other sites

Can anyone tell me if _INetSmtpMailCom.au3 needs to have username and password converted to base64? My guess is no but I would like someone to confirm. 

I will post again if I get this working in autoit.

Nope...  just use your google name without the @gmail.com

Jos


Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

Ok. Still not working in autoit (even after updating to Autoit 3.3.12.0).

I am able to send email fine in openssl using similar settings on port 465 except that in openssl you have to use base64 encoding of username and password. I think this rules out settings in Gmail, ISP, firewalls, and other computer/network settings. 

Here is my script (with modified from/to email addresses and password). I tried it with and without @gmail.com for username and from address.

Error message is "The transport failed to connect to the server."

Hopefully someone can figure out what I am doing wrong.

;#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#AutoIt3Wrapper_Run_Debug_Mode=Y                 ;(Y/N) Run Script with console debugging. Default=N

#Region INCLUDE
;##################################
; Include
;##################################
#include <file.au3>
#include <Inet.au3>
#include <MsgBoxConstants.au3>
#EndRegion INCLUDE

#Region Variables
;##################################
; Variables
;##################################66
Global Enum _
        $g__INetSmtpMailCom_ERROR_FileNotFound = 1, _
        $g__INetSmtpMailCom_ERROR_Send, _
        $g__INetSmtpMailCom_ERROR_ObjectCreation, _
        $g__INetSmtpMailCom_ERROR_COUNTER

Global Const $g__cdoSendUsingPickup = 1 ; Send message using the local SMTP service pickup directory.
Global Const $g__cdoSendUsingPort = 2 ; Send the message using the network (SMTP over the network). Must use this to use Delivery Notification

Global Const $g__cdoAnonymous = 0 ; Do not authenticate
Global Const $g__cdoBasic = 1 ; basic (clear-text) authentication
Global Const $g__cdoNTLM = 2 ; NTLM

; Delivery Status Notifications
Global Const $g__cdoDSNDefault = 0 ; None
Global Const $g__cdoDSNNever = 1 ; None
Global Const $g__cdoDSNFailure = 2 ; Failure
Global Const $g__cdoDSNSuccess = 4 ; Success
Global Const $g__cdoDSNDelay = 8 ; Delay
Global Const $g__cdoDSNSuccessFailOrDelay = 14 ; Success, failure or delay
#EndRegion Variables

; *** Start sending email here ***
$s_SmtpServer = "smtp.gmail.com"
$s_FromName = "Tester"
$s_FromAddress = "fromemail"
$s_ToAddress = "toemail@gmail.com"
$s_Body = "This is a test"
$s_Subject = "Subject.. test"
$s_AttachFiles = ""
$s_CcAddress = ""
$s_BccAddress = ""
$s_Username = "fromemail"  ;<= THIS IS REQUIRED
$s_Password = "frompassword" ;<= THIS IS REQUIRED
$s_IPPort = 465
$s_SSL    = True
$s_bIsHTMLBody = False
$s_iDSNOptions = $g__cdoDSNDefault

local $resp = _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $s_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password, $s_IPPort, $s_SSL, $s_bIsHTMLBody, $s_iDSNOptions)
MsgBox(4096,"Response",$resp)

#Region Example Script
;##################################
; Example Script
;##################################
;~ _Example()

Func _Example()
    Local $sSmtpServer = "MailServer" ; address for the smtp-server to use - REQUIRED
    Local $sFromName = "Name" ; name from who the email was sent
    Local $sFromAddress = "your@Email.Address.com" ; address from where the mail should come
    Local $sToAddress = "your@Email.Address.com" ; destination address of the email - REQUIRED
    Local $sSubject = "Userinfo" ; subject from the email - can be anything you want it to be
    Local $sBody = "" ; the messagebody from the mail - can be left blank but then you get a blank mail
    Local $sAttachFiles = "" ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed
    Local $sCcAddress = "CCadress1@test.com" ; address for cc - leave blank if not needed
    Local $sBccAddress = "BCCadress1@test.com" ; address for bcc - leave blank if not needed
    Local $sImportance = "Normal" ; Send message priority: "High", "Normal", "Low"
    Local $sUsername = "******" ; username for the account used from where the mail gets sent - REQUIRED
    Local $sPassword = "********" ; password for the account used from where the mail gets sent - REQUIRED
    Local $iIPPort = 25 ; port used for sending the mail
    Local $bSSL = False ; enables/disables secure socket layer sending - set to True if using httpS
    ; Local $IPPort = 465  ; GMAIL port used for sending the mail
    ; Local $bSSL = True   ; GMAIL enables/disables secure socket layer sending - set to True if using httpS

    Local $bIsHTMLBody = False
    Local $iDSNOptions = $g__cdoDSNDefault

    Local $rc = _INetSmtpMailCom($sSmtpServer, $sFromName, $sFromAddress, $sToAddress, $sSubject, $sBody, $sAttachFiles, $sCcAddress, $sBccAddress, $sImportance, $sUsername, $sPassword, $iIPPort, $bSSL, $bIsHTMLBody, $iDSNOptions)
    If @error Then
        MsgBox(0, "_INetSmtpMailCom(): Error sending message", _
                "Error code: " & @error & @CRLF & @CRLF & _
                "Error Hex Number: " & _INetSmtpMailCom_ErrHexNumber() & @CRLF & @CRLF & _
                "Description: " & _INetSmtpMailCom_ErrDescription() & @CRLF & @CRLF & _
                "Description (rc): " & $rc & @CRLF & @CRLF & _
                "ScriptLine: " & _INetSmtpMailCom_ErrScriptLine() _
                )
        ConsoleWrite("### COM Error !  Number: " & _INetSmtpMailCom_ErrHexNumber() & "   ScriptLine: " & _INetSmtpMailCom_ErrScriptLine() & "   Description:" & _INetSmtpMailCom_ErrDescription() & @LF)
    EndIf

EndFunc   ;==>_Example

#EndRegion Example Script

#Region UDF Functions
; The UDF
; #FUNCTION# ====================================================================================================================
; Name ..........: _INetSmtpMailCom
; Description ...:
; Syntax ........: _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress[, $s_Subject = ""[, $as_Body = ""[,
;                  $s_AttachFiles = ""[, $s_CcAddress = ""[, $s_BccAddress = ""[, $s_Importance = "Normal"[, $s_Username = ""[,
;                  $s_Password = ""[, $IPPort = 25[, $bSSL = False[, $bIsHTMLBody = False[, $iDSNOptions = $g__cdoDSNDefault]]]]]]]]]]]])
; Parameters ....: $s_SmtpServer        - A string value.
;                  $s_FromName          - A string value.
;                  $s_FromAddress       - A string value.
;                  $s_ToAddress         - A string value.
;                  $s_Subject           - [optional] A string value. Default is "".
;                  $s_Body              - [optional] A string value. Default is "".
;                  $s_AttachFiles       - [optional] A string value. Default is "".
;                  $s_CcAddress         - [optional] A string value. Default is "".
;                  $s_BccAddress        - [optional] A string value. Default is "".
;                  $s_Importance        - [optional] A string value. Default is "Normal".
;                  $s_Username          - [optional] A string value. Default is "".
;                  $s_Password          - [optional] A string value. Default is "".
;                  $IPPort              - [optional] An integer value. Default is 25.
;                  $bSSL                - [optional] A binary value. Default is False.
;                  $bIsHTMLBody         - [optional] A binary value. Default is False.
;                  $iDSNOptions         - [optional] An integer value. Default is $g__cdoDSNDefault.
; Return values .: None
; Author ........: Jos
; Modified ......: mLipok
; Remarks .......:
; Related .......: http://www.autoitscript.com/forum/topic/23860-smtp-mailer-that-supports-html-and-attachments/
; Link ..........: http://www.autoitscript.com/forum/topic/167292-smtp-mailer-udf/
; Example .......: Yes
; ===============================================================================================================================
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $bSSL = False, $bIsHTMLBody = False, $iDSNOptions = $g__cdoDSNDefault)
    ; init Error Handler
    _INetSmtpMailCom_ErrObjInit()

    Local $objEmail = ObjCreate("CDO.Message")
    If Not IsObj($objEmail) Then Return SetError($g__INetSmtpMailCom_ERROR_ObjectCreation, Dec(_INetSmtpMailCom_ErrHexNumber()), _INetSmtpMailCom_ErrDescription())

    ; Clear previous Err information
    _INetSmtpMailCom_ErrHexNumber(0)
    _INetSmtpMailCom_ErrDescription('')
    _INetSmtpMailCom_ErrScriptLine('')

    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress

    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject

    ; Select whether or not the content is sent as plain text or HTM
    If $bIsHTMLBody Then
        $objEmail.Textbody = $s_Body & @CRLF
    Else
        $objEmail.HTMLBody = $s_Body
    EndIf

    ; Add Attachments
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                Return SetError($g__INetSmtpMailCom_ERROR_FileNotFound, 0, 0)
            EndIf
        Next
    EndIf

    ; Set Email Configuration
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = $g__cdoSendUsingPort
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 Then $IPPort = 25
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = $g__cdoBasic
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    $objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = $bSSL

    ;Update Configuration Settings
    $objEmail.Configuration.Fields.Update

    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch

    ; Set DSN options
    If $iDSNOptions <> $g__cdoDSNDefault And $iDSNOptions <> $g__cdoDSNNever Then
        $objEmail.DSNOptions = $iDSNOptions
        $objEmail.Fields.Item("urn:schemas:mailheader:disposition-notification-to") = $s_FromAddress
;~      $objEmail.Fields.Item("urn:schemas:mailheader:return-receipt-to") = $s_FromAddress
    EndIf

    ; Update Importance and Options fields
    $objEmail.Fields.Update

    ; Sent the Message
    $objEmail.Send

    If @error Then
        _INetSmtpMailCom_ErrObjCleanUp()
        Return SetError($g__INetSmtpMailCom_ERROR_Send, Dec(_INetSmtpMailCom_ErrHexNumber()), _INetSmtpMailCom_ErrDescription())
    EndIf

    ; CleanUp
    $objEmail = ""
    _INetSmtpMailCom_ErrObjCleanUp()

EndFunc   ;==>_INetSmtpMailCom

;
; Com Error Handler
Func _INetSmtpMailCom_ErrObjInit($bParam = Default)
    Local Static $oINetSmtpMailCom_Error = Default
    If $bParam == 'CleanUp' And $oINetSmtpMailCom_Error <> Default Then
        $oINetSmtpMailCom_Error = ''
        Return $oINetSmtpMailCom_Error
    EndIf
    If $oINetSmtpMailCom_Error = Default Then
        $oINetSmtpMailCom_Error = ObjEvent("AutoIt.Error", "_INetSmtpMailCom_ErrFunc")
    EndIf
    Return $oINetSmtpMailCom_Error
EndFunc   ;==>_INetSmtpMailCom_ErrObjInit

Func _INetSmtpMailCom_ErrObjCleanUp()
    _INetSmtpMailCom_ErrObjInit('CleanUp')
EndFunc   ;==>_INetSmtpMailCom_ErrObjCleanUp

Func _INetSmtpMailCom_ErrHexNumber($vData = Default)
    Local Static $vReturn = 0
    If $vData <> Default Then $vReturn = $vData
    Return $vReturn
EndFunc   ;==>_INetSmtpMailCom_ErrHexNumber

Func _INetSmtpMailCom_ErrDescription($sData = Default)
    Local Static $sReturn = ''
    If $sData <> Default Then $sReturn = $sData
    Return $sReturn
EndFunc   ;==>_INetSmtpMailCom_ErrDescription

Func _INetSmtpMailCom_ErrScriptLine($iData = Default)
    Local Static $iReturn = ''
    If $iData <> Default Then $iReturn = $iData
    Return $iReturn
EndFunc   ;==>_INetSmtpMailCom_ErrScriptLine

Func _INetSmtpMailCom_ErrFunc()
    _INetSmtpMailCom_ErrObjInit()
    _INetSmtpMailCom_ErrHexNumber(Hex(_INetSmtpMailCom_ErrObjInit().number, 8))
    _INetSmtpMailCom_ErrDescription(StringStripWS(_INetSmtpMailCom_ErrObjInit().description, 3))
    _INetSmtpMailCom_ErrScriptLine(_INetSmtpMailCom_ErrObjInit().ScriptLine)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>_INetSmtpMailCom_ErrFunc

#EndRegion UDF Functions

Share this post


Link to post
Share on other sites

There is a discrepancy between your Func parameters and the line calling the Func.

The param $s_Importance is missing in the calling line. ;)

local $resp = _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject,      $s_Body,      $s_AttachFiles,      $s_CcAddress,      $s_BccAddress,                                $s_Username,      $s_Password, $s_IPPort, $s_SSL, $s_bIsHTMLBody, $s_iDSNOptions)
Func          _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $s_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $bSSL = False, $bIsHTMLBody = False, $iDSNOptions = $g__cdoDSNDefault)

 Jos


Visit the SciTE4AutoIt3 Download page for the latest versions        Beta files                                                          Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

Damn Jos. That was it. Sorry for being so lame that I couldn't see that.

Thanks for all your help. I really appreciate it.

Share this post


Link to post
Share on other sites

hi takg

can you post full working script

thanks..

On 3/6/2015 at 5:57 PM, takg said:

Damn Jos. That was it. Sorry for being so lame that I couldn't see that.

Thanks for all your help. I really appreciate it.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now