Sending mail in Windows mobile application in Windows

依然范特西╮ 提交于 2019-12-12 13:22:19

问题


I am new to Windows Mobile Application. In my project, I want to send emails using microsoft.windowsmobile.pocketoutlook. I have the following code so far:

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();
    }
}

With this code, emails appear in the outbox, but never appears in the inbox. Using Gmail, It shows the following message:

Messages could not be sent. Check that you have network coverage, and that your account information is correct, and then try again.

My account information is correct. What is going on?


回答1:


I already use POOM to send eMail from Windows Mobile devices:

I use code to iterate thru the available outlook eMail accounts. The string sMailAccount has the name of the account as displayed in pocketOuttlook, for example "Google Mail":

class code of sendMail class...

    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;
    }
    ...

My code was used to send images to recipients:

    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;
    }

Another issue to know about is that POutlook will not send messages immediately. Therefor I introduced a var called _syncImmediately. If this is true, Outlook will send the message immediately. If not, I offer another function called 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);
        }
    }

The SetForeGroundWindow() is used to bring us back to the application.

Here is the whole class:

    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;
*/
        }
    }
}

As you can see, the class is also able to create eMail accounts by a given XML WAP Provisioning file.

regards

Josef

BTW: the app was designed to make a special photo of business cards at fair using Intermec eMDI technology. These should be then send directly to a secretary to create leads of these.

OK, to make more simple and clear: 1. To be able to use POutlook you need a reference to an poutlook session. 2. To be able to send an email via code, you need to specify the mail account that poutlook has to use. 3. Then create an eMail object and fill the fields 4. Finally use the send method of the email object with the existing account object

In more detail

Create a session object

      OutlookSession session = new OutlookSession();

Specify the account to use for the email sending. The String has to exactly match your defined PocketOutlook eMail account name. If you use a number for reference, you cannot be sure, which account is choosen.

      EmailAccount account = session.EmailAccounts[sMailAccount];

Check the returned account. Is it NULL? Now create a new EMailMessage (in contrast to a TextMessage(SMS))

      EmailMessage eMail = new EmailMessage();

and then fill the fields of the EmailMessage object

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

and finally send the eMail:

     eMail.Send(account); 

as poutlook does normally send eMail in background periodically at some time, you may want to let poutlook send the mail immediately. If so, you can use that code:

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

this will make poulook sync the email of the specified account immediately, but also brings the outlook window to foreground.

Is this clear and simple?




回答2:


There is nothing faulty in your code.

You need to look into how to get a message to send from Pocket Outlook through the GMail Server. Once that is set, your code should work fine.



来源:https://stackoverflow.com/questions/13048272/sending-mail-in-windows-mobile-application-in-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!