在电子邮件中发送长行文本

时间:2015-06-25 02:05:43

标签: c# email

我必须通过电子邮件发送一串文本...但接收者对其格式要求很高:它必须是纯ASCII文本。

我尝试发送Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable。不幸的是,我的字符串非常长(255个字符),并且引用可打印的字符串将78个字符后的字符串剪切到新行:

  

BUOYID,55073,UTCDATE,24/06/2015,UTCTIME,22:42.00,STATUS,E0000,ZEROCRS,201,A =   VGHGT,0.92,TZ,6.4,MAXWAVE,3.12,SIGWAVE,1.63,SIGPERIOD,9.3,H10,2.2,T10,9.5,M =

显然,解决方案在于将文本作为ContentDisposition.Inline附件发送(附件包含正文中的内容),这样可以使用更长的文本字符串......但这并不容易。

如果我将字符串保存到文本文件中,如下所示:

string message ="my255CharText";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\shareddata\temp\buoy.txt"))
{
    file.WriteLine(message);
}
MailMessage emailMsg = new MailMessage();
emailMsg.To.Add("email@destination.com);
emailMsg.Subject = "my Subject";
emailMsg.From = new MailAddress("email@source.com");
emailMsg.BodyEncoding = System.Text.Encoding.ASCII;
emailMsg.IsBodyHtml = false;

Attachment data = new Attachment(@"\\shareddata\temp\buoy.txt", MediaTypeNames.Text.Plain);

emailMsg.Attachments.Add(data);
ContentDisposition dispositon = data.ContentDisposition;
dispositon.Inline=true;
SmtpClient smtp = new SmtpClient("SMTP_SERVER");
smtp.Send(emailMsg);

我一直在发送带有附件的电子邮件,而不是正文中的文本内容。 如果我尝试将变量作为附件:

 Attachment data = new Attachment(message, MediaTypeNames.Text.Plain);

我得到以下内容:

PathTooLongException: The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

我还尝试将路径更改为本地磁盘(c:\temp\buoy.txt),但文件仍然作为附件发送,而不是内联。

编辑:请让我说清楚:当我直接将变量作为附件发送时,我收到pathTooLongException,而不是在我从文件发送时。

2 个答案:

答案 0 :(得分:0)

所以我不知道这是否真的解决了你的实际问题,但是为了摆脱你正在处理的错误,现在这应该有效:

string message ="my255CharText";

MailMessage emailMsg = new MailMessage();
emailMsg.To.Add("email@destination.com);
emailMsg.Subject = "my Subject";
emailMsg.From = new MailAddress("email@source.com");
emailMsg.BodyEncoding = System.Text.Encoding.ASCII;
emailMsg.IsBodyHtml = false;

using (System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.ASCII.GetBytes(message)))
{
    Attachment data = new Attachment(ms, new ContentType("text/plain; charset=us-ascii"));

    emailMsg.Attachments.Add(data);
    ContentDisposition dispositon = data.ContentDisposition;
    dispositon.Inline=true;
    SmtpClient smtp = new SmtpClient("SMTP_SERVER");
    smtp.Send(emailMsg);
}

当我测试这个时,Outlook和Android Mail客户端将附件显示为附件,GMail(Web和Android客户端)将其显示为内联(作为单行文本)。但是在我的手机屏幕较小的屏幕上,很明显文字会被分成几行。

我有一种感觉,你正在处理一个特定于电子邮件客户端的呈现问题,而你的工作可能更多地处理那个特定的客户端,而不是想出一个通用的解决方案(可能不存在)。

答案 1 :(得分:0)

好吧,我解决了这个问题:正如@Dan Field指出的那样,部分问题出现在Outlook女士身上,顽固地显示内联附件为......附件。但这并没有解决我的断线问题,这最终是Quoted-printable standard的错误,这确实限制了线的大小。 但是,至少就我的目的而言,7bit编码是可以接受的,有了它,我能够在一行中发送高达262个字符:

string message="255CharsLongMessage";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"\\shareddata\temp\buoy.txt", false, System.Text.Encoding.ASCII))
        {
            file.WriteLine(message);
        }


MailMessage emailMsg = new MailMessage();
emailMsg.To.Add("destination@server.com");
emailMsg.Subject = "My_Subject";
emailMsg.From = new MailAddress("source@email.coom");
emailMsg.BodyEncoding = System.Text.Encoding.ASCII;
emailMsg.IsBodyHtml = false;
SmtpClient smtp = new SmtpClient("SMTP_SERVER");
Attachment data = new Attachment(@"\\shareddata\temp\buoy.txt", new ContentType("text/plain; charset=us-ascii"));

emailMsg.Attachments.Add(data);
data.ContentDisposition.Inline = true;
data.TransferEncoding = TransferEncoding.SevenBit;
smtp.Send(emailMsg);