c# - 在不同的 smtp 端口上发送带有附件的电子邮件

标签 c# smtp email-attachments

我目前正在开发一个 c# 应用程序,我在其中制作自己的电子邮件服务器,用于监听包括附件数据在内的 SMTP 流量,然后找到 MX 记录的电子邮件地址并将其转发给收件人。

除了一个我不明白的奇怪问题外,一切都很好。

该问题仅影响在 Linux 下的 Mono 下运行 C# 程序,在 Windows 上一切正常。

问题是如果我的电子邮件服务器程序在端口 26 上运行(端口 25 已被使用),那么我的 Windows PC 上有一个测试 c# 程序,它发送一个文件。然后我获取附件数据成功将附件写入临时文件,重新创建附件对象并发送附件和消息。收到电子邮件后,电子邮件内容不再存在,附件名为 noname,如果我查看附件,它包含部分电子邮件标题和构成附件的 base 64 字符串。

但是,如果我随后将程序更改为在端口 25 上运行,一切都以完全相同的方式完成,但这次当电子邮件到达我的 gmail 帐户时,电子邮件与邮件正文完全一致并且具有正确名称和格式的附件。我不明白为什么在不同端口下的 linux 上运行我的程序会导致这个问题。我检查了工作和非工作之间的标题,一切似乎都很好。

这是单声道的问题吗?当我在 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);

感谢您提供的任何帮助。

最佳答案

@Boardy,

唯一引起我注意的是下面一行:

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# Sending Email with attached file (image)

干杯。

关于c# - 在不同的 smtp 端口上发送带有附件的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15283977/

相关文章:

c# - Gmap.net 缓存如何工作?

c# - Silverlight 自定义配置部分

c# - 我如何重构这两个 C# 函数以从它们所作用的特定类属性中抽象出它们的逻辑?

电源外壳 : using get-content as body of an smtp mail

c# - 在 mvc 应用程序中发送电子邮件时遇到问题

c# 方法类型推断的麻烦

python - 使用 Python 和 Gmail SMTP 服务器发送电子邮件不适用于附件

ios - MFMailComposeViewController的几个附件

c# - 如何设置附件名称以在 Outlook 中正确显示

java - Android - 将 TXT 文件作为电子邮件附件发送失败 ("Couldn' t 发送附件")