3

Windows Mobile アプリケーションを初めて使用します。私のプロジェクトでは、を使用してメールを送信したいと考えていますmicrosoft.windowsmobile.pocketoutlook。これまでのところ、次のコードがあります。

private void btnsubmit_Click(object sender, EventArgs e)
{
    try
    { 
        totleave();
        OutlookSession ol = new OutlookSession();
        EmailMessage em = new EmailMessage();
        //Recipient  s1 = em.From;
        //Console.WriteLine(s1);
        Recipient r = new Recipient("iyalarasi.r", "iyalarasi.r@winxsolutions.com");
        em.To.Add(r);
        em.Subject = "Request For Leave";
        em.BodyText =txtename.Text +"(Emp id:"+txteno.Text+ ")" + " request "+ cb1.SelectedItem.ToString()+" leave from "+dtpfrom .Value
            .ToShortDateString ()+" to "+dtpto .Value.ToShortDateString ()  + "\n The reason is " + txtreason.Text;
        EmailAccount ea = ol.EmailAccounts[0];
        ea.Send(em);
        // em.Send("iyalarasi.r");//Account name in outlook
        //MessagingApplication.Synchronize("iyalarasi.r");
        MessageBox.Show("mail sent");
        f2.Show();
        f2.lblmsg.Text = "You have Applied Leave";
    }
    catch (PocketOutlookException ex)
    {
        lblmsg1.Text = ex.ToString();
    }
    catch (Exception e1)
    {
        lblmsg1.Text = e1.ToString();
    }
}

このコードでは、メールは送信トレイに表示されますが、受信トレイには表示されません。Gmail を使用すると、次のメッセージが表示されます。

メッセージを送信できませんでした。ネットワークがカバーされていること、およびアカウント情報が正しいことを確認してから、もう一度やり直してください。

アカウント情報は正しいです。何が起こっている?

4

2 に答える 2

2

既に POOM を使用して、Windows Mobile デバイスから電子メールを送信しています。

コードを使用して、利用可能な Outlook 電子メール アカウントを反復処理します。文字列 sMailAccount には、「Google Mail」など、pocketOuttlook に表示されるアカウントの名前が含まれます。

sendMail クラスのクラス コード...

    public sendMail(string sMailAccount)
    {
        session = new OutlookSession();
        //eMail = new EmailMessage();
        bool bFound = false;
        foreach (Account acc in session.EmailAccounts)
        {
            System.Diagnostics.Debug.WriteLine(acc.Name);
            if (acc.Name == sMailAccount)
                bFound = true;
        }
        if (bFound)
            account = session.EmailAccounts[sMailAccount];
        if (account != null)
            _bIsValidAccount = true;
    }
    ...

私のコードは、画像を受信者に送信するために使用されました。

    public bool send(string sImagePath)
    {
        if (account == null)
            return false;
        try
        {
            eMail = new EmailMessage();
            rcp = new Recipient(_to);
            eMail.To.Add(rcp);
            eMail.Subject = "Visitenkarten";
            eMail.BodyText = "VCard " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\r\nsent from eMDI2Mail";

            attachement = new Attachment(sImagePath);
            eMail.Attachments.Add(attachement);                
            eMail.Send(account);                
            //account.Send(eMail);
            if (this._syncImmediately)
            {
                if (this.account != null)
                    Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(this.account);
            }
            return true;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Exception in send(): " + ex.Message);
        }
        return false;
    }

知っておくべきもう 1 つの問題は、POutlook がメッセージをすぐに送信しないことです。そのため、_syncImmediately という var を導入しました。これが true の場合、Outlook はメッセージをすぐに送信します。そうでない場合は、syncNow() という別の関数を提供します。

    /// <summary>
    /// sync eMail in outlook
    /// </summary>
    /// <param name="pHandle">handle to forground window</param>
    public void syncNow(IntPtr pHandle)
    {
        if (this.account != null)
        {
            Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(this.account);
            SetForegroundWindow(pHandle);
        }
    }

SetForeGroundWindow() を使用して、アプリケーションに戻ります。

クラス全体は次のとおりです。

    using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

using System.Runtime.InteropServices;

using Microsoft.WindowsMobile.PocketOutlook;

