在不同的smtp端口上发送带有附件的电子邮件
本文关键字:电子邮件 smtp | 更新日期: 2023-09-27 18:03:06
我目前正在开发一个c#应用程序,我正在制作自己的电子邮件服务器,该服务器侦听SMTP流量,包括附件数据,然后找到电子邮件地址的MX记录并将其转发给收件人。
这一切都很完美,除了一个奇怪的问题,我不明白。
这个问题只影响在Linux下Mono下运行c#程序,在Windows上一切正常。
问题是,如果我有我的电子邮件服务器程序运行在端口26(端口25已经在使用),然后我有一个测试c#程序在我的windows PC上发送一个文件。然后,我成功地获取附件数据,将附件写入临时文件,重新创建附件对象,并发送带有消息的附件。当收到电子邮件时,电子邮件内容不再存在,附件被称为noname
,如果我查看附件,它有电子邮件标题的一部分和组成附件的基本64字符串。
然而,如果我随后将程序更改为在端口25上运行,显然一切都以完全相同的方式完成,但这一次当电子邮件到达我的gmail帐户时,电子邮件与邮件正文和附件完全一致,具有正确的名称和格式。我不明白为什么在不同端口的linux上运行我的程序会导致这个问题。我检查了工作和非工作之间的头,一切似乎都很好。
这是mono的问题吗?当我在MX记录上发送smtp客户端时,我还尝试将端口设置为端口25,但没有任何不同。下面是我发送附件的方式。
FileStream fileStream = new FileStream(attachmentTempName, FileMode.Open, FileAccess.Read);
Attachment attachment = new Attachment(fileStream, attachments[0].realFileName, MediaTypeNames.Application.Octet);
message.Attachments.Add(attachment);
message.From = new MailAddress(emailInfo["EmailFrom"]);
message.To.Add(emailInfo["EmailTo"]);
message.Subject = emailInfo["Subject"];
if (emailInfo["Headers"] != "")
{
message.Headers.Add(getHeaders(emailInfo["Headers"]));
}
message.Body = emailInfo["Body"];
message.Body = "This is a test hardcoded";
if (emailInfo["EmailFormat"] == ManageEmail.EmailFormat.HTML.ToString())
{
message.IsBodyHtml = true;
}
else
{
message.IsBodyHtml = false;
}
SmtpClient smtp = new SmtpClient(mxRecords[0]);
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Port = 25;
smtp.Send(message);
谢谢你能提供的任何帮助。
@ board,
唯一引起我注意的是下面这行:
Attachment attachment = new Attachment(fileStream, attachments[0].realFileName, MediaTypeNames.Application.Octet);
附件构造函数的第二个参数应该是ContentType,而不是文件名。
message.Attachments.Add(new Attachment(imageFile.InputStream, imageFile.ContentType, MediaTypeNames.Image.Jpeg));
更多信息请点击此链接:c#发送带有附加文件(image)的电子邮件
欢呼。