我需要阅读传入的电子邮件消息,具有以下约束:
- AnAmazon SES 将收到的邮件存储到S3桶;
- 这些邮件需要转换到MimeMessage类型,以便与遗留代码一起工作。
事情是当我尝试将电子邮件转换为MimeMessage时,我得到异常"文件名,目录名或卷标签语法不正确。">
我如何使转换到MimeMessage工作?我应该用正则表达式解析电子邮件消息的内容吗?
我知道我可以将Amazon SES与Amazon WorkMail集成在一起,以Mime格式接收我的消息,这对我来说会更容易。但如果可以的话,我会避免订阅亚马逊的另一项付费服务。
为了更好地说明这个问题,我把我的代码和错误信息都贴在下面:
public GetMailController(AmazonS3Client s3Client, IConfiguration configuration)
{
_s3Client = s3Client;
_config = configuration;
}
[HttpGet(Name = "Get")]
public IEnumerable<MimeMessage> Get()
{
string AwsS3Bucket = _config.GetValue<string>("AwsS3Bucket");
List<MimeMessage> mails = new();
List<string> bucketKeys = GetBucketIds();
foreach (string k in bucketKeys)
{
GetObjectResponse response = _s3Client.GetObjectAsync(new GetObjectRequest() { BucketName = AwsS3Bucket, Key = k }).GetAwaiter().GetResult();
using (Stream responseStream = response.ResponseStream)
using (StreamReader reader = new StreamReader(responseStream))
{
string content = reader.ReadToEnd();
try
{
var mail = MimeMessage.LoadAsync(content).GetAwaiter().GetResult(); // Exception: "The filename, directory name or volume label syntax is incorrect."
mails.Add(mail);
}
catch (Exception exc)
{
return null;
}
}
}
return mails;
}
结果错误信息
The filename, directory name or volume label syntax is incorrect.
我尝试使用MimeKit方法MimeMessage.Load()
来解析MIME格式的电子邮件消息,但却得到了一个异常:The filename, directory name or volume label syntax is incorrect.
MimeMessage.Load()
方法期望接收文件名(文件路径)或流作为参数。
由于您提供给它的是与流等价的字符串,因此它认为您提供给它的是文件名—因此filename错误。
直接使用您从GetObjectResponse
获得的流,如下所示:
GetObjectResponse response = _s3Client.GetObjectAsync(new GetObjectRequest() { BucketName = AwsS3Bucket, Key = k }).GetAwaiter().GetResult();
using (Stream responseStream = response.ResponseStream)
{
try
{
var mail = MimeMessage.Load(responseStream);
mails.Add(mail);
}
catch (Exception exc)
{
return null;
}
}
我还建议使用await
而不是.GetAwaiter().GetResult()
。