Как отправить электронную почту с помощью ASP .NET
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Configuration; using System.IO; using System.Linq; using System.Net.Mail; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web; namespace ProjectBuzzUtils { public static class EmailHelper { public static void SendEmail(string from, string toEmails, string ccEmails, string subject, object data, string templateType) { Dictionary<string, string> dataList = ExtractClassData(data); string body = CreateEmailBody(dataList, templateType); SendHtmlFormattedEmail(from, toEmails, ccEmails, subject, body); } private static string CreateEmailBody(Dictionary<string, string> replaceElement, string templateType) { string body = string.Empty; var templatePath = "~/Views/EmailTemplate/" + templateType + ".cshtml"; using (StreamReader reader = new StreamReader(HttpContext.Current.Server.MapPath(templatePath))) { body = reader.ReadToEnd(); foreach (var pair in replaceElement) { body = body.Replace(pair.Key, pair.Value); } } return body; } private static void SendHtmlFormattedEmail(string from, string toEmails, string ccEmails, string subject, string body) { string fromEmail = ConfigurationManager.AppSettings["FromEmail"].ToString(); string host = ConfigurationManager.AppSettings["Host"].ToString(); SmtpClient smtpClient = new SmtpClient(); int tryAgain = 10; bool failed = false; do { try { failed = false; using (MailMessage mailMessage = new MailMessage()) { MailMessage mm = new MailMessage(); mm.Body = body; mm.IsBodyHtml = true; if (!string.IsNullOrEmpty(toEmails)) { foreach (string email in toEmails.Split(',')) { mm.To.Add(new MailAddress(email)); } } if (!string.IsNullOrEmpty(ccEmails)) { foreach (string email in ccEmails.Split(',')) { mm.CC.Add(new MailAddress(email)); } } mm.From = new MailAddress(from); mm.Subject = subject; smtpClient.Host = host; smtpClient.Send(mm); } } catch (Exception ex) // I would avoid catching all exceptions equally, but ymmv { failed = true; tryAgain--; var exception = ex.Message.ToString(); smtpClient.Dispose(); //Other code for saving exception message to a log. } } while (failed && tryAgain != 0); } public static Dictionary<string, string> ExtractClassData(object o) { if (o == null) return new Dictionary<string, string>(); var type = o.GetType(); var propertyInfos = type.GetProperties() .Select(p => new { Name = p.GetCustomAttribute<DisplayAttribute>() != null ? p.GetCustomAttribute<DisplayAttribute>().Name : p.Name, FormatAttribute = p.GetCustomAttribute<DisplayFormatAttribute>(), Property = p, Type = p.PropertyType, Value = p.GetValue(o), }); var dictionary = new Dictionary<string, string>(); foreach (var property in propertyInfos.Where(p => p.Value != null)) { if (property.Value != null) { dictionary.Add("$$$" + property.Name + "$$$", FormatValue(property.Value, property.Type, property.FormatAttribute)); } } dictionary.Add("$$$Date_String$$$", DateTime.UtcNow.AddHours(5.5).ToString()); return dictionary; } private static string FormatValue(object value, Type type, DisplayFormatAttribute format) { if (value == null) return null; if (type.IsEnum || (Nullable.GetUnderlyingType(type) != null && Nullable.GetUnderlyingType(type).IsEnum)) { if (!Enum.IsDefined(type, value)) return value.ToString(); var display = type.GetField(value.ToString()).GetCustomAttribute<DisplayAttribute>(); if (display != null) return display.Name; return value.ToString(); } if (type == typeof(string)) return (string)value; if (format != null) return string.Format(format.DataFormatString, value); return value.ToString(); } } }
Что я уже пробовал:
/* -------------------------------------
ГЛОБАЛЬНЫЕ СБРОСЫ
------------------------------------- */
НВФ {
граница: отсутствует;
-ms-интерполяция-режим: бикубический;
максимальная ширина: 100%;
}
тело {
цвет фона: #f6f6f6;
семейство шрифтов: sans-serif;
-webkit-font-smoothing: сглаживание;
размер шрифта: 14px;
высота линии: 1,4;
маржа: 0;
прокладка: 0;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
стол {
границы-крах: отдельные;
mso-table-lspace: 2pt;
mso-table-rspace: 2pt;
ширина: 100%;
}
стол тд {
семейство шрифтов: sans-serif;
размер шрифта: 14px;
вертикальное выравнивание: сверху;
}
стол {
граница: средняя;
границы-цвет: burlywood;
}
тд тр {
граница: средняя;
цвет границы: подсветка;
}
/* -------------------------------------
Корпус и контейнер
------------------------------------- */
.тело {
цвет фона: #f6f6f6;
ширина: 100%;
}
/* Установите максимальную ширину и сделайте так, чтобы он отображался как блок, чтобы он автоматически растягивался до этой ширины, но также сжимался на телефоне или чем-то еще */
.контейнер {
дисплей: блок;
Маржа: 0 авто !важно;
/* делает его центрированным */
максимальная ширина: 580px;
обивка: значение 10px;
ширина: 580px;
}
/* Это также должен быть блочный элемент, чтобы он заполнял 100% контейнера . */
.содержание {
размер коробки: бордюрная коробка;
дисплей: блок;
Маржа: 0 авто;
максимальная ширина: 900px;
обивка: 6px;
}
/* -------------------------------------
ВЕРХНИЙ, НИЖНИЙ КОЛОНТИТУЛЫ, ОСНОВНЫЕ
------------------------------------- */
.главный {
Предыстория: #ffffff;
граница-радиус: 3px;
ширина: 100%;
}
.обертка {
размер коробки: бордюрная коробка;
обивка: 20 пикселей;
}
.блок контента {
обивка-дно: 10px;
padding-top: 10px;
}
.нижний колонтитул {
ясно: обе;
Маржа-топ: 10px;
выравнивание текста: по центру;
ширина: 100%;
}
.футер тд,
.футер Р,
.размах нижнего колонтитула ,
.нижний колонтитул а {
цвет: #999999;
размер шрифта: 12px;
выравнивание текста: по центру;
}
/* -------------------------------------
ТИПОГРАФИЯ
------------------------------------- */
h1,
h2,
h3,
Н4 {
цвет: #000000;
семейство шрифтов: sans-serif;
шрифт-вес: 400;
высота линии: 1,4;
маржа: 0;
Маржи-нижней: 20 пикселей;
}
h1 {
размер шрифта: 35px;
шрифт-вес: 300;
выравнивание текста: по центру;
text-transform: capitalize;
}
п,
ул,
пр {
семейство шрифтов: sans-serif;
размер шрифта: 14px;
шрифт-вес: нормальный;
маржа: 0;
Маржа-дно: 15px;
}
п ли,
уль ли,
литий пр {
список-стиль-позиция: внутри;
поле слева: 5px;
}
один {
цвет: #3498db;
оформление текста: подчеркивание;
}
/* -------------------------------------
ДРУГИЕ СТИЛИ, КОТОРЫЕ МОГУТ БЫТЬ ПОЛЕЗНЫ
------------------------------------- */
.последний {
маржа-дно: 0;
}
.первый {
маржи-топ: 0;
}
.выравнивание-по центру {
выравнивание текста: по центру;
}
.выровнять-вправо {
выравнивание текста: справа;
}
.выровнять-влево {
выравнивание текста: слева;
}
.понятно {
ясно: обе;
}
.mt0 {
маржи-топ: 0;
}
.mb0 {
маржа-дно: 0;
}
.Слуцкий вывел сборную России {
цвет: прозрачный;
дисплей: нет;
высота: 0;
максимальная высота: 0;
максимальная ширина: 0;
непрозрачность: 0;
переполнения: скрытые;
mso-скрыть: все;
видимость: скрытая;
ширина: 0;
}
.питание-от А {
текстовое оформление: отсутствует;
}
эйчар {
граница: 0;
границы вниз: 1px твердых #f6f6f6;
Маржа: 20px 0;
}
Спасибо Вам за обратную связь !
Отзывы Пользователей Project Buzz
$$$Дата$$$
Привет, $$$Employee_Name$$$
Спасибо Вам за обратную связь !
Идентификатор Сотрудника : $$$Employee_Id$$$
Имя Сотрудника : $$$Employee_Name$$$
Код Сотрудника : $$$Employee_Code$$$
Тип Запроса : $$$QueryType$$$
Сообщение : $$$Сообщение$$$
С уважением,
Проект кайфа работы и производства
Питание от источника OPTUM.
Это электронное письмо, включая вложения, может содержать конфиденциальную и/или служебную информацию и может использоваться только тем физическим или юридическим лицом, которому оно адресовано. Если читатель настоящего электронного письма не является предполагаемым получателем или его уполномоченным агентом, то настоящим он уведомляется о том, что любое распространение, распространение или копирование настоящего электронного письма запрещено. Если вы получили это электронное письмо по ошибке, пожалуйста, сообщите об этом отправителю, ответив на это сообщение, и немедленно удалите это электронное письмо.
Yvan Rodrigues
С какой проблемой вы столкнулись?
Richard Deeming
Дамп кода-это не вопрос.