namespace eMdiMail
{
    class sendMail:IDisposable
    {
        [DllImport("coredll", EntryPoint = "SetForegroundWindow")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

        OutlookSession session;
        public EmailAccount account;
        EmailMessage eMail;
        public String _to = "TheRecipient@intermec.com";
        Attachment attachement;
        Recipient rcp;

        bool _syncImmediately = false;
        public bool syncImmediately
        {
            get { return _syncImmediately; }
            set { _syncImmediately = value; }
        }
        bool _bIsValidAccount = false;
        public bool bIsValidAccount
        {
            get
            {
                return _bIsValidAccount;
            }
        }
        public bool setAccount(string sMailAccount)
        {
            session.Dispose();
            session = new OutlookSession();
            //eMail = new EmailMessage();
            bool bFound = false;
            foreach (Account acc in session.EmailAccounts)
            {
                if (acc.Name == sMailAccount)
                {
                    account = session.EmailAccounts[sMailAccount];
                    bFound = true;
                }
            }
            return bFound;
        }
        public sendMail(string sMailAccount)
        {
            session = new OutlookSession();
            //eMail = new EmailMessage();
            bool bFound = false;
            foreach (Account acc in session.EmailAccounts)
            {
                System.Diagnostics.Debug.WriteLine(acc.Name);
                if (acc.Name == sMailAccount)
                    bFound = true;
            }
            if (bFound)
                account = session.EmailAccounts[sMailAccount];
            else
            {
                if(this.createAccountGoogle())
                    account = session.EmailAccounts[sMailAccount];
            }
            if (account != null)
                _bIsValidAccount = true;
        }
        public sendMail()
        {
            session = new OutlookSession();
            //eMail = new EmailMessage();
            bool bFound = false;
            foreach (Account acc in session.EmailAccounts)
            {
                System.Diagnostics.Debug.WriteLine(acc.Name);
                if (acc.Name == "Google Mail")
                    bFound = true;
            }
            if (bFound)
                account = session.EmailAccounts["Google Mail"];
            else
            {
                if(this.createAccountGoogle())
                    account = session.EmailAccounts["Google Mail"];
            }
            if (account != null)
                _bIsValidAccount = true;
        }
        /// <summary>
        /// sync eMail using send and recv in foreground
        /// </summary>
        public void syncNow()
        {
            if (this.account != null)
                Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(this.account);
        }
        /// <summary>
        /// sync eMail in outlook
        /// </summary>
        /// <param name="pHandle">handle to forground window</param>
        public void syncNow(IntPtr pHandle)
        {
            if (this.account != null)
            {
                Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(this.account);
                SetForegroundWindow(pHandle);
            }
        }
        public bool send(string sImagePath)
        {
            if (account == null)
                return false;
            try
            {
                eMail = new EmailMessage();
                rcp = new Recipient(_to);
                eMail.To.Add(rcp);
                eMail.Subject = "Visitenkarten LogiMAT";
                eMail.BodyText = "LogiMat " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + "\r\nsent from eMDI2Mail";

                attachement = new Attachment(sImagePath);
                eMail.Attachments.Add(attachement);                
                eMail.Send(account);                
                //account.Send(eMail);
                if (this._syncImmediately)
                {
                    if (this.account != null)
                        Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(this.account);
                }
                return true;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine("Exception in send(): " + ex.Message);
            }
            return false;
        }

        public void Dispose()
        {
            if (account != null)
                account.Dispose();
            if (session != null)
                session.Dispose();
        }

        public bool createAccountHotmail()
        {
            XMLConfig.Settings sett = new XMLConfig.Settings();

            return XMLConfig.DMProcessConfig.ProcessXML(sett.appPath + "hotmail.xml");
        }
        public bool createAccountGoogle(){
            XMLConfig.Settings sett= new XMLConfig.Settings();

            return XMLConfig.DMProcessConfig.ProcessXML(sett.appPath + "gmail.xml");
/*
            bool bRet = false;
            string strTemp = "";
            strTemp += "<wap-provisioningdoc>\r\n";
            strTemp += "  <characteristic type=\"EMAIL2\" recursive=\"true\">\r\n";
            strTemp += "    <characteristic type=\"{D45D5BE0-B96C-87A5-60B8-A59B69C733E4}\">\r\n";
            strTemp += "      <parm name=\"SERVICENAME\" value=\"Google Mail\" />\r\n";
            strTemp += "      <parm name=\"SERVICETYPE\" value=\"IMAP4\" />\r\n";
            strTemp += "      <parm name=\"INSERVER\" value=\"imap.googlemail.com\" />\r\n";
            strTemp += "      <parm name=\"AUTHNAME\" value=\"YourName@googlemail.com\" />\r\n";
            strTemp += "      <parm name=\"DOMAIN\" value=\"\" />\r\n";
            strTemp += "      <parm name=\"OUTSERVER\" value=\"smtp.googlemail.com\" />\r\n";
            strTemp += "      <parm name=\"REPLYADDR\" value=\"YourName@googlemail.com\" />\r\n";
            strTemp += "      <parm name=\"SMTPALTAUTHNAME\" value=\"YourName@googlemail.com\" />\r\n";
            strTemp += "      <parm name=\"SMTPALTDOMAIN\" value=\"\" />\r\n";
            strTemp += "      <parm name=\"NAME\" value=\"YourName 2011\" />\r\n";
            strTemp += "      <parm name=\"LINGER\" value=\"120\" />\r\n";
            strTemp += "      <parm name=\"RETRIEVE\" value=\"2048\" />\r\n";
            strTemp += "      <parm name=\"KEEPMAX\" value=\"0\" />\r\n";
            strTemp += "      <parm name=\"DWNDAY\" value=\"3\" />\r\n";
            strTemp += "      <parm name=\"FORMAT\" value=\"2\" />\r\n";
            strTemp += "      <parm name=\"AUTHREQUIRED\" value=\"1\" />\r\n";
            strTemp += "      <parm name=\"AUTHSECRET\" value=\"YourPassword\"/>\r\n";
            strTemp += "    </characteristic>\r\n";
            strTemp += "  </characteristic>\r\n";
            strTemp += "</wap-provisioningdoc>";

            return bRet;
*/
        }
    }
}

ご覧のとおり、このクラスは、特定の XML WAP プロビジョニング ファイルによって電子メール アカウントを作成することもできます。

よろしく

ヨーゼフ

ところで: このアプリは、Intermec eMDI テクノロジを使用して、見本市で名刺の特別な写真を作成するように設計されています。これらは、これらのリードを作成するために秘書に直接送信する必要があります。

OK、より単純明快にするために: 1. POutlook を使用できるようにするには、poutlook セッションへの参照が必要です。2. コード経由でメールを送信できるようにするには、poutlook が使用するメール アカウントを指定する必要があります。3. 次に、eMail オブジェクトを作成し、フィールドに入力します 4. 最後に、既存のアカウント オブジェクトで電子メール オブジェクトの send メソッドを使用します

さらに詳細に

セッション オブジェクトを作成する

