2016-09-01 2 views
0

は、下図のように十分に簡単であるとしてGmailのメールを送信:Gmailのlthrough EMAIを送信する返信

Sending email in .NET through Gmail

しかし、私は別の電子メールへの応答としての電子メールを送信する方法を見つけるように見えることはできません。以前のメッセージを自動的に含めます。

楽しみのためのコード:本当に(IMAPクライアント用AE.Net.Mailライブラリを使用して、ここで読んで)電子メールの送信に関連していない

public GmailConnector() 
    { 
     StringBuilder sb1 = new StringBuilder(); 
     using (var context = new SupportDataContext()) 
     using (var client = new ImapClient("imap.gmail.com", "[email protected]", "xxx", AuthMethods.Login, 993, true)) 
     { 
      client.SelectMailbox("INBOX"); 
      Console.WriteLine(client.GetMessageCount()); 
      var mm = client.SearchMessages(SearchCondition.Seen(), false, true); 
      foreach (var m in mm) 
      { 
       if (m.Value == null) 
        continue; 

       var msg = m.Value; 
       var emailRef = msg.To.First().Address; 
       SupportThread supportThread = null; 
       if (emailRef.Contains("+")) 
       { 
        var supportThreadRef = emailRef.Substring(emailRef.IndexOf('+') + 1, emailRef.IndexOf('@') - emailRef.IndexOf('+') - 1); 
        var supportThreadId = long.Parse(supportThreadRef); 
        supportThread = context.SupportThreads.First(x => x.Id == supportThreadId); 
       } 
       else if (msg.Subject.Contains("RE:")) 
       { 
        var subjectRef = msg.Subject.Replace("RE:", "").Trim(); 
        var tmpDate = msg.Date.AddDays(-7); 
        var tmpSupportThread = context.SupportThreads.FirstOrDefault(x => x.EntryDate < msg.Date && x.EntryDate > tmpDate && x.Title.Equals(subjectRef)); 
        if (tmpSupportThread != null) 
         supportThread = tmpSupportThread; 
       } 
       if (supportThread == null) 
       { 
        supportThread = new SupportThread(); 
        supportThread.Title = msg.Subject; 
        supportThread.Creator = msg.From.Address; 
        supportThread.CreatorName = msg.From.DisplayName; 
        supportThread.EntryDate = msg.Date; 
       } 
       var responseMessage = msg.AlternateViews.GetHtmlView().Body; 
       responseMessage.Substring(0, responseMessage.IndexOf(REPLY_SEPERATOR)); 
       var tmpEmailMessage = new EmailMessage(); 
       tmpEmailMessage.EntryDate = msg.Date; 
       tmpEmailMessage.InnerContent = responseMessage; 
       tmpEmailMessage.SenderEmail = msg.From.Address; 
       tmpEmailMessage.SenderDisplayName = msg.From.DisplayName; 
       tmpEmailMessage.Title = msg.Subject; 
       tmpEmailMessage.SupportThread = supportThread; 
       foreach (var attachment in m.Value.Attachments) 
       { 
        var tmpAttachment = new Attachment(); 
        tmpAttachment.Data = attachment.GetData(); 
        tmpAttachment.Name = attachment.Filename; 
        tmpAttachment.EmailMessage = tmpEmailMessage; 
        context.Attachments.InsertOnSubmit(tmpAttachment); 
       } 
       context.EmailMessages.InsertOnSubmit(tmpEmailMessage); 
       context.SubmitChanges(); 
      } 
     } 

     var fromAddress = new MailAddress("[email protected]", "From Name"); 
     var toAddress = new MailAddress("[email protected]", "To Name"); 
     const string fromPassword = "fromPassword"; 
     const string subject = "Subject"; 
     const string body = "Body"; 

     var smtp = new SmtpClient 
     { 
      Host = "smtp.gmail.com", 
      Port = 587, 
      EnableSsl = true, 
      DeliveryMethod = SmtpDeliveryMethod.Network, 
      UseDefaultCredentials = false, 
      Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
     }; 
     using (var message = new System.Net.Mail.MailMessage(fromAddress, toAddress) 
     { 
      Subject = subject, 
      Body = body, 

     }) 
     { 
      smtp.Send(message); 
     } 
     Console.Read(); 
    } 
+0

ここに欠落している情報があるように感じます。別の電子メールへの応答として電子メールを送信したい場合は、電子メール受信トレイを読む必要があります。あなたはコードのために何を持っていますか? – KSib

+0

