2011-07-20 8 views
7

私は現在、パースペクティブ受信者にpdfバウチャーと電子メールを生成するアプリケーションを作成しています。しかし、私が使用する機能はクライアント依存(MS Outlook)であり、私たちが多くの顧客を抱えていて、Outlookを使用しているわけではないので、この電子メールクライアントを不可知論者にしたいと思っています。添付ファイル付きのメールを送信するクライアント不可知論者

私はいくつかのオプションを見てきましたが、私の問題を解決するような検索では本当に何も見つかりません。

クライアントに関係なく、顧客のsmtp接続を使用してメールを送信し、クライアントに直接電話せずに添付ファイルを送信する良い方法を知っている人はいますか?

答えて

5

また、newest snapshotにあるSMTPを使用してメールを送信する場合は、Synapseライブラリを使用することができます。ここで

は、ログインloginとパスワードpasswordsmtp.server.com[email protected]から[email protected]に添付c:\voucher.pdfファイルでメールを送信する必要がありますコードです。 TMimeMessクラスの残りの機能については、the referenceに直接お問い合わせください。

私が使用しているはるかに複雑なコードを簡略化してローカライズしているため、これを検証したりコンパイルすることはできません。そうでない場合、のはそれをdownvoteてみましょう:)

uses 
    SMTPSend, MIMEPart, MIMEMess; 

procedure TForm.SendEmailClick(Sender: TObject); 
var 
    MIMEText: TStrings; 
    MIMEPart: TMimePart; 
    MIMEMessage: TMimeMess; 
begin 
    MIMEText := TStringList.Create; 
    MIMEText.Add('Hello,'); 
    MIMEText.Add('here is the text of your e-mail message,'); 
    MIMEText.Add('if you want the HTML format, use AddPartHTML'); 
    MIMEText.Add('or e.g. AddPartHTMLFromFile if you have your'); 
    MIMEText.Add('HTML message content in a file.'); 

    MIMEMessage := TMimeMess.Create; 

    with MIMEMessage do 
    try 
    Header.Date := Now; 
    Header.From := '[email protected]'; 
    Header.ToList.Clear; 
    Header.ToList.Add('[email protected]'); 
    Header.CcList.Clear; 
    Header.Subject := 'E-mail subject'; 
    Header.XMailer := 'My mail client name'; 

    MIMEPart := AddPartMultipart('mixed', nil); 

    AddPartText(MIMEText, MIMEPart); 
    AddPartBinaryFromFile('c:\voucher.pdf', MIMEPart); 

    EncodeMessage; 

    if SendToRaw(Header.From,    // e-mail sender 
       Header.ToList.CommaText, // comma delimited recipient list 
       'smtp.server.com',   // SMTP server 
       Lines,      // MIME message data 
       'login',     // server authentication 
       'password')    // server authentication 
    then 
     ShowMessage('E-mail has been successfuly sent :)') 
    else 
     ShowMessage('E-mail sending failed :('); 
    finally 
    Free; 
    MIMEText.Free; 
    end; 
end; 


更新:

Downvoter step into the lightから素敵なコメント(男性、あなたのニックネームはしてください変更によると、それはもうクールではないです:)、本当に悪いだろうすべての受信者のリストを全員に送信する場合。シナプスでは、メッセージヘッダにBCCを追加します。you cannotMIMEMessageにはHeader.BCCListというプロパティはありません。 代わりに、データを送信する前に直接変更することができます。

// First, you will remove the line where you are adding a recipient to the list 
Header.ToList.Add('[email protected]'); 

// the rest between you can keep as it is and after the message encoding 
EncodeMessage; 

// and before sending the mail you'll insert the line with BCCs 
Lines.Insert(1, 'Bcc: [email protected], [email protected]'); 

if SendToRaw ... 
+0

私はこのルートにショットをつけます。参照は問題になることはありません。アプリケーションは、受取人にのみ伝票を送信します。プログラムは10-15の異なるバウチャーを生成し、顧客の顧客に電子メールで送信します。全体のプロセスで1人の受信者。 Outlookを使用した現在の実装は、魅力のように機能しますが、すべてがOutlookを使用しているわけではありません。 – JamesW

1

システムデフォルトの電子メールクライアントとは独立して、​​をSMTPクライアントとして使用できます。添付ファイルのないメールを送信する場合はdemo、添付ファイルの有無にかかわらず、HTMLまたはプレーンテキストの電子メールを送信する場合はherehereの詳細な記事があります。

+0

しかし、それはユーザーの電子メールクライアントと統合されません(つまり、彼は送信された電子メールを追跡することができません)。 –

+2

@レオナルドもちろん、それは統合されません。それがMAPIを試す必要がある場合、[JCL](http://sourceforge.net/projects/jcl/)には 'JclMapi'がありますが、すべての電子メールクライアントが正しくサポートするわけではありません。 –

+4

@レオナルド:ジェームズはプログラムではなくプロトコルであるSMTPを求めました。 Indyには、SMTPプロトコルに直接アクセスするTIdSMTPコンポーネントがあり、TIdSMTP *はクライアントであるため、他の電子メールクライアントは必要ありません。送信された電子メールを追跡したい場合は、手動で行う必要があります(IMAP4プロトコル経由で電子メールサーバーに接続する(TIdIMAP4コンポーネントを参照して、電子メールを目的のフォルダにアップロードするなど)。 –

0

あなたが(例えば、電子メールクライアントのフォルダなど、sent itemssentに送信されたメッセージを参照してください)既存の電子メールクライアントと統合したい場合は、Simple MAPIを使用することができます。ヘッダーはDelphiのMapiユニットで翻訳されています(少なくともD2007では)。

実際のクライアントがSimple MAPIをサポートしているかどうかを確認することに注意してください。

+0

リンクされたSimple MAPIページに関する重要な情報:「Simple MAPIの使用はお勧めしません。それ以降のバージョンのWindowsでは変更されているか利用できません。 " – mjn

+0

@mijn:右。私はそれに気付かなかった。うーん...私は新しい仕事が来るのを見る... – Toto