      OutlookSession session = new OutlookSession();

メール送信に使用するアカウントを指定します。文字列は、定義済みの PocketOutlook 電子メール アカウント名と正確に一致する必要があります。参照用に番号を使用すると、どのアカウントが選択されているか確信が持てなくなります。

      EmailAccount account = session.EmailAccounts[sMailAccount];

返されたアカウントを確認します。ヌルですか?ここで、新しい EMailMessage を作成します (TextMessage(SMS) とは対照的に)

      EmailMessage eMail = new EmailMessage();

次に、EmailMessage オブジェクトのフィールドに入力します

        Recipient rcp = new Recipient(_to);
        eMail.To.Add(rcp);
        eMail.Subject = "Visitenkarten";
        eMail.BodyText = "Enter some eMail text to send";

最後に電子メールを送信します。

     eMail.Send(account); 

poutlook は通常、ある時点でバックグラウンドで電子メールを定期的に送信するため、poutlook にすぐにメールを送信させたい場合があります。その場合は、そのコードを使用できます。

     Microsoft.WindowsMobile.PocketOutlook.MessagingApplication.Synchronize(account);

これにより、poulook は指定されたアカウントの電子メールをすぐに同期するようになりますが、Outlook ウィンドウも前面に表示されます。

これは明確で単純ですか?

于 2012-10-26T14:24:23.443 に答える
0

あなたのコードには何も問題はありません。

GMail サーバーを介して Pocket Outlook からメッセージを送信する方法を調べる必要があります。それが設定されると、コードは正常に動作するはずです。

于 2012-10-25T14:17:31.287 に答える