Отправка электронной почты с помощью задачи «Сценарий» в ошибках цикла «цикл по каждому элементу» в диспетчере соединений SMTP - PullRequest
1 голос
/ 11 июня 2019

У меня есть контейнер цикла по каждому элементу с задачей отправки почты с помощью диспетчера подключений SMTP, который успешно отправляет электронные письма.Мне нужно отправлять электронные письма в формате HTML и понимать, что Задача «Отправить почту» этого не сделает.Я добавил задачу «Сценарий» для включения текста HTML в тело письма, но ошибки сценария с

Не удалось разрешить удаленное имя

Использование того жеДиспетчер соединений SMTP, который работает в задаче «Отправить почту».Как я могу отправить несколько электронных писем на список адресов электронной почты?Любая помощь будет принята с благодарностью.

вся ошибка:

System.Net.Mail.SmtpException was unhandled by user code
  HResult=-2146233088
  Message=Failure sending mail.
  Source=System
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
       at ST_209a900aa97949759ea05ad934ade067.ScriptMain.Main() in c:\Users\sschildt\AppData\Local\Temp\2\Vsta\e2ae5c29103d447fad1855720cffe591\ScriptMain.cs:line 117
  InnerException: System.Net.WebException
       HResult=-2146233079
       Message=The remote name could not be resolved: 'SmtpServer=xxxx.xxxx.xxxx.edu;UseWindowsAuthentication=True;EnableSsl=False;'
       Source=System
       StackTrace:
            at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
            at System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
            at System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
            at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
            at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
            at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint)
            at System.Net.Mail.SmtpClient.GetConnection()
            at System.Net.Mail.SmtpClient.Send(MailMessage message)
       InnerException: 

РЕШЕНИЕ:

#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Net.Mail;          // Added
#endregion

namespace ST_ccd5e092bfdc417c8c29f1c22c390108
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        public void Main()
        {
            String SendMailFrom = Dts.Variables["mailfrom"].Value.ToString();
            String SendMailTo = Dts.Variables["mailto"].Value.ToString();
            String SendMailToName = Dts.Variables["mailname"].Value.ToString();
            String SendMailSubject = Dts.Variables["mailsubject"].Value.ToString();
            String SendMailBody = Dts.Variables["mailbody"].Value.ToString();
            String SendMailAttach = Dts.Variables["vattach"].Value.ToString(); 
            SendMailBody = SendMailToName + ",<p>" + SendMailBody;

            String SmtpServer = Dts.Connections["SMTP Connection Manager"].Properties["SmtpServer"].GetValue(Dts.Connections["SMTP Connection Manager"]).ToString();

            // Create an email and change the format to HTML
            MailMessage myHtmlFormattedMail = new MailMessage(SendMailFrom, SendMailTo, SendMailSubject, SendMailBody);
            myHtmlFormattedMail.IsBodyHtml = true;

            // Create a SMTP client to send the email
            SmtpClient mySmtpClient = new SmtpClient(SmtpServer);

            if (String.IsNullOrEmpty(SendMailAttach))
            {
               // 
            }
            else
            {
                myHtmlFormattedMail.Attachments.Add(new Attachment(SendMailAttach));
            }
            mySmtpClient.Send(myHtmlFormattedMail);

            // Close Script Task with success
            Dts.TaskResult = (int)ScriptResults.Success;
        }

        #region ScriptResults declaration

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

    }
}

1 Ответ

0 голосов
/ 12 июня 2019

Я вижу, вы не опубликовали полный журнал ошибок, но вы можете попробовать что-то вроде этого:

private static void sendEmail()
    {
        // Change below parameters
        string ToEmailAddress = "toemailaddress";
        string FromEmailAddress = "fromemailaddress";
        string FromEmailPassword = "fromemailpassworda";
        string EmailSubject = "Email Subject";
        string SmtpServerName = "smtpservername";
        string LogoFilePath = @"SomeLogoPicturePathWithFileName";
        int PortNumber = addportnumberhere;

        try
        {
            var mail = new MailMessage();

            // Email Text HTML
            StringBuilder mailBody = new StringBuilder();
            mailBody = CreatEmailBodyTextHtml(LogoFilePath);

            // Add Logo
            mail.IsBodyHtml = true;
            mail.Body = mailBody.ToString();
            mail.AlternateViews.Add(getEmbeddedImage(LogoFilePath, mailBody.ToString()));

            // Send Email
            SmtpClient SmtpServer = new SmtpClient(SmtpServerName);

            mail.From = new MailAddress(FromEmailAddress);
            mail.To.Add(ToEmailAddress);
            mail.Subject = EmailSubject;

            SmtpServer.Port = PortNumber;
            SmtpServer.UseDefaultCredentials = false;
            SmtpServer.Credentials = new NetworkCredential(FromEmailAddress, FromEmailPassword);
            SmtpServer.EnableSsl = false;
            SmtpServer.Send(mail);
        }
        catch (Exception s)
        {
            Console.WriteLine(s);
        }

    }

private static StringBuilder CreatEmailBodyTextHtml(string imgPath)
    {
        StringBuilder mailBody = new StringBuilder();
        mailBody.AppendFormat("<h1>Hi, This is a Test Email.</h1>");
        mailBody.AppendFormat("Dear Sir/Madam, ");
        mailBody.AppendFormat("<br />");
        mailBody.AppendFormat("<br />");
        mailBody.AppendFormat("With Regards");
        mailBody.AppendFormat("<br />");
        mailBody.AppendFormat("<br />");
        mailBody.AppendFormat("Tester.</p>");
        mailBody.AppendFormat("<br />");
        mailBody.AppendFormat("<img src=\"" + imgPath +"\">");

        return mailBody;
    }
public static AlternateView getEmbeddedImage(string filePath, string mailBody)
    {
        LinkedResource res = new LinkedResource(filePath);
        res.ContentId = Guid.NewGuid().ToString();
        string htmlBody = @"<img src='cid:" + res.ContentId + "'" + "width= \"700\" height = \"300\"" + @"/>" + mailBody;
        AlternateView alternateView = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
        alternateView.LinkedResources.Add(res);
        return alternateView;
    }

Это работает для меня с Gmail и с моим SMTP-сервером.Вы можете изменить метод sendEmail так, чтобы он принимал toEmailAddress и вызывал его в цикле.Адрес toEmailAddress может быть из txt-файла, таблицы базы данных SQL или чего-то еще.Я попробовал приведенный выше код с приведенными ниже примерами данных, используя Gmail SMTP, и получил письмо в течение 1 секунды.

string ToEmailAddress = "xyzto@gmail.com";
string FromEmailAddress = "xyz@gmail.com";
string FromEmailPassword = "addyourpassword";
string EmailSubject = "Email Subject";
string SmtpServerName = "smtp.gmail.com";
string LogoFilePath = @"someimagepathwithfilename";
int PortNumber = 587;
...