我在C#中使用SmtpClient,我将发送潜在的100多个电子邮件地址.我不想遍历每一个并向他们发送个人电子邮件.
我知道可以只发送一次消息,但我不希望来自地址的电子邮件显示100个其他电子邮件地址,如下所示:
Bob Hope; Brain Cant; Roger Rabbit;Etc Etc
Run Code Online (Sandbox Code Playgroud)
是否可以一次发送的消息,并确保只有收件人的电子邮件地址会显示在从邮件的一部分?
我做了一个小的SmtpSender类来处理发送Smtp MailMessage对象.当消息发送或发送失败时,我引发一个包含"响应"对象的委托,该对象具有用户尝试发送的原始MailMessage以及成功/失败布尔值和错误字符串.然后,用户可以将MailMessage对象重新提交给sender类,以便在需要时再次尝试.
我想知道的是......如果我提出一个包含非托管资源的对象的委托,那么我是否需要在当前范围内处理该对象?如果是这样,在当前作用域中调用Dispose会杀死委托函数接收的对象吗?从长远来看,我担心内存泄漏.
任何建议或帮助将不胜感激.提前致谢!
戴夫
public delegate void SmtpSenderSentEventHandler(object sender, SmtpSendResponse theResponse);
public class SmtpSendResponse : IDisposable
{
#region Private Members
private MailMessage _theMessage;
private bool _isSuccess;
private string _errorMessage;
#endregion
#region Public Properties
public MailMessage TheMessage
{
get { return _theMessage; }
set { _theMessage = value; }
}
public bool IsSuccess
{
get { return _isSuccess; }
set { _isSuccess = value; }
}
public string Error
{
get { return _errorMessage; }
set { _errorMessage = value; …Run Code Online (Sandbox Code Playgroud) 我有几个网络应用程序都利用发送电子邮件,无论是通过联系表格,还是某种通知更新等.
我发现的问题是,没有任何方法可以跟踪从Web应用程序发送的电子邮件,所以我想出了一个可能的解决方案:

这真的很直接 - 而不是让每个Web应用程序自己发送电子邮件,我想通过创建一个中央电子邮件发件人服务来统一该过程.
在基本术语中,每个应用程序只会在数据库的"出站电子邮件"表中使用"收件人","发件人","主题","内容"数据创建一行.
然后,电子邮件发件人服务(Win服务)将从发件箱中选择电子邮件,发送它们,然后标记为已发送.
即使我将"基本电子邮件"信息(来自,来自主题,内容)存储在数据库中,我真正想做的还是存储"MailMessage"对象本身,以便电子邮件发件人服务可以反序列化原始的MailMessage,因为这将允许任何应用程序完全自定义电子邮件.
以这种方式使用MailMessage对象有任何问题吗?
更新:另一个目标是存储已发送的电子邮件日志 - 因此使用数据库的原因.
我在使用MailMessage发送电子邮件时遇到一些问题.我有两个电子邮件帐户(account1@gmail.com和account2@gmail.com),我希望account2能够通过按钮点击事件向帐户1发送电子邮件.
这就是我所拥有的,但它不起作用.我得到了例外并说这是禁止的.
try
{
//do submit
MailMessage emailMessage = new MailMessage();
emailMessage.From = new MailAddress("account2@gmail.com", "Account2");
emailMessage.To.Add(new MailAddress("account1@gmail.com", "Account1"));
emailMessage.Subject = "SUBJECT";
emailMessage.Body = "BODY";
emailMessage.Priority = MailPriority.Normal;
SmtpClient MailClient = new SmtpClient("smtp.gmail.com");
MailClient.Credentials = new System.Net.NetworkCredential("account2@gmail.com", "password");
MailClient.Send(emailMessage);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)
我觉得这是Smtp的一个问题,但我不知道.
希望有人能够帮助解决这个问题,我一直在寻找,我似乎无法在任何地方找到答案.
我正在创建一个邮件消息,将其传递到指定的拾取目录,此代码在过去已经多次使用而没有问题.现在,当我检查生成的文件,更具体地说是在eml文件中检查URL时,我可以看到中间有一个double ..根据我一直在阅读的内容,据我所知,如果消息中第一行的第一个字符开头,这是SMTP协议的一部分..此文件稍后将被另一项服务接收,该服务将最终执行电子邮件的发送.
我打电话时,我已经能够将它缩小到确切的线client.Send().如果我在发送之前检查邮件正文,则表明URL已正确形成.在我调用它之后检查消息体,..URL中存在该消息.
我的问题或问题如下:
SmtpDeliveryMethod.SpecifiedPickupDirectory?我主要是想找到一种方法将这个eml文件保存到磁盘上的一个位置,以后可以将其重新拾取并发送,我对C#的了解仍然相当有限,所以我可能会看到一些简单的东西,所以任何建议或指导将非常感谢!
我已经创建了一小段代码来尝试重新创建问题,这不是我正在使用的确切内容,但它确实显示通过client.Send()方法发送后,有2'.. '在字符串的开头.
using (var client = new SmtpClient())
{
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\temp";
var message = new MailMessage();
message.To.Add(new MailAddress("alice@a.com"));
message.From = new MailAddress("bob@b.com");
message.Subject = "Smtp Dot Stuffing Test";
message.Body = ".A.B.C..... .0.1.2.3.4.5.6.7.8.9";
client.Send(message);
}
Run Code Online (Sandbox Code Playgroud) 我在下面写了代码,将图像嵌入到从我的c#代码发送的邮件中.但是当我检查邮件时,我得到的图像就像附件而不是内嵌图像.(如Gmail)
AlternateView htmlBodyView = null;
string htmlBody = "<html><body><h1></h1><br><img src=\"cid:SampleImage\"></body></html>";
AlternateView plainTextView = AlternateView.CreateAlternateViewFromString(htmlBody, null, "text/html");
ImageConverter ic = new ImageConverter();
Byte[] ba = (Byte[])ic.ConvertTo(bitmap_obj, typeof(Byte[]));
using (MemoryStream logo = new MemoryStream(ba))
{
LinkedResource sampleImage = new LinkedResource(logo, "image/jpeg");
sampleImage.ContentId = "sampleImage";
htmlBodyView.LinkedResources.Add(sampleImage);
p.SendEmail(htmlBodyView);
}
Run Code Online (Sandbox Code Playgroud) 我在c#中发送HTML邮件时遇到一个奇怪的问题.
基本上我每天早上都想给自己发送电子邮件,然后我开始从ftp网站下载HTML标记中的天气.
获取源文件后,我将其读入字符串并使用以下代码创建mailMessage.
string body = File.ReadAllText(@"C:\Weather.htm");
MailMessage mailMessage = new MailMessage();
SmtpClient mailClient = new SmtpClient("smtp.gmail.com");
mailClient.Credentials = new NetworkCredential(username, password);
mailClient.Port = 587;
mailClient.EnableSsl = true;
mailMessage.From = new MailAddress(emailFrom);
mailMessage.IsBodyHtml = true;
mailMessage.To.Add(emailTo);
mailMessage.Subject = "Test Email";
mailMessage.SubjectEncoding = System.Text.Encoding.Unicode;
mailMessage.Body = body;
mailMessage.BodyEncoding = System.Text.Encoding.Unicode;
mailClient.Send(mailMessage);
Run Code Online (Sandbox Code Playgroud)
问题是,当电子邮件以HTML格式到达时,所有DIV/CSS都不受尊重,看起来很奇怪.我试图通过电子邮件发送到不同的电子邮件地址和客户端,它看起来和尝试不同的编码一样.
因此,某些地方出现了问题.
有谁知道如何解决这个问题并获得格式正确的电子邮件?


源标记
<html xmlns="http://www.w3.org/1999/xhtml"><head xmlns="">
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sydney Forecast</title>
<link rel="stylesheet" type="text/css" href="http://www.bom.gov.au/watl/standard/common.css">
<link rel="stylesheet" type="text/css" href="http://www.bom.gov.au/weather-services/styles/text-gfe.css">
</head>
<body>
<div class="product">
<p xmlns="" class="p-id">IDN10064</p> …Run Code Online (Sandbox Code Playgroud) 我需要发送一封邮件,包括例外情况(黄色死亡屏幕)作为附件.
我可以得到YSOD如下:
string YSODmarkup = lastErrorWrapper.GetHtmlErrorMessage();
if (!string.IsNullOrEmpty(YSODmarkup))
{
Attachment YSOD = Attachment.CreateAttachmentFromString(YSODmarkup, "YSOD.htm");
mm.Attachments.Add(YSOD);
}
Run Code Online (Sandbox Code Playgroud)
mm是类型MailMessage,但不发送邮件.
这里
System.Net.Mail.MailMessage MyMailMessage = new System.Net.Mail.MailMessage("from", "to", "Exception-Details", htmlEmail.ToString());
Run Code Online (Sandbox Code Playgroud)
用于绑定邮件正文.
在此之后,仅添加附件.删除附件时,会发送邮件.
谁能帮我吗?
根据阿尔宾先生和保罗先生的评论,我正在更新以下内容
string YSODmarkup = Ex_Details.GetHtmlErrorMessage();
string p = System.IO.Directory.GetCurrentDirectory();
p = p + "\\trial.txt";
StreamWriter sw = new StreamWriter(p);
sw.WriteLine(YSODmarkup);
sw.Close();
Attachment a = new Attachment(p);
if (!string.IsNullOrEmpty(YSODmarkup))
{
Attachment YSOD = Attachment.CreateAttachmentFromString(YSODmarkup, "YSOD.html");
System.Net.Mail.Attachment(server.mappath("C:\\Documents and Settings\\user\\Desktop\\xml.docx"));
MyMailMessage.Attachments.Add(a);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我将内容附加到文本文件并尝试相同.所以邮件没有发送.发送包含HTML标签的邮件是否有任何问题.因为我能够附加普通的文本文件.
我的应用程序分为三层:
在我的服务层中,我调用了一个EmailSender服务,该服务目前通过SmtpClient和MailMessage发送明文电子邮件.据我所知,相当标准的东西.
我现在正在尝试使用Razor模板格式化这些电子邮件的主体,该模板接受MailMessage作为模型,并生成一些HTML,我可以将其粘贴到邮件正文中.
现在这就是我所拥有的:
public void SendAsyncEmail(MailMessage message)
{
message.IsBodyHtml = true;
message.body = {generate html string from body here using razor?}
// Async code here
}
Run Code Online (Sandbox Code Playgroud)
假设我定义了一个这样的剃刀视图:
@model System.Net.Mail.MailMessage
<div>
<h1>@Model.Subject</h1>
<p>@Model.Body</p>
</div>
Run Code Online (Sandbox Code Playgroud)
如何从我的服务方法将MailMessage传递到此视图中,并为其生成电子邮件正文的字符串?
我正在使用NPOI创建一个excel工作簿并尝试将其作为附件发送到电子邮件中.我的代码如下:
var wb = new HSSFWorkbook();
//create the workbook
using(var ms = new MemoryStream())
{
wb.Write(ms);
var msg = new MailMessage();
//create email
msg.Attachments.Add(new Attachment(ms, "Document.xls", "application/vnd.ms-excel"));
client.Send(msg);
}
Run Code Online (Sandbox Code Playgroud)
我已经排除了创建工作簿的代码,我已经测试以确保它可以工作(我能够保存文件并打开它而不会出现问题)但是如果你想看到任何东西请问.client只是我的SmtpClient.
电子邮件发送没有问题,附件以Document.xls(如预期的那样)出现,但是当我打开它时,我收到以下消息(在Excel 2010中),当我单击"是"打开时,工作表为空.
The file you are trying to open, 'Document.xls', is in a differrent format than specified by the file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now? …
mailmessage ×10
c# ×9
smtp ×3
.net ×1
asp.net ×1
asp.net-mvc ×1
css ×1
email ×1
html ×1
markup ×1
memory ×1
memory-leaks ×1
npoi ×1
smtpclient ×1