これで、Imapクライアント接続用にAE.Net.Mailを使って電子メールを簡単に読むことができます。 –

+0

.NET Frameworkに存在する.Reply(文字列メッセージ)のようなメソッドはありません。あなたは、サードパーティ製のライブラリを使用する必要があります。または、自分自身をロールバックする必要があります – KSib

答えて

0

メッセージへの返信はかなり簡単です。ほとんどの場合、他のメッセージを作成するのと同じ方法で返信メッセージを作成します。わずか数わずかな違いがあります。応答メッセージで

  1. は接頭辞がすでにに返信されたメッセージに存在しない場合は、他の言葉で("Re: "Subjectヘッダの前に付けることになるでしょう、 Subject"Re: party tomorrow night!"のメッセージに返信する場合は、でなく、に別の"Re: "と接頭辞を付けることになります)。
  2. 返信メッセージのIn-Reply-Toヘッダーを元のメッセージのMessage-Idヘッダーの値に設定すると便利です。
  3. 元のメッセージのReferencesヘッダーを返信メッセージのReferencesヘッダーにコピーし、元のメッセージのMessage-Idヘッダーを追加します。
  4. 返信で元のメッセージのテキストを「引用」したいと思うでしょう。

    public static MimeMessage Reply (MimeMessage message, bool replyToAll) 
    { 
        var reply = new MimeMessage(); 
    
        // reply to the sender of the message 
        if (message.ReplyTo.Count > 0) { 
         reply.To.AddRange (message.ReplyTo); 
        } else if (message.From.Count > 0) { 
         reply.To.AddRange (message.From); 
        } else if (message.Sender != null) { 
         reply.To.Add (message.Sender); 
        } 
    
        if (replyToAll) { 
         // include all of the other original recipients - TODO: remove ourselves from these lists 
         reply.To.AddRange (message.To); 
         reply.Cc.AddRange (message.Cc); 
        } 
    
        // set the reply subject 
        if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) 
         reply.Subject = "Re: " + message.Subject; 
        else 
         reply.Subject = message.Subject; 
    
        // construct the In-Reply-To and References headers 
        if (!string.IsNullOrEmpty (message.MessageId)) { 
         reply.InReplyTo = message.MessageId; 
         foreach (var id in message.References) 
          reply.References.Add (id); 
         reply.References.Add (message.MessageId); 
        } 
    
        // quote the original message text 
        using (var quoted = new StringWriter()) { 
         var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault(); 
    
         quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), !string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address); 
         using (var reader = new StringReader (message.TextBody)) { 
          string line; 
    
          while ((line = reader.ReadLine()) != null) { 
           quoted.Write ("> "); 
           quoted.WriteLine (line); 
          } 
         } 
    
         reply.Body = new TextPart ("plain") { 
          Text = quoted.ToString() 
         }; 
        } 
    
        return reply; 
    } 
    

    注:このコードは、message.TextBodyがnullでないことを前提とし、このロジックは、コードで表現されるようにしていた場合

は、それは(私は、この例ではMailKitを使用しています)、このようになります。 。これが起こる可能性は非常に低いですが(メッセージにtext/plain本文が含まれていないことを意味します)、可能性があります。

0

まさにそのようなそのデータを読み出し、受信メールを取ります送信者、件名、テキストとして使用し、返信を作成するときに使用します。返信の宛先は送信者のメールアドレス、件名= "RE:" +件名+着信でなければなりません。私は電子メールに返信するための組み込み関数はないと思います。これらのことを手作業で行う必要があります。 まず、Outlookなどの電子メールクライアントのメールボックスの内容を取り出したり、SMTPサーバーから最後のXメッセージを手動でダウンロードしたりする方法を見つける必要があります。

  • 元の電子メール(Outlook - > COMオブジェクトからOLE - > OutlookオブジェクトはインストールされているOutlookのメールクライアントのユーザーエージェントのようなものです)を取得します.Googleはその方法を行います。またはSMTPから最新のメールをダウンロードしてください。
  • メールの内容を取得したら、受信メールの内容を含むメールを作成します。それを送ってください。 Microsoft OLEを使用する場合は、outlookオブジェクトを通じて電子メールを送信することもできます。
+0

良いことに、秘密の返信方法がない限り、過去のコンテンツを含める必要があります。 –

+0

あなたが私の答えを見つけたら、私の答えの隣に緑色の厚いものを選んでください:)あなたが良い答えがあるのなら、それを元に戻すことができます – ThomasMX

関連する問題