2009-02-19 60 views
37

Tôi đang sử dụng SmtpClient để gửi email có tệp đính kèm. Tuy nhiên đối với một lô nhất định, chúng tôi cần bằng cách nào đó lưu MailMessage thay vì gửi chúng. Sau đó chúng tôi đang nghĩ/hy vọng tải các thư lên thư mục người dùng.Tôi làm cách nào để lưu email thay vì gửi khi sử dụng SmtpClient?

Có thể lưu các tin nhắn này với phần đính kèm còn nguyên vẹn (không thể, tôi đã nghĩ). Hoặc cách khác là tải các tin nhắn lên một thư mục trong tài khoản người dùng?

Nếu có ai có bất kỳ kinh nghiệm nào về điều này, tôi sẽ đánh giá cao một chút trợ giúp hoặc một con trỏ.

+0

"thay vì gửi". – Avram

Trả lời

57

Khi thử nghiệm trong ASP.NET, chúng tôi lưu email của chúng tôi vào một thư mục thay vì gửi chúng qua máy chủ email. Có lẽ bạn có thể thay đổi các cài đặt web.config như thế này cho lô của mình?

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> 
    </smtp> 
    </mailSettings> 
</system.net> 

Thông tin bổ sung:

+0

Cảm ơn đã làm việc một điều trị. Ngoài ra Avram (xem bên dưới) đăng một liên kết hữu ích thảo luận về việc thay đổi tên tin nhắn email từ GUID được tạo tự động thành giá trị của riêng bạn. – user17510

+0

Tôi đã thử phương pháp này và tôi gặp lỗi khi địa chỉ "Từ" không được chỉ định. Có cách nào để xác định điều này cho SpecifiedPickupDirectory trong web.config? Khi bạn thực hiện cài đặt mạng có – codeMonkey

-6

Điều này phụ thuộc nhiều vào ứng dụng email khách và API tự động hóa của nó. SMTP là một giao thức gửi và chuyển thư. Nó không có giảng viên để tiết kiệm hoặc thậm chí lấy e-mail.

6

Bạn có thể định cấu hình cài đặt này bằng cài đặt system.net trong tệp web.config/app.config của mình.

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="Network"> 
     <network host="mail.mydomain.com" port="25" /> 
    </smtp> 
    <!-- Use this setting for development 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" /> 
    </smtp> 
    --> 
    </mailSettings> 
</system.net> 

Ngoài ra, đây là liên kết có thông tin trên migrating from System.Web.Mail to System.Net.Mail.

7

Cũng như thông tin SpecifiedPickupDirectory của các câu trả lời khác, nếu bạn muốn đảm bảo email của mình được gửi đến thư mục có liên quan đến gốc trang - tiện dụng trong thử nghiệm trên máy chủ xây dựng mà bạn không biết đường dẫn - bạn có thể thêm một kiểm tra nhanh chóng trong gửi mã email của bạn:

SmtpClient client = new SmtpClient(); 
    ... 

    // Add "~" support for pickupdirectories. 
    if (client.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory && client.PickupDirectoryLocation.StartsWith("~")) 
    { 
     string root = AppDomain.CurrentDomain.BaseDirectory; 
     string pickupRoot = client.PickupDirectoryLocation.Replace("~/", root); 
     pickupRoot = pickupRoot.Replace("/",@"\"); 
     client.PickupDirectoryLocation = pickupRoot; 
    } 

Và kiểm tra của bạn sẽ giống như thế này (chắc chắn rằng bạn sử dụng App_Data để IIS có thể ghi vào thư mục):

// Arrange - get SitePath from AppDomain.Current.BaseDirectory + ..\ 
    string pickupPath = Path.Combine(SitePath, "App_Data", "TempSmtp"); 
    if (!Directory.Exists(pickupPath)) 
     Directory.CreateDirectory(pickupPath); 

    foreach (string file in Directory.GetFiles(pickupPath, "*.eml")) 
    { 
     File.Delete(file); 
    } 

    // Act (send some emails) 

    // Assert 
    Assert.That(Directory.GetFiles(pickupPath, "*.eml").Count(), Is.EqualTo(1)); 
+0

Cảm ơn bạn đời. Đó là những gì tôi đang tìm kiếm! –

1

một lỗi cũng yêu cầu thêm như một cách giải quyết trong một số phiên bản của f r strict. Vì vậy, phiên bản hoàn chỉnh trông giống như:

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> 
     <network host="localhost" /> 
    </smtp> 
    </mailSettings> 
</system.net> 
Các vấn đề liên quan