Dando continuidade a um tópico anterior ( como definir um objeto Account por MailItem.SendUsingAccount ao enviar um e-mail? ), estou interessado no fato de que uma das respostas naquele post usa SET ao definir a propriedade do item de e-mail, e uma não. Isso é bem estranho! Tenho um pedaço grande e bastante complexo de código VBA que
encontra a conta entre as disponíveis que corresponde a uma sequência que contém uma parte exclusiva do endereço de e-mail do qual desejo enviar
cria um novo item de e-mail e, em seguida, define a conta a ser usada para enviá-lo.
No meu código, a instrução SET precisa estar presente na etapa 1), mas precisa não estar lá na etapa 2), o que é bem estranho (inclusive SET gera um erro de tempo de execução 91). Acho que de alguma forma o objeto de conta está se transformando na string que é o endereço SMTP dessa conta, e que o Outlook está então trabalhando a partir desse endereço de e-mail para usar a conta necessária.
Obrigado. Partes principais do código:
a) Várias declarações
Public g_olapp As outlook.Application
Public g_ol_account As outlook.Account
Private olmsg As outlook.MailItem
b) Inicializar coisas
Set g_olapp = New outlook.Application
Set g_ol_account = find_account(g_from_email, b_err)
c) Encontre a função de conta, isso parece retornar um objeto, a instrução SET é necessária
Private Function find_account(s As String, b As Boolean) As outlook.Account
Dim p_olaccount As outlook.Account
Dim s_send_from As String
s_send_from = UCase(s)
If s_send_from = "" Then
If MsgBox("No account specified, do you want to use the default account <SPJUDGE> ?", Title:=box_title, Buttons:=vbYesNo + vbQuestion) = vbNo Then
b = True
Exit Function
End If
s_send_from = "SPJUDGE"
End If
Set find_account = Nothing
For Each p_olaccount In g_olapp.Session.Accounts
If (Not InStr(UCase(p_olaccount.SmtpAddress), s_send_from) = 0) Then
Set find_account = p_olaccount
s = p_olaccount.SmtpAddress
Exit Function
End If
Next
MsgBox "Account <" & s_send_from & "> not found" _
& String(2, 13) & "Program terminating", Title:=box_title, _
Buttons:=vbOKOnly + vbCritical
b = True
End Function
d) Faça o item de e-mail
Set olmsg = make_new_email(g_olapp, s_email)
e) Outra função para criar um novo objeto de e-mail.
Public Function make_new_email(olapp As Object, s As String) As outlook.MailItem
Dim arr() As String
Dim jloc As Integer
Dim jlb As Integer
Dim recip As outlook.Recipient
Set make_new_email = olapp.CreateItem(olMailItem)
' MsgBox g_ol_account note this does work.
With make_new_email
.SendUsingAccount = g_ol_account ' WHY NOT SET IN THIS LINE ??
If gb_set_reply Then
.ReplyRecipients.add (g_reply_to_email)
End If
.OriginatorDeliveryReportRequested = b_askfor_receipts
.ReadReceiptRequested = b_askfor_receipts
End With
s = Replace(s, "SIMON JUDGE", "", , , vbTextCompare)
arr = Split(s, ";") ' changed from comma Nov 2023
jlb = LBound(arr)
For jloc = jlb To UBound(arr)
Set recip = make_new_email.Recipients.add(Trim(arr(jloc)))
If jloc = jlb Then
recip.Type = olTo
Else
recip.Type = olCC
End If
Next jloc
End Function